Algorithm 解决积木问题所需的算法

Algorithm 解决积木问题所需的算法,algorithm,artificial-intelligence,Algorithm,Artificial Intelligence,考虑以下场景: 我们有许多顺序构建块(例如,12个构建块,从1到12排列),随机(但不一定相等)分布在多个构建器上(例如,3个构建器) 建筑商被要求按顺序施工,并从4号区块开始修建墙体,双向施工;向下至1号块或向上至12号块 每个建筑商都不知道其他建筑商可能拥有哪些区块编号,尽管他知道有多少。 建设者必须阻止其他人采取行动,努力先完成任务他们不应该通过,如果可以的话,必须放置一个挡块。 任何先完成所有建筑的建筑商将获得最高奖励,然后是第二名,依此类推 我们能预测谁会第一、第二和最后一名吗?建设者

考虑以下场景:

  • 我们有许多顺序构建块(例如,12个构建块,从1到12排列),随机(但不一定相等)分布在多个构建器上(例如,3个构建器)
  • 建筑商被要求按顺序施工,并从4号区块开始修建墙体,双向施工;向下至1号块或向上至12号块
  • 每个建筑商都不知道其他建筑商可能拥有哪些区块编号,尽管他知道有多少。
  • 建设者必须阻止其他人采取行动,努力先完成任务他们不应该通过,如果可以的话,必须放置一个挡块。 任何先完成所有建筑的建筑商将获得最高奖励,然后是第二名,依此类推
  • 我们能预测谁会第一、第二和最后一名吗?建设者应该遵循什么算法来首先完成他们的工作

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

    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。
    builder 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并带着第二个奖励回家


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

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

    你可能想在网上搜索算法


    p、 这闻起来像是家庭作业。在这种情况下使用“家庭作业”标签被认为是有礼貌的。

    乍一看,一个球员的力量是他最高和最低挡块范围的函数。在您的示例游戏中,我们可以看到构建器1完全控制构建器2

    Builder 1:            2 ----------- 9   
    Builder 2:          1 ----------------- 11
    Builder 3:              3 --------------- 12
    
    Start position:           ^^
    
    由于游戏从b4开始,最重要的部分在高端。例如,构建器3有b3,它阻止了2个其他移动(b2和b1);然而,这并不是非常决定性的。块b3在其阻止b2和b1的能力上,仅与阻止b6和b7的b5一样强大

    真正的力量在上图的右侧。这意味着具有上述初始起始范围的游戏通常会这样结束:构建器1、构建器2,然后是构建器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分钟,然后感到厌烦。

    @FM是正确的-你阻挡敌人的碎片越多,移动就越好。然而,这一战略还有另一个方面是不可行的
    wall = [3, ..., 8]
    b1 = [2,9]
    b2 = [1,11]
    b3 = [10,12]
    
    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]
    
    b1[2] -> [1,2,3]
    b1[9] -> b2[1] -> [1,2,3]
    b1[9] -> b2[11] -> [1,3,2]
    
    [2,9] -> [1,1] (both are equivalent)
    
    [1,11] -> [2,3]
    
    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 -> 2
    9 -> 1
    11 -> 1