【问题标题】:Resource placement (optimal strategy)资源放置(最佳策略)
【发布时间】:2011-07-06 03:30:02
【问题描述】:

我知道这不是问这个问题的正确地方,但也许一个聪明的人会遇到并有解决方案。

我正在尝试编写一个电脑游戏,我需要一个算法来解决这个问题:

游戏在 2 名玩家之间进行。每边有 1.000 美元。共有三个“盒子”,每个玩家写下他要放入这些盒子的金额。然后比较这些数量。谁把更多的钱放在一个盒子里,谁得 1 分(如果每人抽半分)。谁得分多,谁就赢得他的对手 1.000 美元。示例游戏:

玩家 A:[500, 500, 0] 玩家 B:[333, 333, 334]

玩家 A 获胜,因为他赢得了 Box A 和 Box B(但输掉了 Box C)。

问题:放置资金的最佳策略是什么?

我还有更多问题要问(与算法有关,与数学无关),但我需要先知道这个问题的答案。

更新(1):经过更多研究,我了解到这类问题/游戏称为Colonel Blotto Games。我尽了最大的努力,发现关于这个主题的(高度技术性的)文档很少。简而言之,我遇到的问题(如上所述)被称为简单的 Blotto 游戏(只有三个具有对称资源的战场)。困难的是那些拥有 10 多个非对称资源的战场。我读过的所有文件都说简单的 Blotto 游戏很容易解决。问题是,他们都没有真正说出那个“简单”的解决方案是什么。

更新 (2): 我写了一个小的 actionscript 文件来演示 Tom Sirgedas 提到的论文中的策略。您可以在megaswf 进行测试。说明:单击三角形内的一个点。红色区域代表获胜案例。蓝色区域代表失败案例,白色细线代表平局。

【问题讨论】:

  • 链接已损坏(我无法修复)。如果您想访问该网站,请复制并粘贴它,因为最后一个括号不是您发布时 URL 的一部分。
  • 我们可以消除“把所有鸡蛋放在一个篮子里”的解决方案
  • Orbit:是的,当然。此外,没有单一的最佳策略。这些类型的游戏被称为非传递性——无论你的策略是什么,总会有更好的策略。所以,玩家应该采取所谓的“混合策略”。
  • @blackened 欢迎您来到 StackOverflow 并提醒我们通常在这里做的三件事:1) 当您获得帮助时,请尝试在您所在的地区也给予帮助回答问题专业知识 2) Read the FAQs 3) 当你看到好的问答时,给他们投票using the gray triangles,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,by pressing the checkmark sign

标签: algorithm math discrete-mathematics game-theory


【解决方案1】:

我在这篇论文中找到了一个最优策略:http://www.rand.org/pubs/research_memoranda/2006/RM408.pdf

我们称之为 Blotto 的策略。

请看上图。你所做的任何动作都可以用三角形上的一个点来表示。论文中的策略是在六边形中随机选择一个点。选择更接近六边形边缘的点概率更高(六边形中心的概率为0,并线性放大到六边形轮廓处的最大概率。六边形轮廓上的每个点具有相等的概率。)

此解决方案适用于“连续”Blotto,但我假设您对离散情况(将 N 个部队分成 3 组)感兴趣。当 N 是 3 的倍数时,将 Blotto 的策略应用到离散情况下效果很好。对于 N 的其他值,我能够对六边形边框进行小幅调整,效果很好,但并不完美。

如果有一种策略可以打败这个策略,那么一定有一些静态动作可以战胜 Blotto 的策略。没有,除非当 N 不是 3 的倍数时,那么似乎在大三角形和六边形相交的线上的移动(例如移动 )将战胜 Blotto 的策略多于输。对于 N=100,差异似乎小于 1%,并且随着 N 的增大而继续缩小。

实现 Blotto 策略的代码:

// generate a random number in the range [0,x) -- compensate for rand()%x being slightly un-uniform
int rnd( int x ) { int r; while ( 1 ) { r = rand(); if ( r < RAND_MAX/x*x ) return r % x; } }

// distance from center of triangle/hexagon to (x,y,z), multiplied by 3 (trilinear coordinates)
int hexagonalDist3( int x, int y, int z, int N ) { return max(max(abs(N-x*3),abs(N-y*3)),abs(N-z*3)); }

void generateRandomSimpleBlottoMove( int& x, int& y, int& z, int totalTroops )
{
   int N = totalTroops;
   while ( true )
   {
      x = rnd(N+1);
      y = rnd(N+1);
      z = N-x-y;

      // keep only moves in hexagon, with moves closer to the border having higher probability
      double relativeProbabilityOfKeepingThisMove = hexagonalDist3(x,y,z,N) > N ? 0 : hexagonalDist3(x,y,z,N);

      // minor adjustment for hexagon border when N is not a multiple of 3 -- not perfect, but "very close"
      if ( N % 3 != 0 && hexagonalDist3(x,y,z,N) == N ) 
         relativeProbabilityOfKeepingThisMove = N*(N%3)/3; 

      // possibly keep our move 
      if ( rnd(N) < relativeProbabilityOfKeepingThisMove )
         break;
   }
}

【讨论】:

  • 此外,六边形内的任何移动都同样有可能在 Blotto 的策略中获胜和失败。在 Blotto 的策略下,六边形之外的移动更有可能失败而不是获胜。
  • 感谢您抽出宝贵的时间,汤姆。我仍然不明白为什么这个策略是最优的,但我会尽力吸收它。
  • 没问题,这个很有趣。试试这个:在三角形上选择一个点。现在找到三角形上你选择的点失败的所有点,并将它们涂成红色。您应该看到以您选择的点为中心绘制了“Mitsubishi”徽标。请注意,您会输给所有未着色的分数。
  • 现在,让你的策略在 2 个点中进行选择,概率相等。您应该能够确定您将在 100%、50% 和 0% 的情况下赢得哪些对手的移动。最优策略将在对抗任何移动/点时赢得至少 50% 的时间。我们可以随机选择六边形边界上的一个点,而不是在几个离散点中进行选择。这似乎赢得了 50% 的时间来对抗六边形内的任何移动,但只有大约 33% 的时间来对抗几乎在六边形之外的任何移动(由计算机程序发现)。我希望这能提供一些见解!
  • 汤姆:我是不是错过了什么?据我了解,选择六边形轮廓上的点是一种优越的策略。只是为了制作一个“非常”简单的测试类,我定义了这个数组 [(200, 100, 0), (200, 0, 100), (100, 200, 0), (100, 0, 200), (0 , 100, 200), (0, 200, 100)] 和计算机组成随机部队(加起来为 300)。我运行游戏,比如说,1000 次,得分通常是 450 的优秀策略和 550 的随机选择。正如我所说,我一定是错过了什么。
【解决方案2】:

所以这实际上是一个博弈论问题(经济学)而不是一个离散数学问题,重新标记您的问题可能会吸引您想要的那种关注。在博弈论中,“解决方案”的概念通常是Nash equilibrium。对于零和游戏,事实证明您要解决的算法是线性规划问题。有关如何设置它的示例,请参阅此维基百科 page

【讨论】:

    【解决方案3】:

    在我看来,证明这个博弈没有纯纳什均衡是相当容易的。纯策略是固定策略,例如 [333,333,334]。我的证明草图如下:

    对于玩家所玩的任何纯策略 A、玩家B可以再找一个纯 获得 B 2 分的策略。为了 例如,如果 A 播放 [500,500,0] 那么 B 播放 [501,0,499],或者如果 A 播放 [333,333,334] 然后 B 播放 [500,500,0] 等等。有 总有办法得到 2 分。的 当然,这意味着玩家 A 会 得 1 分。

    同样,对于任何由 玩家 B,玩家 A 可以找到另一个 让他得到 2 的纯策略。因此, 不存在纯粹的纳什。

    另外,我认为可以证明的策略(两者)

    1/3 [500,500,0], 1/3 [500,0,500], 1/3 [0,500,500]

    (以 1/3 的概率玩 [500,500,0],以 1/3 的概率玩 [500,0,500],以 1/3 的概率玩 [0,500,500])是该博弈的混合纳什均衡。在这种策略下,他们的预期收益(#points)是 3/2。证明对我来说似乎很费力。也许别人会有一个简单的证明。

    混合纳什尽可能接近“最优”。这场博弈可能还有其他混合纳什均衡。

    【讨论】:

    • [500,500,0] 的随机排列相对于 [998,1,1] 的随机排列具有负期望值。
    • 同意userOver9000。您提出的混合策略解决方案不是纳什均衡。
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 2020-08-21
    • 2021-10-23
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多