订单转换

时间:2016-06-03 05:45:25

标签: algorithm sorting

说我有两个订单ABCDE和EDCBA,我想从一个改为另一个。 但我一次只能交换两组订单,每组的成本相关。

所以在这种情况下,我可以从(A)(BCDE)到(BCDE)(A)到(B)(CDE)A到(CDE)(B)(A)到(C)(DE) BA到(DE)(C)(B)(A)到EDCBA,成本为成本(A)*成本(BCDE)+成本(B)*成本(CDE)+成本(C)*成本(DE) )+成本(D)*成本(E)

在其他情况下,如果我想从ABCD转到CDBA,我可以用成本(AB)*成本(CD)一步完成(AB)(CD)到(CD)(BA)。

我想问一下我可以使用哪些算法(1)最小化将一个订单转换为另一个订单所需的步骤,以及(2)如果我还想最小化成本怎么办? (最小化成本并不一定意味着最小化步骤)

1 个答案:

答案 0 :(得分:1)

这对我来说就像shortest path problem,类似于其他“如何从一个州到另一个州”,如15-puzzle

当将其解决为最短路径问题时,您将问题建模为图形,其中所有有效状态(在您的情况下,字符的所有排列)都是顶点,并且所有有效变换都是边。正式:

G = (V,E)
V = { p | p is a permutation of the start/end state }
E = { (u,v) | can transform u to become v in one step }

在加权版本(最低成本)中,您还有一个权重函数:w(u,v),这是进行转换的成本。

拥有图形模型后,基本上可以找到从一个源(起始状态)到一个目标(目标)的最短路径。

这可以通过以下方式解决:
未加权(最短距离):

加权(最小成本):

重要提示:

你不需要在开始之前生成图形,你可以有一个函数next:V->2^V,给定一些状态 - 从中​​生成所有可能的转换。然后,您可以使用此next()函数中的任何算法,并生成(动态)解决方案中所需的图形部分。