29 декабря 2015

pSeven учится играть в "Angry Circles"

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

Идея проста – физические модели легко визуализировать и легко понять. У каждого человека есть интуитивное понимание законов физики – яблоки падают, стекло бьётся, лед скользкий и т.д. Однако, реальные физические задачи не очень подходят для наглядных примеров, поскольку являются достаточно сложными и включают в себя большое количество ненужных деталей.

Обдумав все это, я и наш интерн Кирилл (спасибо за помощь!) разработали очень простой игроподобный решатель для 2D-сценария. Предположим, что у нас есть твердое тело, бросаемое с некоторым начальным импульсом (как линейным, так и угловым) под некоторым углом, назовем этот процесс “Кружок (Circle)”. Сценарий содержит несколько поражаемых целей с различной прочностью, разрушение каждой из которых дает определенное количество очков. Уничтожение злобных Квадратов дает максимальное количество очков. Цель проста – за один запуск Кружка набрать максимальное количество очков. Решатель принимает во внимание основные силы (гравитацию и трение) и моделирует некоторую степень упругости для каждого тела. Это можно визуализировать так:

Постановка оптимизационной задачи очевидна. У нас есть 3 переменных: линейная скорость, угловая скорость и угол. Результат набранных очков (Score) – это целевая функция. Интересно, что в даже в этом простом примере возникает нетривиальная оптимизационная задача. Целевая функция “Score” ведет себя хаотично и имеет множество минимумов и обширные вырожденные области (с нулевым значением, когда наше ядро не попадает ни в одну цель и просто улетает). Давайте посмотрим, как оптимизационные возможности pSeven помогут решить эту задачу!

Вот так выглядит оптимизационная расчетная схема в среде pSeven:

Поскольку целевая функция является многомодальной, нам здесь необходимо использовать глобальную оптимизацию, давайте включим ее в меню “Optimizer”:

Мы воспринимаем наш 2D-решатель серьезно, поэтому запускаем его, как настоящий. Подготовим файлы ввода с описанием сценария, запустим симуляцию (без графики, чтобы процесс проходил быстрее) и проанализируем полученный результат в выходном файле. Когда оптимизация завершена, оптимальная точка прогоняется через тот же решатель еще раз, теперь функция визуализации подключена. Финальный результат сохраняется в виде интерактивного графика, который можно посмотреть в pSeven с помощью недавно добавленного Page Viewer:

Несмотря на все сложности, pSeven смог найти решение, очень близкое к глобальному оптимуму – ни одна цель не выжила. Вот так выглядит финальное решение:

 

Алексей Назаренко, Старший программист, DATADVANCE

LinkedIn
VK

Заинтересовало решение?

Нажмите, чтобы запросить бесплатную 30-дневную демоверсию.

Запросить демо