Автор работы: Пользователь скрыл имя, 06 Октября 2013 в 12:41, лабораторная работа
Искусственная жизнь (Artifical life) - это понятие, введенное Крисом Лангтоном
(Chris Langton) для обозначения множества компьютерных механизмов, которые
используются для моделирования естественных систем. Искусственная жизнь применяется для моделирования процессов в экономике, поведения животных и насекомых, а также взаимодействия различных объектов.
Искусственная жизнь представляет собой целую науку с множеством
аспектов. Мы рассматривали одно из ее направлений - синтетическая наука о по-
ведении (Synthetic ethology). Ее очень четко описывает
Рассмотрим пример итерации для агента, связанной с выбором действия.
В данном примере будет описано травоядное животное, которое развивается в ходе
симуляции. Этому агенту удалось выжить в среде в течение 300 единиц времени,
поскольку он находил и поедал растения, а также избегал хищников. На рис. 6 представлена нейронная сеть этого агента.
Травоядное
на переднем
плане
Хищник
на переднем
плане
Растение
на переднем
плане
Травоядное
слева Повернуть
налево
Хищник
слева
Растение Повернуть
слева направо
Травоядное
справа
Хищник
справа
Съесть
Растение
справа
Близость Нейронная сеть по принципу
травоядного «победитель получает все»
Близость
хищника
Близость
растения
Рис. 6. Нейронная сеть травоядного животного
Сплошные линии в нейронной сети являются возбуждающими соединениями, а пунктирные линии - запретными соединениями. В выходных ячейках находятся смещения, которые применяются к каждой выходной ячейке при ее активации. Возбуждающее соединение существует для действия «есть» при условии что в области «близости» находится растение (растение можно съесть только в том случае, если оно находится вблизи от агента). Не менее интересно запретное соединение для действия «движение», которое срабатывает, когда в области «фронт» находится хищник. Это еще одно важное условие для выживания травоядного.
Действия агента не формируются только одним соединением. Вместо этого срабатывает действие с наибольшим весом (на основании комбинации входов сенсоров). Рассмотрим несколько итераций для травоядного животного, описанных нейронной сетью на Рис. 6.
Вспомним (уравнение 1), что вектор весов (для определенного действия) умножается на вектор входов, а затем добавляется смещение.
В первом примере травоядное животное рассматривается в ситуации, которая показана на Рис. 7. На этой сцене символ «X» обозначает положение травоядного (его точку на сцене). Растение расположено в области «близости», а хищник -в области «фронт».
|
С |
|||
Р |
||||
Х |
Влево |
= 1+ 0 = 1 |
Вправо |
= 0 + -1 = -1 |
Двигаться |
= 1 + -1 = 0 |
Съесть |
= 0 + 1 = 1 |
HF |
CF |
PF |
HF |
CL |
PL |
HR |
CR |
PR |
HR |
CR |
PP | ||
Веса влево |
= |
{1, |
0, |
0, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса вправо |
= |
{0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
0, |
-1} |
Веса двигаться |
= |
{0, |
-1, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса съесть |
= |
{1, |
0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
1} |
Смещения влево |
= 1 |
Смещения вправо |
= 0 |
Смещения двигаться |
= 1 |
Смещения съесть |
= 0 |
Входы = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
Рис. 7. Травоядное животное
во время
Сначала необходимо оценить сцену, Подсчитывается количество объектов
каждого типа во всех четырех зонах. Как показано на Рис, 7, веса и входы помечены по принципу тип/зона (HF обозначает «фронт для травоядного», CF – «фронт для хищника», РР – «растение в области «близости» и т.д.). В этом примере: входной вектор имеет значения, отличные от нуля, только в двух элементах: хищник в области «фронт» и растение в области «близости».
Чтобы определить, какое действие выбрать, нужно умножить входной вектор на вектор весов для определенного действия, а затем добавить относительное смешение. Этот процесс показан на Рис. 7. Выбор поведения определяется действием с наибольшим значением. В данном примере программа берет наибольшее значение, которое появилось последним. При этом выполняется действие «есть» (нужное действие для текущей сцены).
Растение съедено, и оно исчезает со сцены. Окружающая среда изменилась,
и перед травоядным животным предстает сцена, показанная на рис. 8.
|
С |
|||
|
||||
Х |
Влево |
= 1+ 0 = 1 |
Вправо |
= 0 + 0 = 0 |
Двигаться |
= 1 + -1 = 0 |
Съесть |
= 0 + 0 = 0 |
HF |
CF |
PF |
HF |
CL |
PL |
HR |
CR |
PR |
HR |
CR |
PP | ||
Веса влево |
= |
{1, |
0, |
0, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса вправо |
= |
{0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
0, |
-1} |
Веса двигаться |
= |
{0, |
-1, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса съесть |
= |
{1, |
0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
1} |
Смещения влево |
= 1 |
Смещения вправо |
= 0 |
Смещения двигаться |
= 1 |
Смещения съесть |
= 0 |
Входы = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Рис. 8. Травоядное животное во время
Сцена оценивается заново, причем растения больше нет, а хищник остался. Это видно по входам. Программа еще раз рассчитывает выходные ячейки нейронной сети, умножая значения сигналов входного вектора на соответствующий вектор весов. В этом случае наибольшее значение ассоциируется с действием «влево». Учитывая данную ситуацию, это и есть наилучшее действие.
Наконец, на Рис. 9 представлена последняя итерация. Обратите внимание, что поле зрения агента изменилось, поскольку в предыдущей итерации он выбрал другое направление движения. С учетом изменений в сцене были переопределены и входы. Теперь хищник находится в области «справа», а нев области «фронт».
При расчете выходных ячеек получается, что действие «идти» имеет самое большое значение и, что более важно, является последним. Поведение травоядного позволяет ему отыскивать и поедать пищу, а также избегать хищника, который находится в поле зрения. Демонстрация нейронной сети травоядного наглядно показывает, почему оно смогло прожить в среде в течение длительного времени.
С | ||
Х | ||
Влево |
= 1+ 0 = 1 |
Вправо |
= 0 + 0 = 0 |
Двигаться |
= 1 + 0 = 1 |
Съесть |
= 0 + 0 = 0 |
HF |
CF |
PF |
HF |
CL |
PL |
HR |
CR |
PR |
HR |
CR |
PP | ||
Веса влево |
= |
{1, |
0, |
0, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса вправо |
= |
{0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
0, |
-1} |
Веса двигаться |
= |
{0, |
-1, |
0, |
0, |
1, |
0, |
0, |
0, |
0, |
0, |
0, |
0} |
Веса съесть |
= |
{1, |
0, |
0, |
0, |
0, |
-1, |
-1, |
0, |
0, |
0, |
0, |
1} |
Смещения влево |
= 1 |
Смещения вправо |
= 0 |
Смещения двигаться |
= 1 |
Смещения съесть |
= 0 |
Входы = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
Рис. 8. Травоядное животное во время
Есть общий класс. В нем находятся структуры, содержащие данные о растениях, травоядных и хищниках, а также структура их координат.
struct coord // структура координат
{
int x;
int y;
};
struct carns // структура хищников
{
coord cc; // координаты расположения
int cond; // направление взгляда (1 – вверх, 2 – вправо, 3 – вниз, 4 – влево)
int id; // уникальный порядковый номер
int energy; // уровень энергии
};
struct herbs // структура травоядных
{
coord cc;
int cond;
int id;
int energy;
};
struct plant // структура растений
{
coord cc;
int cond;
int id;
int energy;
};
int carcnt; // количество хищников
int hercnt; // количество травоядных
int plcnt; // количество растений
int iterations; // число итераций
Рис. 9. Внешний вид программы
Слева находится поле на котором будет отображаться процесс взаимодействия растений, травоядных и хищников. Правее окно в котором показывается энергия растений, травоядных и хищников. В правой части окна кнопки создания растений, травоядных и хищников: «Plant», «Herbivore», «Carnivore» соответственно.
Кнопка «Move» начинает работу программы (запуск таймера). Кнопка «Stop» останавливает работу программы (остановка таймера).
Также справа внизу отображается количество итераций, начинаемых с нажатия кнопки «Move». Кнопка «ReDraw» вызывает функцию перерисовки. Кнопка «Paint» функцию рисования поля.
При нажатии на кнопки создания объектов генерируются случайным образом координаты создаваемого объекта и вызываются функции CheckBirthPlants, CheckBirthHerbs, CheckBirthCarns, в которые подаются координаты. Это подобные функции, опишем CheckBirthHerbs – создание травоядных.
void H::CheckBirthHerbs(CDC *DC2, herbs *her, int x, int y, int cnd, int mod, int modbool, int cntcall)
{
int nn = 1+rand() % 21;
int mm = 1+rand() % 21;
if (hercnt>=1)
{
for (int ih=0; ih<hercnt; ih++)
{
if (her[ih].cc.x == x && her[ih].cc.y == y)
{
x=x-1;
if (x<1) x=21;
if (x>21) x=1;
if (y<1) y=21;
if (y>21) y=1;
modbool=1;
}
}
}
if (modbool==1)
{
cntcall++;
if (cntcall>21 && cntcall<400)
{
CheckBirthHerbs(DC2, her, nn, mm, cnd, mod, 0, cntcall);
}
else CheckBirthHerbs(DC2, her, x, y, cnd, mod, 0, cntcall);
}
else
{
AddHerbs(her, x, y, cnd);
RectDC(DC2, x, y, cnd, mod);
}
}
Эта функция имеет параметры: