Как стать автором
Обновить

Комментарии 11

Хочу заметить, что главная ваша проблема заключается в механике боя.
1. Просто бить? Ну и когда вы будете просто 1000 раз подряд бить с руки? Как минимум следовало бы добавить способности, резисты, уровни противников.
2. Вы не используете псевдорандом, который очень часто присутствует в механиках.

Зачем вы увеличиваете количество итераций, когда можно использовать центральную предельную теорему?
  1. Абсолютная правда. Почти всегда именно спелы являются исключительно важными за… Исключением, разве что роги. Самый бьющий руками класс. Ну или один из.


  2. Для этого потребуется этот псевдорандом как-то указать, а это уже нетривиальная задача.


  3. А причём здесь центральная предельная теорема? Как по мне — вообще ни причём, ибо попробуйте докажите слабозависимость характеристик. Хотя теоретически и можно построить модель, гарантирующую такое распределение из предположения о линейности импакта, не уверен за её адекватность.



А вот что точно можно было использовать. Во-первых, numpy. Для производительность. Если даже просто рандом от туда "прегенерировать" — это уже успех. Во-вторых, рандом можно и на диск сохранить и брать его для всех "забегов". Это не так уж и честно, но раза в два-три может сократить выборку, а честность здесь не очень важна, так как по факту нам и интересно влияние сета в максимально равноценных условиях.


Но что важнее, можно было бы аналитически считать мат.ожидание. Ну правда, там даже на картиночках это максимально прозрачно видно. И никаких комбинаторных взрывов не будет, вообще симуляции применяются разве что на 2 курсе бакалавра — чтобы доказать теорему больших чисел. Ну и адекватность марковских цепей, как бонус. А дальше исключительно аналитический аппарат. Симуляции строят уже когда модель аналитически интересна, но надо это показать на "практике", так как при аналитических рассчётах всегда вводятся предположения о тех самых распределениях, которые не всегда адекватны.

Исключением, разве что роги.

Комбо и добивание, баффы, пассивки?))

Для этого потребуется этот псевдорандом как-то указать, а это уже нетривиальная задача.

На оф. ресурсах всегда есть формулы механик. Тем более, тут исходная формула, мне кажется, неправильная. Правда, я в вов с пандарии не заходил, может что-то поменялось.

А причём здесь центральная предельная теорема?

Действительно, здесь же одна случайна величина. Я писал про Закон больших чисел, из кторого следует, что можно заменить серию из 100500 экспериментов на сумму вероятностного урона: 0*p(промаха)+62*p(скользаящего)+… Как вы и написали.

Симуляции строят уже когда модель аналитически интересна

Занимался как-то раз подобным, пришёл к выводу, что достаточно просто написать калькулятор (плагин) по аналитической модели (точнее целевой функции оптимизации), желательно автоматический через запись с экрана.

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


Я даже щас формулу набросаю, если не ошибаюсь это мат ожидание


Ожидания Модификатора = P(попадания) * (P(скользящий) * 0.7 + P(не скользящий) * (P(крит) * 2 + P(не крит) * 1)


Ожадание финального урона = Ожидания модификатора * Урон


Где P это вероятность

Даже не пришла в голову эта идея, спасибо! Буду пробовать.

Если вариант с теорвером по какой-то причине вас не устраивает, я нашел еще один способ. Цитирую вас


Важно помнить, что в этом проекте есть элементы случайности: при определении типа удара с задействованием функции randint. Неоднократно проводя тесты, я заметил, что при повторении сессий с одними и теми же входными данными топ-5 подборок может различаться. Это не очень обрадовало, и взялся решать проблему.

Подменяем это нашей функцией рандома. Фиксируем сколько раз за бой она вызывалась
(Если я правильно понимаю она будет вызываться 3 раза
1) попадание да/нет
2) скользящий да/нет
3) крит да/нет


Предположим вероятность этих событий X,Y,Z
всего у нас может быть 8 вариантов (да да да, да да нет, да нет да, да нет нет, нет да да, нет да нет, нет нет да, нет нет нет)


мы считаем урон в каждом из этих 8 случаем, а дальше суммируем этот урон по формуле в


damageForCase = damage * P(X)*P(Y)*P(Z)


Чтоб проще было осознать почему это работает можно рассмотреть упрощенную игру когда у нас только один параметр — крит в 10 процентов с уроном в 100, или обычная атака с уроном в 50


= 100 * 0.1 + 50 * 0.9 = 55

П.C.C разумеется результат подсчитаный этим способом, либо как я сказал выше через теорвер будут одинаковые, этот способ по сути перекладываем часть наших(человевеческих) расчетов на компьютер

Ну я как минимум бы заменил на NamedTuple обычные кортежи, dict на листы, и соответственно инициализацию листов бы написал без этой копипасты с ненужным индексированием
т.е как-то так
Item = namedtuple('Item', ['name', 'attack','agility','str','percision','crit','mastery'])
RIGHT_HANDS: List[Item]  = [
    Item(name=u'Праворучный Страж Лесов', attack=50, agility=3, str=0, percision=0, crit=0, mastery=0),
    Item(name=u'Меч Ловкача',             attack=40, agility=22,str=0, percision=0, crit=0, mastery=0),
    Item(name=u'Меч Точности',            attack=40, agility=0, str=0, percision=3, crit=0, mastery=0),
    Item(name=u'Меч Мастера',             attack=40, agility=0, str=0, percision=0, crit=0, mastery=5)
]

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

Как раз хочу опробовать идею с генетикой и посвятить этому следующую статью. Потому что на практике комбинаций, конечно, значительно больше.
А в чем смысл писать свой Simulationcraft? Для ленивых даже raidbots есть.
Была цель показать пошагово, как симулировать в приближённом виде механику той или иной игры и повысить уровень доверия к результатам таких поисков. Конкретно WoW выбран в качестве примера. Насколько мне известно, боты для новых игр/аддонов появляются не сразу, да и бывает интересно разобраться в вопросе самому, чем связываться с ботами.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации