遗传算法 - 加权图中的最短路径
Genetic algorithm - shortest path in weighted graph
我想制作一个遗传算法来解决加权连通图中的最短路径问题。类似于旅行推销员,但不是全连接图,只是连接图。
我的想法是为每条染色体以二进制形式随机生成一条由n-1个节点组成的路径,其中数字表示路径中的节点。然后我会根据权重的总和(如果不能从 A 到 B 我会给它惩罚)和其中的 crossover/mutate 位来选择最好的。它会工作吗?感觉有点像缩小版的蛮力。有没有更好的方法?
谢谢!
遗传算法差不多"smaller version of bruteforce"。它只是一种元启发式,而不是具有良好收敛保证的优化方法。它基本上依赖于随机性来提供新的解决方案,因此它是"slightly better random search"。
那么"will it work"?是的,它会做一些事情,只要你有足够的变异随机性,它甚至(最终)会收敛到最优。它会比随机搜索更好用吗?很难说,这取决于几十个因素,不仅是你的编码,还有所有使用的超参数等等。一般的遗传算法都是关于试验和错误的。特别是不丢失任何信息的染色体表示(你的不丢失)无关紧要,这意味着一切都取决于交叉和变异的巧妙实施(只要染色体不丢失任何信息)信息它们都是等价的)。
已编辑。
可以使用置换编码GA。在置换编码中,您应该给出起点和终点。 GA 用你的适应度函数搜索最好的染色体。候选解决方案(染色体)将像 2-5-4-3-1 或 2-3-1-4-5 或 1-2-5-4-3 等。因此您的解决方案取决于您的健身功能。 (查看 R 的 GA 包以轻松应用置换 GA。)
连接是您问题的约束条件。我最好的建议是创建一个这样的约束矩阵:
FirstPoint SecondPoint Connected
A B true
A C true
A E false
... ... ...
在标准 TSP 中,只考虑距离。在你的适应度函数中,你必须考虑这个矩阵并为每个 false 添加对 return 值的惩罚。
Example chromosome: A-B-E-D-C
A-B: 1
B-E: 1
E-D: 4
D-C: 3
Fitness value: 9
.
Example chromosome: A-E-B-C-D
A-E: penalty
E-B: 1
B-C: 6
C-D: 3
Fitness value: 10 + penalty value.
因为你的约束是硬约束,你可以使用最大整数值作为惩罚。 GA 将找到最佳解决方案。 :)
我想制作一个遗传算法来解决加权连通图中的最短路径问题。类似于旅行推销员,但不是全连接图,只是连接图。
我的想法是为每条染色体以二进制形式随机生成一条由n-1个节点组成的路径,其中数字表示路径中的节点。然后我会根据权重的总和(如果不能从 A 到 B 我会给它惩罚)和其中的 crossover/mutate 位来选择最好的。它会工作吗?感觉有点像缩小版的蛮力。有没有更好的方法?
谢谢!
遗传算法差不多"smaller version of bruteforce"。它只是一种元启发式,而不是具有良好收敛保证的优化方法。它基本上依赖于随机性来提供新的解决方案,因此它是"slightly better random search"。
那么"will it work"?是的,它会做一些事情,只要你有足够的变异随机性,它甚至(最终)会收敛到最优。它会比随机搜索更好用吗?很难说,这取决于几十个因素,不仅是你的编码,还有所有使用的超参数等等。一般的遗传算法都是关于试验和错误的。特别是不丢失任何信息的染色体表示(你的不丢失)无关紧要,这意味着一切都取决于交叉和变异的巧妙实施(只要染色体不丢失任何信息)信息它们都是等价的)。
已编辑。
可以使用置换编码GA。在置换编码中,您应该给出起点和终点。 GA 用你的适应度函数搜索最好的染色体。候选解决方案(染色体)将像 2-5-4-3-1 或 2-3-1-4-5 或 1-2-5-4-3 等。因此您的解决方案取决于您的健身功能。 (查看 R 的 GA 包以轻松应用置换 GA。)
连接是您问题的约束条件。我最好的建议是创建一个这样的约束矩阵:
FirstPoint SecondPoint Connected
A B true
A C true
A E false
... ... ...
在标准 TSP 中,只考虑距离。在你的适应度函数中,你必须考虑这个矩阵并为每个 false 添加对 return 值的惩罚。
Example chromosome: A-B-E-D-C
A-B: 1
B-E: 1
E-D: 4
D-C: 3
Fitness value: 9
.
Example chromosome: A-E-B-C-D
A-E: penalty
E-B: 1
B-C: 6
C-D: 3
Fitness value: 10 + penalty value.
因为你的约束是硬约束,你可以使用最大整数值作为惩罚。 GA 将找到最佳解决方案。 :)