Перед обновлением скоростей частиц (и после этого, после ограничения скоростей, положений), обычно в 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 позиций моего и моего роя: какая историческая позиция, моя собственная, а также моя рой, была бы наиболее выгодной для смещения с учетом текущей позиции игроков» em>
Чем длиннее историческая память, тем лучше (или опаснее :)) рой будет отслеживать движущегося игрока.
Дополнение: поскольку ваша целевая функция (которая оценивает и оценивает частицы) очень тривиальна (текущее расстояние до игрока), а оптимальное решение (позиция) всегда известно (x * = позиция игрока), возможно, PSO в этом случае будет немного излишним, и вы могли бы просто смоделировать своих врагов как boids, см. модель Boids.
Вы можете использовать исходную модель пустот, но добавить дополнительное (тяжеловесное) правило выравнивания; направиться к игроку.
Обратите внимание, что модель Boids - это не и модель оптимизации, а просто способ моделирования поведения роя, вдохновленного стаей птиц. В вашем случае, я считаю, этого должно хватить. Размер веса вашего дополнительного правила выравнивания также будет удобным способом напрямую управлять тем, насколько хорошо ваши враги отслеживают игрока.
person
dfrib
schedule
06.12.2015