列出所有游戏

时间:2017-12-09 00:48:55

标签: java matrix groovy combinations combinatorics

提出问题here OP有兴趣列出所有独特的2x2游戏。这里的游戏是游戏理论游戏,其中有两个玩家和两个策略。因此,有四种可能的结果(见图)。这些结果伴随着每个球员的“回报”。支付'对'是来自某些策略组合的每个玩家的两个回报。支付以整数给出,不能超过4.

例如,考虑下面的2x2游戏示例(支付对写在括号中,P1和P2分别表示玩家1和2):

foreach (Player player in players)
{
    if (player.IsCPU)
        // Do Something...
    else
        // Do Something Else...
}

这里的收益取值[(2,2),(3,4)| (1,1),(4,3)]。

现在,显然许多其他游戏(即独特的支付矩阵)是可能的。如果每个玩家的收益是1,2,3,4(我们可以在4种方式中排除!= 24种方式),则可以进行24 * 24场比赛。 OP有兴趣列出所有这些游戏。

这里有一个微妙的部分:两个独特的支付矩阵可能代表游戏,如果一个可以从另一个获得

i)交换专栏(即重新标记玩家A的策略)

ii)交换行(即重新标记玩家B的策略)

iii)交换球员(即交换支付对和    沿第一个对角线镜像矩阵

OP发布了以下代码,正确列出了所有78种可能的游戏,其中每种游戏的收益可以是(1,2,3,4)。

我有兴趣更改代码,以便程序列出所有可能的收益不同的唯一游戏:即(1,2,3,3)对于玩家1和(1,2) ,3,4)对于玩家2.这里,将有4!/ 2!置换方式(1,2,3,3),因此更少的游戏。

                  P2
            Right   Left

       Up   (2,2)   (3,4)
   P1         
       Down (1,1)   (4,3)

我尝试将“断言1< = a&& a< = 4”更改为“断言1< = a&& a< = 3”,然后将4更改为a 3进一步在代码中。这似乎不起作用。

我不确定“int hashCode(){return(a-1)* 4 +(b-1)”或“if”(q.tl.a == 4){ }            否则如果(q.tr.a == 4){“确实如此,那就不知道如何改变它。

除此之外,我怀疑翻转和交换可以保持原样,因为这应该产生一个识别独特游戏的程序,无论具体的支付设置是什么(即它是否为1,2,3,4或1,2,3,3)。

我已经手动计算了不同支付套装的独特游戏数量,可供参考。

enter image description here

1 个答案:

答案 0 :(得分:1)

我有类似的情况为Othello / Reversi制作AI,并希望状态空间尽可能小以消除冗余处理。 我使用的技术是将游戏表示为一组元状态,或者在您的情况下,元结果,其中每个元组由所有相等的排列组成。列出并识别等效排列涉及提出规范化方案,该规范化方案确定哪个方向或反射是元实例的关键。然后转换所有新的排列以在比较之前对它们进行标准化,以查看它们是否代表新实例。

在您的情况下,如果交换行和列都被认为是等效的,您可以考虑这样的情况:排序顺序的方向将最小值放在左上角,将下一个最小的相邻值放在右上角。这将所有4个翻转位置(标识,h-flip,v-vlip,hv-flip)标准化为单个表示。