algorithm - 在列表中查找元素集,元素只能使用一次 - 如何处理算法
问题描述
我有以下列表
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 的最佳路径?任何帮助,将不胜感激..
解决方案
这是一种呈指数级增长的方法,因此它仅适用于一小部分卡片。它可能对你来说已经足够了,或者它可能指向更好的解决方案,所以我想我会写下来。
创建一个图,其节点是可以制作的集合。所以在你的情况下,节点是:
{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-hard)。图书馆至少可以为您节省一些打字时间。实际上,你想要的是一个最大团,其中一个团的值是节点权重的总和,其中一个节点的权重是该节点对应的集合中的元素个数。派系库将为您找到最大的派系。
可能有更好的方法,但这就是我现在所拥有的。
推荐阅读
- python - 在 Scapy 中更改数据包字节序
- basic - 在 Visual Studio 2017 Visual Basic 中,我收到“预期语句结束”错误
- css - 在最小化图像从位置 CSS 下降
- commercetools - 是否可以按键引用?
- java - 我无法可视化位于 Java 容器中的 Oracle 库中的表
- javascript - Javascript 对象,用于循环多维数组以创建新对象
- c - 从 C 中的结构数组打印信息
- c# - 为什么3次后代码发送数据成功?
- c# - 如何在 Linq 中进行此查询?
- python - 将带有 Celeris 的 Django 部署到 Heroku