динамическая целевая функция в алгоритме PSO

Я работаю над игровым проектом в области искусственного интеллекта; в котором я использую алгоритм PSO для врага, чтобы найти позицию игрока. Вот мой вопрос:

Как я могу оптимизировать PSO, чтобы найти цель, которая не статична и постоянно меняется?

Я хочу реализовать некоторые алгоритмы разведки роя на разных уровнях этой игры.


person Ali Bordbar    schedule 27.10.2015    source источник


Ответы (1)


Перед обновлением скоростей частиц (и после этого, после ограничения скоростей, положений), обычно в PSO, наилучшее положение частицы, а также наилучшее положение роя обновляются относительно. значение целевой функции для каждой частицы роя в текущей итерации. Обозначим эти позиции particleBestPos (для каждой частицы) и swarmBestPos соответственно. Наконец, для каждой частицы позвольте particleCurrentPos обозначать текущую позицию.

Для каждой частицы, с учетом некоторой статической цели, описываемой f (...), которая должна быть минимизирована, положения слоя обновляются в соответствии с:

if f(particleCurrentPos) < f(particleBestPos)
    particleCurrentPos <-- particleBestPos
if f(particleCurrentPos) < f(swarmBestPos)
    swarmBestPos <-- particleBestPos

Теперь не должно быть проблем, если f (...) будет «динамической» функцией, описывающей, скажем, расстояние от аргумента (particleCurrentPos) до игрока. Проблема скорее в том, что позиции particleBestPos, а также swarmBestPos не имеют большого значения, если игрок постоянно перемещается.

Одним из решений этого было бы ведение истории каждой частицы, скажем, n самых последних позиций. На шаге обновления наиболее подходящей частицы / роя выше для каждой частицы: прокрутите историю частиц (последняя позиция) и позвольте particleBestPos быть лучшим среди тех, что касаются игроков ' текущая позиция в это времяswarmBestPos аналогично).

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

«С точки зрения истории n позиций моего и моего роя: какая историческая позиция, моя собственная, а также моя рой, была бы наиболее выгодной для смещения с учетом текущей позиции игроков»

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


Дополнение: поскольку ваша целевая функция (которая оценивает и оценивает частицы) очень тривиальна (текущее расстояние до игрока), а оптимальное решение (позиция) всегда известно (x * = позиция игрока), возможно, PSO в этом случае будет немного излишним, и вы могли бы просто смоделировать своих врагов как boids, см. модель Boids.

Вы можете использовать исходную модель пустот, но добавить дополнительное (тяжеловесное) правило выравнивания; направиться к игроку.

Обратите внимание, что модель Boids - это не и модель оптимизации, а просто способ моделирования поведения роя, вдохновленного стаей птиц. В вашем случае, я считаю, этого должно хватить. Размер веса вашего дополнительного правила выравнивания также будет удобным способом напрямую управлять тем, насколько хорошо ваши враги отслеживают игрока.

person dfrib    schedule 06.12.2015
comment
спасибо за ваш ответ, на данный момент я работаю над другим проектом, но когда я вернусь к этому, я дам вам знать, работает ли это в этой структуре или нет. - person Ali Bordbar; 15.12.2015