我想绘制一个类似这样的图形: alt text http://img25.imageshack.us/img25/9786/problemo.png
你可以看到3个:a,b& C。如何更改元素(1,2,3 ...,9)的位置以使路径尽可能短?我的意思是这条线应该尽可能短。
我对它非常感兴趣,因为我正在绘制一个带有问题的图表,某种类似的信息图表,如“按照线条来了解答案”。我知道它有点关于图论...所以如果它太难了,你知道是否有任何程序用于压缩这样的东西?
例如,程序应该像这样工作: 在输入中它应该得到3个
a='1,5,7,8,4,2,6' b='4,2,3,6,9,8,5' c='7,9'
在输出中应该是这些元素的坐标。
答案 0 :(得分:3)
每当我遇到难以解决的优化问题时,我会想到genetic algorithms。我的解决方案假设您熟悉GA(自己实施起来并不困难)
看一下您给出的示例图,让我们假设节点将被放置在NxN网格(整数位置)上,然后编码基因组,请考虑以下方案:
00101 00100 11010 11110 11000
A B C D E
其中每个部分编码节点的网格中的位置(以二进制形式)(按此顺序)。每个部分的长度取决于网格的大小(长度= ceil(log2(N * N))) 网格从左到右逐行编号。
例如,对于包含4个节点(A,B,C,D)和3x3网格的完整图形,字符串:
0011 0001 0101 1000 = 3 1 5 8
A B C D A B C D
表示以下布局:
. B . 00 01 02
A . C 03 04 05
. . D 06 07 08
接下来,我们像往常一样设计 crossover 运算符(单点或双点交叉),并且变异也是如此(随机翻转一位)。我们必须确保在任何时候,网格内只有有效位置 最后,适应度函数将是路径上节点之间距离的函数(多个路径的总和),这将对长路径进行处罚(作为最小化问题)。 一个例子是在节点之间取city-block distance 该方法的其余部分是标准遗传算法(初始化,评估,选择,再现,终止)。
示例强>
为了说明,考虑以下两条路径,考虑具有城市街区距离的先前布局:A D C B
和C B D A
A -> D -> C -> B
3 + 1 + 2 = 6 therefore
C -> B -> D -> A fitness(0011 0001 0101 1000) = 6 + 8 = 14
2 + 3 + 3 = 8
显然,目标是找到最小化适应度函数的布局。