Подтвердить что ты не робот

Простой AI - JavaScript (с использованием jQuery для анимации)

Во-первых, я хотел бы сообщить вам, что я программировал в течение нескольких лет (в основном на языках C, iOS-разработке, веб-материалах и т.д.) в качестве хобби, и теперь я заинтересован в создании простого AI (большинство людей начинают с игры tic tac toe yes, но я заинтересован в создании чего-то, используя принципы генетического программирования). Причина, по которой я хотел бы, чтобы читатели узнали об этом, потому что я был бы признателен, если бы ответы были не слишком сложными (не слишком сложно понять ребенка, так как я еще не учился в курсах по компьютерным наукам).

Вот моя цель:

Условия

органов: CSS div
население: группа организмов (5 или 10)
источник пищи: другой CSS div

Процесс

  • Сгенерирована популяция, каждая из которых сначала обладает теми же фенотипическими атрибутами, но отличается своими навыками (для этого, скоростью).
  • Создается один источник пищи (каждый раз каждый раз)
  • Примерно через 5 секунд после настройки окружающей среды (шаги 1 и 2) население организмов должно найти способ получить доступ к источнику питания на конкурсной основе.
  • Только один организм может достичь пищевого продукта. По достижении этого, окружающая среда reset, за исключением организма, который нашел продовольственный предмет в предыдущий раз, теперь получил выгоду, и его уровень скорости может увеличиваться, в то время как другие, особенно ужасные, могут становиться еще медленнее или прекращаться.
  • Процесс повторяется; пользователь может наблюдать черты населения и видеть, какие из них следуют эволюционно и т.д.

Дополнительная информация

Итак, как вы можете видеть, вышеупомянутые шаги почти имитируют эволюцию, но очень просто (меньше условий по сравнению с реальными жизненными ситуациями для животных); Вот почему я спрашиваю здесь: я полностью потерян. Я действительно не знаю, с чего начать (за исключением генерации населения, я, скорее всего, сделаю это, а также получаю их для перемещения через анимацию jQuery). Но возможность привлечь их к источнику питания - это то, что я не могу сделать прямо сейчас. Поэтому я бы хотел, чтобы это было направлено в правильном направлении.

4b9b3361

Ответ 1

Живой пример

Будем предупреждать, что для рендеринга используется Raphael и underscore для семантического сахара.

Я написал очень маленькую программу, которая соответствует вашим требованиям. (Это было весело).

1 Создается популяция, каждая из которых сначала обладает теми же фенотипическими атрибутами, но отличается своими навыками (для этого, скоростью).

var Critter = function() {
    // default the speed to something random.
    this.speed = SPEED + Math.random()*SPEED;

    // logic module
    var logic = function() { ... }
}

...
// initialize an array of critters.
critters: _.map(_.range(0,COUNT), function() {
    return new Critter;    
})

Создайте функцию-конструктор для вашего члена популяции, затем заполните массив этих парней. Я сопоставил массив длины с массивом тварей. (Cheeky for loop).

Каждый созданный вами твари будет похож, но имеет разные навыки (на основе Math.random()), но они будут содержать одну и ту же логическую единицу.

2 Создается один источник пищи (каждый раз каждый раз)

// trivial Food object.
var Food = function() {
    // rectangle with random x, random y, and SIZE as width / height
    this.el = paper.rect(Math.random()*WIDTH, Math.random()*HEIGHT, SIZE, SIZE);    
};

Конструктор объекта пищи просто помещает квадрат случайно на экран

3 Примерно через 5 секунд после создания окружающей среды (шаги 1 и 2) населенность организмов должна найти способ получить доступ к источнику питания на конкурентной основе

Настройка среды вверх:

_.invoke(this.critters, "start", this.food.el.getBBox(), out_of_bounds);

Для каждого критерия вы вызываете свой метод запуска.

this.start = function(food) {
    // create a player (circle);
    this.el = paper.circle(Math.random()*WIDTH, Math.random()*HEIGHT, SIZE / 2);  
    // set an interval to run the logic over and over.
    loop = setInterval(_.bind(logic, this, food), 25);    
};

Каждый критнер просто помещает себя случайно на экран, а затем повторяет свою логику снова и снова в цикле.

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

var logic = function(food) {
    // if you hit food you win
    if (this.el.collision(food)) {
        this.win();
    }
}

// you won
this.win = function() {
    console.log("win");
    // increase speed
    this.speed += Math.random()*5;  
    // end round
    Game.end();
};

Критерий определит, имеет ли он питание в логическом контуре. Как только у него есть еда, он называет свой собственный метод выигрыша. Это завершает текущий раунд игры.

Когда победитель получает выигрыш, он получает повышение скорости.

Игра перезапустится, когда вы вызываете .end (после удаления всех существующих тварей)

end: function () {
    // tell all critters to end their round
    _.invoke(this.critters, "remove");
    // remove the food
    this.food.el.remove();
    // start again !
    this.start();
},

5 Процесс повторяется; пользователь может наблюдать черты населения и видеть, какие из них следуют эволюционно и т.д.

Посмотрите живой пример:)

6 Что дальше:

  • Изменение глобальных номеров и других жестко закодированных номеров
  • Внедрить некоторые AI в функции logic.
  • Пройдите все jsfiddles от /1 до/180 и посмотрите, как он был создан.
  • Пожаловаться на комментарии недостаточно детально
  • Бросьте мой код и начинайте с нуля теперь, когда вы видели пример.
  • Код рождения просто создает "базового" критерия. Он не размножается из двух существующих тварей и не обладает повышенными навыками. Это означает отсутствие эволюции.

Bonus:

Путешествия по еде

Предупреждение:. Вышеупомянутая ссылка действительно путешествует по еде, но она делает что-то неправильно, там есть хитроумная ошибка. Я не думаю, что закончу это.

Я объясню логику движения к пище

    // angle between critter and food
    var angle = Raphael.angle(
        this.el.getBBox().x,
        this.el.getBBox().y,
        food.x,
        food.y) - 135; // the 135 is the default direction (bottom right)
    // get a random speed
    var rand = Math.random()*this.speed;
    // travel towards the food box by rotating your vector by the angle
    var points = this.rotateVector([rand, rand], angle);

    // move towards the box
    this.el.translate(points[0], points[1]);

Первый rand создает случайный вектор, который выглядит так:

enter image description here

Math.random() определяет, насколько далеко/быстро движется твиттер. Это указывает на правый нижний угол.

Поскольку он указывает на правый нижний угол, мы должны удалить 135 градусов от угла для этого вектора

enter image description here

Затем мы должны вычислить угол между критерием и пищей. Мы делаем это, переходя в две точки на Raphael.angle и вычисляя для нас угол.

enter image description here

Теперь у нас есть угол, и мы хотим повернуть наш вектор движения на этот угол. Вектор движения в настоящее время направлен вверх (черный), и мы хотим повернуть его под углом к ​​новой позиции (красный). В коде это this.rotateVector

enter image description here

Теперь указывали в правильном направлении! Мы можем просто вызвать this.el.translate(points[0], points[1])

Ответ 2

Вы должны разбить свою проблему на две части:

Часть 1: организмы должны иметь возможность двигаться к определенной вами точке. Для чего потребуется таймер, а некоторые математики для определения координат вы должны перемещать каждый организм, чтобы сделать его на один шаг ближе к своей цели для каждого тика таймера.

Google должен быть в состоянии помочь вам в поиске математики для выполнения этой работы.

Часть 2: организмы должны выбрать источник пищи (возможно, самый близкий) и мишень, а затем использовать способ передвижения, описанный в части 1.

Чтобы сделать это, вы можете хранить каждый ваш организм и источники пищи в массивах. Затем, во время каждого тика таймера, проведите петлю через ваши организмы, а затем внутри этого цикла проведите через источники пищи, ища ближайший.

Снова математику для определения расстояния между двумя наборами координат можно найти в Google.

Я не думаю, что могу описать этот материал проще, чем у меня, но, надеюсь, это дает вам представление о том, в каком направлении идти.

Ответ 3

Вы можете посмотреть на различные реализации Conway LIFE для вдохновения. Я полагаю, вы уже видели что-то подобное?

Интересное чтение: Сотовые автоматы