解决构建块问题所需的算法

时间:2010-02-16 00:05:10

标签: algorithm artificial-intelligence

考虑以下情况:

  1. 我们有许多连续的构建模块(例如 12个构建模块,从1到12排序),在许多构建器上随机分布(但不一定相同)(例如 3助洗剂)。
  2. 建筑商必须按顺序工作,并从两个方向开始从4号楼建造墙;下至1号区块或12区块。
  3. 每个构建者都不知道其他构建者可能拥有的块数,但他知道有多少。
  4. 建筑商必须首先尝试通过阻止他人采取行动来完成。 如果可以的话,他们不应该通过并且必须放置一个块。 任何首先完成所有积木的建造者将获得最高奖励,然后获得最高奖励,依此类推......
  5. 我们可以预测谁将完成第一,第二和最后?构建者是否应该遵循任何算法来完成他们的工作?

    以下是该问题的一个实际例子:
    让我们说:

    builder 1 has: b2 b5 b8 b9
    builder 2 has: b1 b11
    builder 3 has: b3 b4 b6 b7 b10 b12
    

    构建器1和构建器2必须等待构建器3放置b4 构建器3将放置b4,并将其位置返回构建器1。

    wall: b4
    

    建造者1将不得不提出b5,因为他没有其他选择。

    wall: b4 b5
    

    建造者2将跟随,但他不能放置他的积木,他将不得不等待b2或b10 建造者3现在有两个选择:b3或b6,他必须选择一个帮助他先完成的选项。

    wall: b4 b5 b6
    

    建筑师1无所事事,他将转向建造者2 构建器2仍在等待安装b2或b10 建造者3必须放置b7。

    wall: b4 b5 b6 b7
    

    构建器1现在将放置b8。

    wall: b4 b5 b6 b7 b8
    

    建筑商2仍在耐心等待......
    建筑商3被迫放下b3,因为没有其他选择,他希望建筑师2可以放置b9 ......但他的希望消失了!

    wall: b3 b4 b5 b6 b7 b8
    

    建设者1现在完全掌管,感到非常高兴!但他很困惑!在认为他认为b2可能允许他继续阻止更多数量的积木之后,这反过来增加了他的机会。

    wall: b2 b3 b4 b5 b6 b7 b8
    

    建设者2说:终于!一些动作!和地方b1。

    wall: b1 b2 b3 b4 b5 b6 b7 b8
    

    建筑师3失去了成为第一的希望! 建造者1现在将安装他的最后一个街区并带着最大的回报回家!

    wall: b1 b2 b3 b4 b5 b6 b7 b8 b9
    

    建造者2将等待......
    建设者3遗憾地放置b10
    建设者2放置b11并带着第二个奖励回家......

    任何已知的解决此类问题的算法?

4 个答案:

答案 0 :(得分:3)

乍一看,球员的力量是他的最高和最低区块所跨越的范围的函数。在您的示例游戏中,我们可以看到Builder 1完全支配Builder 2。

Builder 1:            2 ----------- 9   
Builder 2:          1 ----------------- 11
Builder 3:              3 --------------- 12

Start position:           ^^

由于比赛在b4开始,最重要的部分是高端。例如,Builder 3有b3,它可以防止其他两个动作(b2和b1);但是,这不是非常具有决定性的。 b3块阻止b2和b1的能力仅与b5一样强大,后者阻止了b6和b7。

真正的力量位于上图右侧。这意味着具有上述初始起始范围的游戏通常会如下所示:Builder 1,Builder 2,然后是Builder 3.

至于玩家策略,这是一个公认的投机指南:坚持你最强大的作品,意味着那些阻止其他玩家进行最大数量动作的作品。在此策略中,您所持有的每件作品都可以根据其阻止的其他动作的数量进行分数。

例如,假设墙位于b3-b4-b5并且您持有b2,b6和b9。你可以玩b2或b6。你如何评价你的作品?

b2 score = 1 (prevents b1)
b9 score = 3 (prevents b10, b11, b12)
b6 score = 2 (prevents b7, b8)

请注意,b6因防止b10及更高而无法获得荣誉,因为b9正在做这项工作(Matthieu M.也提出了这一点)。在这种情况下,您应该首先尝试播放b2,因为它会让您将其他玩家的风险降至最低。

其他答案提出了一些有趣的想法,不想阻止你自己的进步,建议你先玩b6。但我不认为通过加速向b9的运动可以获得任何好处。你想尽可能长时间地延迟b9,因为它是一个能让你获得最大保险(从概率的角度来看)阻止其他玩家完成的部分。

<强>更新

我写了一个Perl模拟来测试一些简单的玩家策略。我开始怀疑球员战略是否无关紧要。我尝试了以下几点:(a)挑选最高的块; (b)挑选最低区块; (c)我推荐的选择最安全区块的策略(防止其他人移动最多的区块)。我通过给第一名获得3分,第二名获得2分,第三名获得1分来评估策略。这些策略中没有一个比随机选择表现得更好(或更差)。

当然,人们可以制定玩家选择影响结果的场景。例如,如果块像这样分发,则玩家3将获得第一或第二位。

b1  b2  b3  b4  b5  b6  b7  b8  b9  b10  b11  b12
2   1   3   1   3   2   2   2   2   2    2    2

然而,从概率的角度来看,结果的这种变化可以简化为以下内容:除非他选择与仅剩下一个区块的球员相邻的区块,否则球员3将获胜。换句话说,确切的结果是投掷硬币。

所以这里有一个问题:任何人都可以提供一个既没有预定也没有投掷硬币的结果?我尝试了大约15分钟然后感到无聊。

答案 1 :(得分:2)

这是纸牌游戏Sevens的一个适合的变体 - 它也有其他名称;我听说它被广泛称为范坦。

您可能希望在网上搜索算法。

<击> P.S。这有点像家庭作业。在这种情况下使用“家庭作业”标签被认为是礼貌的。

答案 2 :(得分:1)

@FM是对的 - 你阻挡敌人的部分越多,移动就越好。但是,该策略还有另一部分未被考虑。

考虑一下你是否有B3,B7和B11。假设B3和B7目前都是合法的举动。 (你处于一个相当不错的位置。因为你没有B12或B1,你不能排在第三位。)

选择B3意味着您只打开B1和B2,因此这是FM战略下的最佳举措。

然而,如果不放置B7,你就会推迟B10的最终比赛,这对你来说是必要的。 B7可能是一个更好的举措。

答案 3 :(得分:1)

由于我还没有精确度,让我们从(合理的)假设开始,如果你可以玩,那么你必须这样做。很高兴防止游戏卡住。

由于规则,您可以进行0,1或2次移动。您只能选择何时进入2移动解决方案。

<强> 1。决策树

与许多游戏一样,查看所发生情况的最简单方法是跟踪所有可能移动的树,然后探索此树以做出决定。由于没有太多的决定,树不应该那么大。

例如,请考虑我们处于以下状态:

wall = [3, ..., 8]
b1 = [2,9]
b2 = [1,11]
b3 = [10,12]

b1转向播放。

b1[2] -> b2[1] -> b3[] -> b1[9] (1st) -> b3[10] -> b2[11] (2nd) -> b3[12]
 or
b1[9] -> b2[] -> b3[10] -> b1[2] (1st) -> b2[1] -> b3[] -> b2[11] (2nd) -> b3[12]
                                           or
                                          b2[11] -> b3[12] (2nd) -> b2[1]

所以基本上我们在树的一部分有两个选择。

  1. b1可以在29
  2. 之间进行选择
  3. b2可以在111
  4. 之间进行选择

    我们可以通过列出玩家将获得的位置来总结选择的后果,显然是在每个玩家选择的无偏见的一方中,以获得最佳位置。

    所以,让我们表达树的简化版本(我们只显示选择):

    b1[2] -> [1,2,3]
    b1[9] -> b2[1] -> [1,2,3]
    b1[9] -> b2[11] -> [1,3,2]
    

    现在我们可以根据给定的玩家应用缩小视图。

    对于b1,树看起来像:

    [2,9] -> [1,1] (both are equivalent)
    

    对于b2,它看起来像:

    [1,11] -> [2,3]
    

    对于b3,永远不会有选择......

    <强> 2。可能的结果

    当然,玩家不会得到这棵树,因为他们不知道其他人有什么,但作为观察者,它可以让你在聚会的不同阶段研究各种可能的结果。

    请注意,例如,在此子树上,我们有2个选项,第二个选择以第一个为条件。如果我们Pi(x in {x,y})表示玩家i在面对xx之间的选择时选择y的可能性,那么我们可以表达每个结果的概率

    P([1,2,3]) = P1(2 in {2,9}) + P1(9 in {2,9}) * P2(1 in {1,11})
    P([1,3,2]) =                  P1(9 in {2,9}) * P2(11 in {1,11})
    

    第3。球员策略

    从我们在这里看到的情况来看,最好的策略似乎是尝试阻止尽可能多的部分:即在111之间进行选择时,你最好玩{{因为1阻止1件,它不会阻止任何人。但是这只适用于2件。

    当你实际拥有一个碎片列表时,我们需要一些更通用的东西。

    例如,如果你持有11并且墙应该是{3, 9, 11}你应该摆出什么?显然,[4, ..., 8]会阻挡比3更少的碎片,但9阻挡了您自己的碎片!

    就个人而言,在这种情况下我会选择9,因为无论如何我需要放置911块少于11(带{{} 1}}我有可能先终止,3不太可能......)。

    我想我可以给手中的每件作品给出一个分数,具体取决于他们阻挡的件数:

    3

    虽然11仅归因于3 -> 2 9 -> 1 11 -> 1 吗?因为它只阻止9,因为我持有1:)

    然后我会先打出最低分(如果我有选择)。