我正在开发一种遗传算法来找到点之间的最佳连接(最小化距离)。 让我们假设我们有两个点列表:
element.value=value;
element.title = element.options[element.selectedIndex].text;
我决定将基因组表示为2D二进制数组,其中:
这种表示意味着矩阵中的每一列和每行最多只能有一个1。
现在我正在努力寻找能够保持解决方案完整性的交叉运算符。
示例:
parent1:
sources = {s1, s2, s3}
targets = {t1, t2, t3, t4}
parent2:
[0][1][0][0]
[0][0][1][0]
[1][0][0][0]
后代:???
有什么建议吗?
答案 0 :(得分:1)
保持您的表示并假设目标多于源,您可以使用具有内置修复算法的行交换交叉运算符。
i
)i-th
行1
移至免费(随机或近列)列E.g。
随机选择第0行
PARENT 1 PARENT 2
ROW 0 [0][1][0][0] <-crossover-> [0][0][1][0]
ROW 1 [0][0][1][0] [1][0][0][0]
ROW 2 [1][0][0][0] [0][0][0][1]
修复前的后代
CHILD 1 CHILD 2
[0][0][1][0] [0][1][0][0]
[0][0][1][0] and [1][0][0][0]
[1][0][0][0] [0][0][0][1]
CHILD2
没问题(对于列交换运算符,这不会发生); CHILD1
需要修复操作员
CHILD 1
[0][0][X][0]
[0][0][X][0]
[1][0][0][0]
保持交换的行(第0行)并更改另一个冲突的行(第1行)。将1移动到空闲列(第1列或第3列)
CHILD 1
[0][0][1][0]
[0][1][0][0]
[1][0][0][0]
后代
CHILD 1 CHILD 2
[0][0][1][0] [0][1][0][0]
[0][1][0][0] and [1][0][0][0]
[1][0][0][0] [0][0][0][1]
答案 1 :(得分:0)
您可以将BFS推广到这种情况。 (如果我正确理解任务)
在简单的图形遍历任务中,您需要找到从起始节点到结束节点的最短路径,因此您需要存储从该节点的起始节点和前一个节点开始的每个节点距离(来自您来自的单元)。在BFS迭代算法之前,您需要将起始节点添加到队列中。在每次迭代中取一个项目,检查此节点是否为完成节点,并将此节点的邻居节点添加到队列等。因此,我们如何将此算法推广到多个开始和结束节点。非常简单。
此泛化的时间复杂度不依赖于开始和结束节点的数量,与简单的BFS算法相同:O(V + E)