Rock Paper Scissors分组优化

时间:2015-09-03 04:12:38

标签: algorithm optimization

只是试图找到一个好的算法来使用典型的RPS规则找到最佳解决方案。我还没有开始编程这个问题。

给定两个有序数组,每个数组包含N个元素,通过重新排序第一个数组来优化获胜次数。

例如:

a[0] = rock     
a[1] = paper
a[2] = paper
a[3] = rock

b[0] = paper
b[1] = rock
b[2] = scissors
b[3] = rock

// currently
a[0] vs b[0] = -1 // (rock losses to paper)
a[1] vs b[1] = +1 // (paper beats rock)
a[2] vs b[2] = -1 // (paper losses to scissors)
a[3] vs b[3] = 0 // (rock ties to rock)

应返回的最佳订单是{1,0,3,2}

paper ties paper
rock ties rock
rock beats scissors
paper beats rock

问题是,我如何得出这个结果?一些限制。

比起胜负相互抵消更为可取。这可能是通过权衡损失而不是胜利来实现的。即。

a[0] = rock
a[1] = paper
b[0] = paper
b[1] = rock

{0, 1} vs b[..] = -1, +.95 = -.05
{1, 0} vs b[..] = 0, 0 = 0 // preferred order

此外,首选阵列底部的胜利。

有关如何完成此任务的任何建议?感谢。

1 个答案:

答案 0 :(得分:3)

对于小型数组,您可以解决https://en.wikipedia.org/wiki/Assignment_problem

对于大型数组,请注意您可以通过给出3x3计数数组中的条目来准确描述任何解决方案,其中A [i,j]给出玩家A所说的次数(0 => rock,1 = >纸,2 =>剪刀)和B表示(0 =>岩石,1 =>纸,2 =>剪刀)。所以你想要填充这个数组来最大化A的胜利的单元格的总和,受到总和向下列的限制,这相当于B表示阵列中的岩石,纸张和剪刀的次数和同样沿着A行 - 这个结果告诉你足够填写A给定B的数组。

你当然可以用整数线性规划来解决这个问题。我怀疑问题总是在一个角落,如果你用线性编程解决它只是将每个条目约束为> = 0你将得到一个整数答案,但我还没有正式证明这一点。