Добавлен Ambruziy
Добрый вечер форумчане!
Недавно вечером я сидел и, как обычно, потихоньку делал свой проект. Проект в моем представлении весьма достойный, но на деле пока практически нулевой. Задача была мной поставлена такая: сделать этакий Hero Defence, проработанный до мелочей, с отличной историей и прочим, и т.д. Не важно. Но вот захотелось мне сделать для волн нападающих достойный ИИ, как собственно и для волн, помогающих защитить что-либо.
До этого я много раз пытался, иногда вполне неплохо, делать такого рода ИИ. Но все, что было раньше - все должно меркнуть, перед новым ИИ. Читал кстати у нас на форума статейки, был даже вполне неплохой вариант (увы не вспомню как называлась карта и кто ее сотворил, было еще явно до 1.24 версии).
Суть в следующем. Нужно сделать не просто ИИ, который выбирал бы более приоритетные слабозащищенные и уязвимые цели, не просто пытался сбивать касты и держать в контроле ДД союзной команды, но и умело передвигаться по полю боя, заходить за спины, уходить от потенциально опасных противников и т.д.
Цель была понятна, сел изучать литературу. Изучал 2 дня (конечно, мало для такой темы, но начало положено) , сидел, корпел, пил кофе и вставлял спички в глаза. Признаться узнал, что все, что я делал под названием "ИИ" было не больше, чем игрушка ребенка.
Собственно и вопрос таков: есть ли у кого опыт создания хороших ИИ? Что вы для этого использовали? Использовали ли вы только Дерево принятия решений и FMS (конечные автоматы) или же возможно (ну а вдруг) кто-либо интегрировал в кодинг нейронные сети? Конечно, любому картостроителю хотелось бы, чтобы его "ребенок" обучался :) Возможно кто-то пользовался методом "Цепей Маркова"? (вот уж не знал, что их изучение в универе может пригодиться и тут)
Буду безгранично благодарен любому отписавшемуся здесь! Позже, если тема все же будет интересна, выложу примерный алгоритм того, что должно быть (в виде конечных автоматов).
Если когда-нибудь (уповаю) я доделаю свой проект, всех без исключения добавлю в благодарности
Всем спасибо и хороших выходных господа!
Суть в следующем. Нужно сделать не просто ИИ, который выбирал бы более приоритетные слабозащищенные и уязвимые цели, не просто пытался сбивать касты и держать в контроле ДД союзной команды, но и умело передвигаться по полю боя, заходить за спины, уходить от потенциально опасных противников и т.д.
Цель была понятна, сел изучать литературу. Изучал 2 дня (конечно, мало для такой темы, но начало положено) , сидел, корпел, пил кофе и вставлял спички в глаза. Признаться узнал, что все, что я делал под названием "ИИ" было не больше, чем игрушка ребенка.
Собственно и вопрос таков: есть ли у кого опыт создания хороших ИИ? Что вы для этого использовали? Использовали ли вы только Дерево принятия решений и FMS (конечные автоматы) или же возможно (ну а вдруг) кто-либо интегрировал в кодинг нейронные сети? Конечно, любому картостроителю хотелось бы, чтобы его "ребенок" обучался :) Возможно кто-то пользовался методом "Цепей Маркова"? (вот уж не знал, что их изучение в универе может пригодиться и тут)
Буду безгранично благодарен любому отписавшемуся здесь! Позже, если тема все же будет интересна, выложу примерный алгоритм того, что должно быть (в виде конечных автоматов).
Если когда-нибудь (уповаю) я доделаю свой проект, всех без исключения добавлю в благодарности
Всем спасибо и хороших выходных господа!
Принятый ответ
Сейчас как раз делал ИИ для демки. Циклы для подобного - полная жопа. Пытался детерминировать логику максимально, но всеравно выходили либо зацикливания (один тик я хочу пассать, один тик я бегу от гопников, а потом опять пассать), либо неправильные решения (вокруг куча гопников а я ссу). И тут я пришёл к гениальной мысли: сделать по теме синаптических весов из нейронных сетей. Саму нейросеть не реализовывать, но вот именно эту фишку взять. Т.с. берёшь входы и создаёшь весы выходов, составляя их по формулам из входов. Лучший вес выигрывает, задавая задачу на тик, а чтобы не было зацикливания - переопределение таска идёт лишь при определённых условиях (напр. поведение сильно изменилось, противник умер и т.д.). И дебажить можно легко! Вышло неплохо - всем рекомендую :3
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован 16GB
Отредактирован Ambruziy
после множества проверок ИИ будет себя вести абсолютно правильно, но именно так, как ты запрограммировал, т.е. ты будешь предвидеть его действия. Задача у меня стоит сложнее: сделать мало мальское обучение ИИ, которое я пока лишь вижу в использовании тех же нейронных сетей (примитивных)
От части конечно можно поступить легче и сделать небольшую выборку действий по вероятностям. Это придаст вполне псевдонепредсказуемый ИИ.
Схему пока не рисую, попозже. Методом конечных автоматов.
Есть состояния юнита. Например "Стоит". Проверили, действительно стоит, прикрутили проверки, например: "в поле видимости враг"
> проверка на "выгодность" атаки в лоб, если да, то> состояние "Идти в атаку"> цикл на проверу "выгодности" (пусть будет в отдельной ф-ии, где будет учитываться параметры хп, скорости, хп врага и т.д., или сделать струтуры как обект выгодность)> проверка "Враг в области атаки"> цикл выгодность> состояние атаки и т.д. К каждому состоянию прикручены отдельные проверки. Но пока это все опять же все можно предвидеть.Далее в самих состояниях нужны действия. Например: при создании юнита ему будут даваться способности. Танку: 1 сил на контроль (случ. из 6) 1 скил на соращение дист (1 из 6) и 1 на масс урон вблизи (1 из 6) + пассивки. Каждому типу скила или действия будет приурочен "вес". Исходя из значения "веса" юнит делает действие. Сам вес каждого действия постоянно меняется. Например действие контроля танка имеет изначально малый вес, т.е. противник не делает сразу стан. Однако, когда его цель получила приказ нападать на союзного дд "вес" контроля повышается на % (пусть 200%). В итоге он кастует стан на врага (или не кастует, если есть действие с еще большим приоритетоа, например если очень мало хп приоритет на выживание). Это как будет по идее изначально.
Добавим некую обучаемость, а точнее "опыт". Пусть прошло 5 волн, противни подсчитывает урон, кто больше нанес. Видит, что нанес больше всех маг. Т.е. у того же танка при создании уже будет повышен "вес" на контроль мага. А для дд "вес" на атаку этого мага. Это, собственно то, о чем вы говорили 16GB, но этого мало. Мало потому, что приспосабливаться тут можно к источнику урона, к самому типу урона и т.д. Но всех возможностей факторов не учесть я считаю. Поэтому в идеале нужно обучение получше.
Извиняюсь за возможные опечатки, клавиатура немного раздолбана
Отредактирован ZLOI_DED
Отредактирован ZLOI_DED
Т.е. для аттаки можно, к примеру, сделать так: кол-во монет за убийство / расстояние до врага.
Idle, Attack...
}
{
setTask();
executeTask();
}
{
float idleWeight = 0f;
float attackWeight = 0f;
if (enemies.size() > 0)
{
Enemy e = getNearestEnemy();
Vector2f diff = new Vector2f(Math.abs(e.getLocation().x-getLocation().x), Math.abs(e.getLocation().y-getLocation().y));
attackWeight = 1f / diff.length();
target = e;
}
if (currWeight == 0 ||
task == Task.Attack && (target == null || target.isDead() || currWeight-attackWeight>.1f))
if (maxWeight == attackWeight) {
task = Task.Attack;
} else {
task = Task.Idle;
}
}
currWeight = maxWeight;
{
switch (task)
{
case Attack:
if (target != null)
{
followAndAttack(target);
}
break;...
}
}
Как калибровать: