提出问题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)。
我已经手动计算了不同支付套装的独特游戏数量,可供参考。
答案 0 :(得分:1)
我有类似的情况为Othello / Reversi制作AI,并希望状态空间尽可能小以消除冗余处理。 我使用的技术是将游戏表示为一组元状态,或者在您的情况下,元结果,其中每个元组由所有相等的排列组成。列出并识别等效排列涉及提出规范化方案,该规范化方案确定哪个方向或反射是元实例的关键。然后转换所有新的排列以在比较之前对它们进行标准化,以查看它们是否代表新实例。
在您的情况下,如果交换行和列都被认为是等效的,您可以考虑这样的情况:排序顺序的方向将最小值放在左上角,将下一个最小的相邻值放在右上角。这将所有4个翻转位置(标识,h-flip,v-vlip,hv-flip)标准化为单个表示。