Я решил поэксперементировать и реализовать некое сущестово, которое осущ. поиск еды на матрице.
В принципе все легко, но я решил сделать с минимум хода то есть без правил левой-правой ноги, обхода спиралью и тд.
Я заполнил матрицу едой и сделал массив из 4 функций: право, лево, верх и вниз.
По моему условию животное "слепое" те не видит, где еда.
Пока я сделал след. :наугад берется команда если она выполнена успешно(не врезались в стену) и
съедена еда, то команда выполняется еще раз(мне кажется что это логично и для простейшего существа).
Если стена или нет еды выберается наугад команда, пока не найдем еду. Так же я пытался записываь команды которые привели к нахождению еды и если ннет еды то выполнять их.
Сам вопрос, какой алгоритм поиска пищи у насекомых или какие нибудь идеи.? Я искал про муравьев, но увы не нашел,
хотя искал не очень долго. У меня есть пару мыслей : к примеру помечать клетки, где мы оно было и если встретили их идти от них до стены... бррррр бред.Ведь насекомые вроде не дигаются спиралью от центра норки ?
ps
Самое главное, что оно слепое, и без обояния. но с памятью на команды.
Вообще http://pages.csam.montclair.edu/%7Ebredlau/ants.html решается с помощью http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC управления муравьишькой.
Порождаются всевозможные перемещения муравья и генетическим методом обнаруживается наиболее удачные (в плане нахождения еды).
Честно говоря, не совсем понятна цель данного мероприятия.
Если с целью поэкспериментировать с алгоритмом поведения, то целесообразно, навыерное, сделать основную программу, служащую для управления , инициализации и визуализации, к которой подключать dll-ку, где, собственно, и описывать поведение. Желательно предусмотреть несколько муравьев с несколькими dll-ками и смотреть, кто их них выживет.
Но в целом я согласен с Lapp: возможности муравья слишком сильно урезаны, чтобы можно было надеяться получить что-нибудь интересное.
Я бы сделал муравью всетаки область видимости/унюхиваемости например относительно муравья на n клеток вверх вниз влево и вправо (фактически квадрат n*n), а из этой области уже выбирал бы клетку с едой к которой нужно отправиться и съесть ее, можно выбирать например самую ближнюю или случайно выбранную или еще как-нибудь, в случае если в области видимости нету еды, то совершить рандомный шаг в любую соседню клетку.
Мне кажется "видимость" и "унюхиваемость" нужно реализовывать по-разному.
Видимость - примерно, как описано. Возможно, с кругом вместо квадрата. И с увеличивающейся с радиусом погрешностью.
А унюхиваемость: по всему полю считается потенциал еды - от каждой клетки "запах" распределен по Гауссу с дисперсией существенно больше радиуса видимости. И вектор градиента по нему - это и есть унюхиваемость.
Да, чуть не забыл: по полю должны быть разбросаны таблетки, увеличивающие (хотя бы временно) радиус видимости.
Графически я реализовал в первую очередь, опирясь на советы к теме fool. Действительно, так гораздо легче
отлаживать и етстировать и ... много еще.
Я думаю тогда реализую муравья как обьект с методами(вспомнил : птицы летают, но пингвин тоже птица),
пока для начала он у меня запись.
А насчет чувств я тоже думал о 1клеточных, как сапожок реагирует на свет , зря я его так( но интересно
можно ли как нибудь без них. )
Думаю сделать сначало "зрение" , а потом нюх. Хотя в био. было наоборот(кажется). Если все получится можно будет скомбинировать на дальних растояниях нюх, потом зрение.
andriano мог бы чуть подробние про :
renesko1, ты задавай конкретные вопросы, иначе непонятно, что именно подробнее.
Насчет пули - не знаю, я имел в виду нормальное распределение.
Генетический алгоритм, думаю, здесь если и пытаться использовать, то лишь на ГОРАЗДО более поздних стадиях, когда уже сложится впечатление, что следует задавать на входе, и чего ожидать на выходе.
Ясно. Я про "распределение по Гауссу с дисперсией". Можешь в 2 словах, если не сложно.
Что именн представляет данный метод ? И где еще можно его использовать ?
http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5 это то ?
а то мне не очень понятно. Хотя бы на бытовом уровне.
А про пулю вот http://ru.wikipedia.org/wiki/%D0%9F%D1%83%D1%88%D0%BA%D0%B0_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0
Ну, примерно так:
1. Задаешься радиусом видимости (для примера 3 клетки в каждую сторону).
2. Задаешься, во сколько раз радиус "унюхиваемости" больше радиуса видимости (например, в 2.5-3 раза).
3. Вычисляешь СКО (в данном случае 8 клеток).
4. Делаешь для распределения массив весов:
4.1. Заводишь двумерный массив по 3 СКО в каждую сторону от середины, т.е. 49х49 (3*8 + 1 + 3*8).
4.2. Вычисляешь интеграл для каждой ячейки по формуле в зависимости от радиуса (расстояния до центральной ячейки).
4.3. При необходимости - нормируешь, но, думаю, в данном случае не нужно.
5. Массив весов готов.
Для вычисления потенциала:
1. Заводишь вспомогательное поле размером равное полю, по которому будут бродить муравьи (вещ.тип).
2. Перед началом вычисления очищаешь поле (обнуляешь).
3. Пробегаешь по всем клеткам основного поля. Если есть еда, то прибавляешь к полю потенциала вспомогательное поле, отцентрировав его по рассматриваемой ячейке, и домножив на количество еды.
4. В полученном поле находишь градиент в тех точках, где расположены муравьи. В принципе, для оптимизации можно и потенциал вычислять только в окрестностях этих точек (+/- одна ячейка).
Для пояснения приведу одномерный пример.
Пусть у нас Гаусс: 0 1 2 5 2 1 0
Пусть поле имеет ширину 10 клеток и в нем в точке 4 расположено 2 ед. еды, а в точке 8 - 3 единицы.
Обнуляем: 0 0 0 0 0 0 0 0 0 0
От 4-й точки: 0 0 2 4 10 4 2 0 0 0
От 8-й точки: 0 0 0 0 0 0 3 6 15 6
Суммируем: 0 0 2 4 10 4 5 6 15 6
Те берем и делаем квадрат 3*3(пример) центр 3 переферия 2.
В центре 2 ед. еды. --> центр 6. Переферия 4.
В движение чувствуем 4. От нее находим 6. И Находим еду.
Следовательно я делаю 3 карты. 1 визуальная + движение.
2 для обояния. 3 зрение.
Мур. обзаведется направлением головы (для зрения)
И 3 командами: шаг вперед, поворот влево/вправо.
Andriano , спасибо хорошо обьясняешь.
Не совсем понял, что ты собираешься делать.
Карты, думаю, достаточно одной, просто в каждой ее ячейке будет структура, например:
- количество еды,
- проходимо или нет,
- потенциал еды (для обоняния),
- что-то еще.
Не понял, что значит "В движение чувствуем 4. От нее находим 6"
Мы анализируем потенциал в точке, где находится муравей и соседних с ней. По этим точкам находим градиент - т.е. с какой стороны сильнее всего пахнет едой.
Зрение может быть либо секторным (с учетом поворота головы), либо круговым (без учета).
На основе как зрительной, так и обонятельной информации принимаем решение, куда двигаться. Если зрение секторное, то на основе обоняния также принимаем решение о повороте головы. Кстати, у муравья, IMHO, длолжна быть локальная память. Т.е. хотя поворот головы и занимает некоторое время (кстати, это имее смысл только в условиях конкуренции), он помнит то, что видел раньше. Т.е. это еще один массив.
Насчет сооотношения между СКО и радиусом видимости я уже говорил раньше - это чтобы еду можно было почуять, пока она еще не видна.
Со структурой ты здорово придумал. Зрение секторное. Обояние круговое. R(нюха) > r(зрения)
Что значит "находим"?
"Находим" - это один шаг или цепочка шагов. Если один - то неправильно. Градиент задает направление и, если мы ориентируемся на запах, то двигаемся в этом направлении. Но лучше сперва повернуть голову и посмотреть.