抱歉,我无法为下面的算法想出一个算法或问题的名称。我将陈述问题,然后说明我所尝试的内容,也许有人可以指引我正确的方向。
假设你拥有一个物品袋(无序,允许重复)。在实践中,袋中可能包含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的最后一个标记为结束标记之前,增加链,以便尽快找到停止条件(根据子问题而定的起始或结束标记),同时尽快耗尽袋中的内容。这可能不是很好,因为每个子问题都必须相互通信,以了解需要包括在袋中的剩余物品数量。
有人在任何地方看到过这个问题吗?有什么想法来改进(或使这个算法正确工作)?这是一个真正的问题,我正在处理它,它是一个更大系统的智能部分,不是玩具问题或家庭作业问题。
编辑:
抱歉,我今天离开电脑了。我将尝试发布一个示例解决方案,它既不是太琐碎,也不是太复杂。
给定:
假设你拥有一个物品袋(无序,允许重复)。在实践中,袋中可能包含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 make it a set for the sake of example, but each item can appear more than once)/ = Start Token
\ = End Token
3-Tuples (Triples): I label them a-g for simplicity in naming. The lowercase letters have no actual function in the problem.
(/,A, E) a (/,C, D) b (/,G, H) c (D,B, A) d (C,G, H) e (B,A, \) f (G,H, \) g
(/,C,D,B,A,\)
。这是包含所有元素的最短链,如果你计算开始和结束标记,它的长度为6。通常情况下,如果最短路径确实存在,则其长度为 |BAG|+2。希望我的问题陈述现在更加清晰明了。