.
Моделирование сознания. Урок 11. Новые стратегии поведения.
Автор megabax   
14.04.2024 г.
unit AIObj

Моделирование сознания. Урок 11. Новые стратегии поведения.

Что бы смотреть урок полностью и скачать исходники, подпишитесь на платный раздел.

В платном разделе статья находиться здесь.


В прошлой статье было описано создание модуля поиска пищи и избегания опасностей. Сейчас будем улучшать эти модули. Начнем с модуля избегания опасностей. В класса DangerAvoiding  добавим поле lock_threahold:

 

        /// <summary>

        /// Порог, определяющий, что робот запертый

        /// </summary>

        private int lock_threahold = 14;

Это поле нужно для функции, которая будет определять а не заперт ли робот. Она будет сравнивать сигналы сенсоров с этим порогом, если хоть один сенсор показал значение ниже - есть куда идти:

        /// <summary>

        /// Робот заперт в ловушке

        /// </summary>

        /// <param name="sensors">Показание сенсоров</param>

        /// <returns>true - да, false - нет</returns>

        public bool is_locked(int[] sensors)

        {

            foreach (int item in sensors)

            {

                if (item < lock_threahold) return false;

            }

            return true;

        }

Что будет делать робот в противном случае? Ломать стены, он это может, если их прочность менее 1. Но если ломать стену не надо (на это тратится энергия) то робота надо остановить, если он движется к стене. Для этого предусмотрим вот этот метод:

...

...

Теперь займемся блоком поиска еды. Пусть робот ищет где подзарядиться не случайным блуждаем, а двигаясь по спирали. Если наткнется на стену, то некоторое время ищет случайным блужданием, затем снова запускает с самого начала движение по спирали. Если мы хотим реализовать такой алгоритм, то нам не нужно удалять стратегию случайного блуждания, надо лишь выделить ее в отдельный модуль. Для этого отдельного модуля мы создадим класс, который назовем RandomWalk. но так как у нас будет не одна стратегия поведения, то логичнее сделать у всех стратегий общий класс предок, назвав его, например, Behavior:...

...

...

И также внесем изменения в метод step():

        /// <summary>

        /// Шаг моделирования

        /// </summary>

        /// <param name="sensors">Сигналы с сенсоров</param>

        public void step(int[] sensors)

        {

            food_searcher.active = _energy_level < 70;

            food_searcher.step(drive);

            temp.step();

        }

Все, теперь мы можем протестировать:

Моделирование сознания. Урок 11. Новые стратегии поведения.

сравним со случайным блужданием:

Моделирование сознания. Урок 11. Новые стратегии поведения.

Итак, стратегии поведения "случайное блуждание" и "движение по спирали" реализованы и протестированы. Теперь займемся алгоритмом поиска еды, класс FoodSearcher. К нему мы добавим ряд полей: ...

...

...

... и изменим конструктор:

        /// <summary>

        /// Конструктор по ссылке на привод

        /// </summary>

        /// <param name="a_driver">Ссылка на привод</param>

        public FoodSearcher(Drive a_drive)

        {

            drive = a_drive;

            random_walk = new RandomWalk(drive);

            helix_walk = new HelixWalk(drive);

            active_behavior = helix_walk; //по умолчанию движение по спирали

        }

Также придется переделать у него и метод step(): ...

...

...

...

Поведения робота стало чуть-чуть более интеллектуальным. Однако, как показали испытания, данный алгоритм в условиях, когда вокруг много препятствий и мало еды, достаточно далек от оптимального: очень часто робот переходит в режим RandomWalk и все начинает с сначала. Но улучать мы его будет уже в следующих уроках.