【问题标题】:"unique" crossover for genetic algorithm - TSP遗传算法的“独特”交叉 - TSP
【发布时间】:2019-08-19 20:09:21
【问题描述】:

我正在创建一个Genetic Algorithm 来解决Traveling Salesman Problem

目前,两个二维列表代表需要交叉的两个父母:

path_1 = np.shuffle(np.arange(12).reshape(6, 2))
path_2 = np.arange(12).reshape(6,2)

假设列表中的每个元素代表笛卡尔平面上的(x, y) 坐标,而二维列表代表“旅行推销员”必须走的路径(从索引 0 到索引 -1)。

由于 TSP 要求所有点都包含在路径中,因此此交叉的结果子节点必须没有重复点。

我不知道如何进行这种交叉并让生成的孩子代表父母双方。

【问题讨论】:

    标签: python-3.x numpy genetic-algorithm traveling-salesman


    【解决方案1】:

    您需要使用有序交叉运算符,例如OX1

    OX1 是一个相当简单的置换交叉。 基本上,来自父母 1 的一系列连续等位基因下降, 其余的值按照它们的顺序放置在孩子中 出现在父 2 中。

    我曾经使用这些运算符运行 TSP:

    【讨论】:

      【解决方案2】:

      你可以这样做,

      使用任何方法从一个父级选择一半(或0 to (length - 1) 之间的任何随机数)坐标,让我们说i % 2 == 0 的位置。

      可以使用多种方法将它们放置在子元素中:随机放置,或全部放置在开始(或结束)或交替位置。

      现在剩余的坐标需要来自第二个父级,您可以在第二个父级中遍历,如果没有选择坐标,请将其添加到空白处。

      例如,

      我从父 1 中选择偶数定位坐标并将其放在子元素的偶数位置索引中,然后在父元素 2 中遍历以将剩余的坐标放置在子元素的奇数位置索引中。

      def crossover(p1, p2, number_of_cities):
          chk = {}
          for i in range(number_of_cities):
              chk[i] = 0
          child = [-1] * number_of_cities
          for x in range(len(p1)):
              if x % 2 == 0:
                  child[x] = p1[x]
                  chk[p1[x]] = 1
          y = 1
          for x in range(len(p2)):
              if chk[p2[x]] == 0:
                  child[y] = p2[x]
                  y += 2
          return child
      

      这种方法保留了父母双方访问城市的顺序。

      由于它不是对称的,p1p2 可以切换给 2 个孩子,并且可以选择更好的(或两者)。

      【讨论】:

      • 我收到错误:chk[p1[x]] = 1 TypeError: unhashable type: 'numpy.ndarray'
      • 我用 python 列表测试过,而不是用 numpy 数组。
      • 我在回答中使用的是一个 numpy 数组。鉴于我正在尝试优化我的交叉点,这也是我的遗传算法中最常用的函数,您能否具体解决这些问题?
      • Chk 用于查看点 (x1, y1) 是否已存在于子路径中,因此您可以使用由元组组成的 1D numpy 数组来代替使用 2D numpy 数组哪些是可散列的,或者你可以试试this
      猜你喜欢
      • 2010-12-05
      • 2014-08-12
      • 1970-01-01
      • 2016-08-31
      • 2015-07-03
      • 2016-09-16
      • 1970-01-01
      • 2021-02-06
      相关资源
      最近更新 更多