模拟退火和Yahtzee!

时间:2011-01-11 00:56:01

标签: simulated-annealing

我已经接过Programming Challenges并找到了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)会返回该游戏排列的得分。

如何选择一个好的“邻国”?对于随机重启,我可以简单地选择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

但我没有证据,也不知道如何选择一个好的邻国。任何人对如何挑选好邻国都有任何想法吗?

2 个答案:

答案 0 :(得分:1)

配对交换策略对我来说听起来并不坏。它肯定会在理论上进行访问 - 所有排列。我认为,重点是看看“邻居”在你的情况下是否真的“相似”,即如果两个仅在一对交换中不同的位置在得分上相当相似。我无法决定这一点,因为你的“游戏”规则对我来说并不清楚。

答案 1 :(得分:1)

诀窍是有多种类型的动作。 所以提供SA既小又统一的动作和大的,多样化的动作。 但是有更高的机会提供第一个。 小动作很简单:改变1或切换2。

drools planner中查看我的护士排班示例。它在java中的开源。