Algorithm 资源配置(最佳策略)

Algorithm 资源配置(最佳策略),algorithm,math,discrete-mathematics,game-theory,Algorithm,Math,Discrete Mathematics,Game Theory,我知道这不是一个提出这个问题的好地方,但也许一个聪明的人会出现并找到解决办法 我想写一个电脑游戏,我需要一个算法来解决这个问题: 这场比赛由两名选手进行。双方各有1000美元。有三个“盒子”,每个玩家写下他要放入这些盒子的钱的数量。然后比较这些数量。在盒子里放更多钱的人得1分(如果每人抽半分)。得分越多,对手就赢1000美元。示例游戏: 玩家A:[500500,0] 玩家B:[333333334] 球员A赢了,因为他赢了A区和B区(但输了C区) 问:放置资金的最佳策略是什么 我有更多的问题要问(

我知道这不是一个提出这个问题的好地方,但也许一个聪明的人会出现并找到解决办法

我想写一个电脑游戏,我需要一个算法来解决这个问题:

这场比赛由两名选手进行。双方各有1000美元。有三个“盒子”,每个玩家写下他要放入这些盒子的钱的数量。然后比较这些数量。在盒子里放更多钱的人得1分(如果每人抽半分)。得分越多,对手就赢1000美元。示例游戏:

玩家A:[500500,0] 玩家B:[333333334]

球员A赢了,因为他赢了A区和B区(但输了C区)

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

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

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


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

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

在我看来,很容易证明这个博弈没有纯纳什均衡。纯粹的战略是固定的,如[3334]。我的证明草图如下:

对于玩家玩的任何纯策略 A、 玩家B可以找到另一个纯玩家 获得B 2分的策略。对于 例如,如果A播放[500500,0],则B 播放[501,0499],或者如果播放 [33333333 4]然后B演奏 [500500,0],等等。有 总是一种获得2分的方法。属于 当然,这意味着玩家A会 得1分

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

此外,我认为可以证明,这两种战略

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

(博弈[500500,0]的概率为1/3,博弈[500,0500]的概率为1/3,博弈[0500500]的概率为1/3)是该博弈的混合纳什均衡。在这一策略下,他们的预期收益(#分)为3/2。这个证据对我来说似乎很难。也许其他人会有一个简单的证明


一个混合纳什尽可能接近“最优”。这个游戏可能还有其他混合纳什均衡。

我在本文中找到了一个最优策略:

让我们称之为布洛托的策略

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

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

如果有一个策略可以击败这一个,那么一定有一些静态的动作可以战胜布洛托的策略。没有,除非N不是3的倍数,那么在大三角形和六边形相交的线上移动(例如,移动)似乎会比失败略胜于布洛托的策略。对于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;
   }
}
//生成[0,x]范围内的随机数--补偿rand()%x稍微不均匀
int rnd(int x){int r;而(1){r=rand();if(rN?0:hexagonalst3(x,y,z,N);
//当N不是3的倍数时,对六边形边框进行微调——不完美,但“非常接近”
如果(N%3!=0&&Hexagonalist3(x,y,z,N)==N)
保持此移动的相对可能性=N*(N%3)/3;
//可能继续我们的行动
if(rnd(N)<保持此移动的相对可能性)
打破
}
}
是吗?链接已断开(我无法修复)。Cop