Имитация отжига и Yahtzee!
Я взял вызов программирования и нашел Yahtzee! Проблема, которую я упрощу:
- Есть 13 категорий очков
- Есть 13 бросков игроком (включая игру)
- Каждый рулон должен соответствовать отдельной категории
- Цель состоит в том, чтобы найти максимальное количество очков за игру (оптимальное размещение бросков по категориям); оценка (игра) возвращает счет за игру
Грубое принуждение, чтобы найти максимальный игровой счет, требует 13! (= 6,227,020,800) оценка () звонков.
Я выбираю имитацию отжига, чтобы быстрее найти что-то близкое к наивысшему баллу. Хотя и не детерминированный, но достаточно хороший. У меня есть список из 13 бросков из 5 кубиков, например:
((1,2,3,4,5) #1
(1,2,6,3,4),#2
...
(1,4,3,2,2) #13
)
И игра (1,5,6,7,2,3,4,8,9,10,13,12,11)
Переданный в Score() возвращает счет для перестановки этой игры.
Как выбрать хорошее "соседнее государство"? Для случайного перезапуска я могу просто выбрать случайную перестановку чисел nos. 1-13, поместите их в вектор и оцените их. В задаче коммивояжера приведем пример хорошего соседнего государства:
"Соседи некоторой конкретной перестановки - это перестановки, которые создаются, например, путем обмена парой соседних городов".
У меня плохое предчувствие просто поменять местами две случайные позиции, вот так:
(1,5,6,7, 2 , 3,4,8,9,10, 13, 12,11) # switch 2 and 13
(1,5,6,7, 13, 3,4,8,9,10, 2 , 12,11) # now score this one
Но у меня нет доказательств, и я не знаю, как выбрать хорошее соседнее государство. У кого-нибудь есть идеи, как выбрать хорошие соседние штаты?
2 ответа
Стратегия парного обмена не кажется мне плохой. Это, безусловно, посещает - в теории - все перестановки. Главное, я думаю, это посмотреть, действительно ли "соседи" "похожи" в вашем случае, т. Е. Если два места размещения, которые отличаются только парным обменом, довольно схожи по количеству очков. Я не могу решить это, потому что правила вашей "игры" мне не понятны.
Хитрость заключается в том, чтобы иметь несколько типов ходов. Поэтому предлагайте SA как маленькие, объединяющие движения, так и большие, разнообразные движения. Но у вас больше шансов предложить первое. Маленькие ходы просты: измените 1 или переключите 2.
Взгляните на мой пример составления списков медсестер в планировщике слюней. Его открытый исходный код в Java.