在列表中查找元素集,元素只能使用一次-如何处理算法

时间:2018-10-27 00:46:36

标签: algorithm list sorting recursion set

我有以下列表

Cards: [B1 G1 O1 R1 G2 G3 R4]
Sets:  [G1 G2 G3]
Sets:  [B1 G1 O1 R1]

一组可以是相同颜色但连续的卡片 或价值相同但颜色不同的卡片

我的排序算法快要结束了,这是我遇到麻烦的地方。

目标是玩尽可能多的纸牌。我创建的AI可以找到集合。我的问题是我不确定如何使用算法来帮助AI做出正确的决定。

如果首先播放最大的Set[B1 G1 O1 R1],则它将无法播放Set[G1 G2 G3]

当然,如果它先播放set[G1 G2 G3],那么它将能够播放[B1 O1 R1]

当我到达这么小的列表时。如何计算AI的最佳路径?任何帮助将不胜感激..

1 个答案:

答案 0 :(得分:0)

这是一种指数爆炸的方法,因此仅适用于一小部分卡片。这可能对您来说就足够了,或者可能为找到更好的解决方案指明了方向,所以我想我会写出来的。

创建一个图形,其节点是可以创建的集合。因此,在您的情况下,节点为:

{G1,G2,G3} {G1,G2} {G2,G3} {B1,G1,O1,R1} {B1,G1,O1} {B1,G1,R1}, {B1,O1,R1} {G1,O1,R1} {B1,G1} {B1,O1} {B1,R1} {G1,O1} {G1,R1} {O1,R1}

如果这两个集合是兼容的选择,即它们没有交集,则现在将两个具有边缘的节点连接起来。因此您图形中的边缘是

{G1,G2,G3} -- {B1,O1,R1} 
{G1,G2,G3} -- {B1,O1}
{G1,G2,G3} -- {B1,R1}
{G1,G2,G3} -- {O1,R1}
{G1,G2} -- {B1,O1,R1}
{G1,G2} -- {B1,O1}
{G1,G2} -- {B1,R1}
{G1,G2} -- {O1,R1}
{G2,G3} -- everything after it
{B1,G1,O1,R1} -- nothing after it 
same for all the 3 element subsets from there on 
{B1,G1} -- {O1,R1} 
{B1,O1} -- {G1,R1} 
{B1,R1} -- {G1,O1}

您现在的目标是在该图中找到最大的集团,集团是相互兼容的集合...集团中的每对节点之间都有一条边。您可以使用一些库来查找最大的集团,但它或多或少归结为蛮力搜索(CLIQUE是NP困难的)。一个库至少可以为您节省一些打字时间。实际上,您想要的是最大集团,集团的值是节点权重的总和,其中节点的权重是集合中与该节点相对应的元素数。集团图书馆将为您找到最大的集团。

可能有更好的方法,但这就是我目前所拥有的。