对不起,我不能拿出算法或问题的名称为以下算法。我会说明问题,然后说明我曾经尝试过的方法,也许有人可以将我指向正确的方向。探索一个算法来找到包含某些项目的最小链条
想象一下,你有一袋物品(无序,允许重复)。在实践中,如果这种放松有帮助,袋子可以包含2-20个物品。
我们的目标是找到最小长度链(如果我们有不同的链条概念,我们可以找到最小长度链),它包含包中所有物品的任何顺序。
一个链包含一个开始标记(袋中不存在),后跟任意数量的项,后跟一个结束标记(也不在袋中)。
链是通过将n元组拼凑在一起形成的(顺序很重要),并且作为进一步的放松让我们说n值对于所有元组都是相同的。在实践中,我正在使用n = 3。链可以是“混合”的,而不是串联,如果它们有重叠的元素。例如,考虑(a,b,c)和(c,d,e)。可以连接为(a,b,c,d,e)。同样,(a,b,c)和(b,c,d)可以作为(a,b,c,d)相连。有些元组可能在第一个位置有一个开始令牌,有些令牌在最后一个位置有一个结束令牌,这当然可以解决问题。
因此,在我看来,对这个问题的确切解决方案一般来说不易处理。某种优化算法对于获得问题的“良好”解决方案将是必要的。我可以生活的“好”解决方案。
我开始的是一种贪婪的方法,在第一次通过时,您会发现包含袋子中元素数量最多的元组,任意断开关系。创建一个持有我们迄今为止构建的链的数据结构,并将选定的元组粘贴到这个数据结构中。将问题分解为2个子问题,即开始令牌侧和结束令牌侧。在子问题1的数据结构的第一个标记是一个开始标记并且子问题2的最后一个标记是一个结束标记之前,增长链条以便我们尽可能快地找到停止条件(开始或结束标记取决于在子问题上),同时也试图尽快耗尽包的内容。这可能不是很好,因为每个子问题都必须相互沟通,以确定需要包括在袋子中的物品数量。
任何人在任何地方见过这个问题?有关如何改进(或正确工作)该算法的任何想法?这是我正在处理的一个真正的问题,这是一个更大系统的智能部分,不是玩具问题或家庭作业问题。
编辑
对不起今天所有我一直远离电脑。我将尝试发布一个不是太简单但不太复杂的示例解决方案。
鉴于:
Bag = {A, B, C, D}
(I使它例如起见一组,但每个项可以出现一次以上)/ = Start Token
\ = End Token
3-元组(Triples):为了简化命名,我将它们标记为ag。小写字母在问题中没有实际功能。
(/,A, E) a (/,C, D) b (/,G, H) c (D,B, A) d (C,G, H) e (B,A, \) f (G,H, \) g
解决方案:如果我们链在一起B,d和f我们得到(/,C,D,B,A,\)
。
这是最短的链,包含袋子中的所有元素,如果您计算开始和结束标记,则链长度为6。通常,最短的路径是长度| BAG | + 2,如果它实际存在。我希望我的问题陈述现在更有意义。
对不起,我没有理解这个问题。你可以添加一个简单的测试用例及其最佳解决方案吗? – amit
恕我直言,“重复允许”是无稽之谈。对于一对双胞胎1)如果他们有相同的输入/输出路径,其中一个是多余的。 2)如果他们有不同的路径,节点不能相同。另外:如果它们是重复的,则节点(及其路径)应该合并/组合。 – wildplasser
如果我有一个解决了你的问题的盒子,我可以用它来解决http://en.wikipedia.org/wiki/Hamiltonian_path? – mcdowella