我已经接过Programming Challenges并找到了Yahtzee!我将简化的问题:
蛮力找到最高比赛得分需要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)
会返回该游戏排列的得分。
如何选择一个好的“邻国”?对于随机重启,我可以简单地选择nos的随机排列。 1-13,将它们放在矢量中,并对它们进行评分。在旅行商问题中,这是一个good neighboring state的例子:
“某些特别的邻居 排列是排列 例如由...生产 交换一对相邻的 城市“。
我对简单地交换两个随机向量位置感觉不好,就像这样:
(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
但我没有证据,也不知道如何选择一个好的邻国。任何人对如何挑选好邻国都有任何想法吗?
答案 0 :(得分:1)
配对交换策略对我来说听起来并不坏。它肯定会在理论上进行访问 - 所有排列。我认为,重点是看看“邻居”在你的情况下是否真的“相似”,即如果两个仅在一对交换中不同的位置在得分上相当相似。我无法决定这一点,因为你的“游戏”规则对我来说并不清楚。
答案 1 :(得分:1)
诀窍是有多种类型的动作。 所以提供SA既小又统一的动作和大的,多样化的动作。 但是有更高的机会提供第一个。 小动作很简单:改变1或切换2。
在drools planner中查看我的护士排班示例。它在java中的开源。