我在这篇论文中找到了一个最优策略:http ://www.rand.org/pubs/research_memoranda/2006/RM408.pdf
我们称之为 Blotto 的策略。
看上面的图表。你所做的任何动作都可以用三角形上的一个点来表示。论文中的策略是在六边形中随机选择一个点。选择更接近六边形边缘的点概率更高(六边形中心的概率为0,并线性放大到六边形轮廓处的最大概率。六边形轮廓上的每个点具有相等的概率。)
此解决方案适用于“连续”Blotto,但我假设您对离散情况感兴趣(将 N 个部队分成 3 组)。当 N 是 3 的倍数时,将 Blotto 的策略应用于离散情况非常有效。对于 N 的其他值,我能够对六边形边框进行小幅调整,效果很好,但并不完美。
如果有一种策略可以打败这个策略,那么一定有一些静态的动作可以战胜 Blotto 的策略。没有,除了当 N 不是 3 的倍数时,似乎在大三角形和六边形相交的线上的移动(例如移动 <0,.5,.5>)将战胜 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;
}
}