Search 如何更好地优化菠萝扑克中可能的幻想世界结构的搜索?

Search 如何更好地优化菠萝扑克中可能的幻想世界结构的搜索?,search,mathematical-optimization,heuristics,poker,simulated-annealing,Search,Mathematical Optimization,Heuristics,Poker,Simulated Annealing,所以,在问题的前面做一点解释。在开放式中国扑克的变体中,您将获得一张和一张牌,这张牌将被放在三个不同的行中,目标是使每一行变得越来越好,当然也尽可能获得最好的牌。与普通扑克不同的是,最上面一行只有三张牌,所以一种牌中的三张是你能得到的最好的牌。在一个叫做菠萝的变体中,这就是我正在研究的机器人,在最初的5张牌之后,你会得到3张和3张牌,每轮你会丢弃其中一张 现在有一个特殊的规则叫做“幻想曲”,这意味着如果你在一排排上有一对或更好的皇后,并且仍然设法在中间和顶部排得更好的手,你的下一轮就变成了一个梦

所以,在问题的前面做一点解释。在开放式中国扑克的变体中,您将获得一张和一张牌,这张牌将被放在三个不同的行中,目标是使每一行变得越来越好,当然也尽可能获得最好的牌。与普通扑克不同的是,最上面一行只有三张牌,所以一种牌中的三张是你能得到的最好的牌。在一个叫做菠萝的变体中,这就是我正在研究的机器人,在最初的5张牌之后,你会得到3张和3张牌,每轮你会丢弃其中一张

现在有一个特殊的规则叫做“幻想曲”,这意味着如果你在一排排上有一对或更好的皇后,并且仍然设法在中间和顶部排得更好的手,你的下一轮就变成了一个梦幻般的回合。这是一轮同时发15张牌,并且可以自由构造最好的三行(3、5和5张牌的行,并丢弃其中的2张)。每一行产生一定数量的点数(他们被称为版税),这取决于构造的手,并且每一连续行需要越来越好的手来产生相同数量的点数

尝试为此优化解决方案似乎是一个自然的起点,也是最有趣的部分之一,所以我开始研究它。我的第一次尝试,也是我被困的地方,是使用模拟退火进行局部搜索优化。能量/评价函数是点数,起初我尝试了一个移动/邻接函数,简单地随机交换两张牌,在抽牌时将它们放在第一位。这很有效,每手平均得到6分左右,这并不坏,但我经常注意到,通过同时交换多张卡,我可以找到更好的解决方案。因此,我将move/neighbor函数改为一次交换几对卡,并尝试在1到3到5之间交换随机数量的卡,这会产生稍微好一点的结果,但我还是经常通过简单地看一看就能发现更好的解决方案


如果有人读到了这篇文章并理解了这个问题,那么有没有关于如何更好地优化这个搜索的想法?我应该使用不同的移动/邻域函数、不同的退火参数,或者可能是不同的局部搜索方法,甚至是某种非局部搜索吗?欢迎您提出所有建议,我们对此深表感谢。

您还没有指出性能要求,因此我认为这应该足够快,可以在与人类玩家的游戏中使用。找到解决方案不需要一个小时,但你也不需要一毫秒的时间

我想知道模拟退火是正确的方法。这可能是暴力的一个机会

可以制作一个非常快速的算法来评估扑克牌。考虑卡的编码,其中13位编码卡值,4位编码套装。或者将手中的卡片放在一起,您可以快速识别配对、三元组、直组和冲水组

乍一看,似乎有15个!(13076743680000)所有已发牌的可能位置,但还有其他对称性和限制,减少有意义的组合并限制必须探索的空间

一个重要的约束条件是,底部行的分数必须高于中间行,中间行的分数必须高于顶部行

共有3003套底牌,组合(15张牌,每次5张)=(15!)/(5!(15-5)!)=3003。对于每一组可能的底部卡片,有组合(10张卡片,每次5张)=(10!)/(5!(10-5!))=252组中间卡片。最上面一行有组合(5张牌,每次3张)=(5!)/(3!*(5-3)!)=10。在没有进一步优化的情况下,蛮力方法需要评估3003*252*10=7567560个位置。我怀疑这可以在可接受的响应时间内进行评估

进一步的优化使用了一个约束,即每一行的值必须小于下面的行。如果中间一行的值大于底部一行的值,则可以通过在该点修剪树来忽略顶部一行,这将删除这些情况下的因子10

此外,由于最下面一行的工作量必须大于中间行和最上面一行的工作量,因此在尝试中间行之前,最下面一行可能必须达到一些最低分数。拒绝最底层的一行将从树上删除2520个案例

我知道有一种方法可以使用模拟退火来估计离散问题的解。我对模拟退火的使用仅限于具有边约束的连续问题。对于如何将SA应用于离散问题,我没有很好的直觉。如果搜索空间可以通过利用特定问题中的对称性和约束进行裁剪,那么许多离散问题都适合于穷举搜索


我很想知道您选择的解决方案和结果。

您是对的,事实上可能会使用暴力;我用于手部评估的库的作者表示,他能够每秒评估约250k只手,由于约7.5M的每个位置包含三只手,因此在这种情况下需要一分半钟。当中间一行的价值高于最下面一行的价值时,能够修剪当然是有益的。我将尝试实施暴力搜索并报告。