每当我遇到难以解决的优化问题时,我都会想到遗传算法。我下面的解决方案假设您熟悉 GA(自己实现并不难)
查看您提供的示例图,让我们假设节点将放置在 NxN 网格(整数位置)上,然后对基因组进行编码,考虑以下方案:
00101 00100 11010 11110 11000
A B C D E
其中每个部分对节点(按该顺序)在网格中的位置(二进制)进行编码。每个部分的长度取决于网格的大小( length=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
接下来我们像往常一样设计交叉算子(一个或两个点交叉),以及变异(随机翻转一位)。我们只需要确保在任何时候,我们在网格内都只有有效的位置。
最后,适应度函数将是路径上节点之间距离的某个函数(多条路径的总和),它将惩罚长路径(作为最小化问题)。一个例子是节点之间的街区距离。
该方法的其余部分是标准遗传算法(初始化、评估、选择、复制、终止)。
示例
为了说明,考虑前面的布局与城市街区距离,给定以下两条路径: 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
显然,目标是找到最小化适应度函数的布局。