使用遗传算法将成本最小化的运输问题

时间:2018-12-03 10:56:32

标签: python-3.x genetic-algorithm

我是遗传算法的新手,这是我正在研究的一小部分内容

有工厂(1,2,3),可以为以下任何一个客户(ABC)服务,运输成本如下表所示。 A,B,C(2,4,1)有一些固定成本

     A   B   C
1    5   2   3
2    2   4   6
3    8   5   5

如何使用遗传算法解决运输问题以最小化成本

2 个答案:

答案 0 :(得分:1)

首先,您应该了解什么是遗传算法以及为什么我们这样称呼它。因为我们的行为像一个单一的细胞生物,并且进行交叉和突变以达到更好的状态。

因此,您需要首先实现染色体。根据您的情况,让我们站在客户或工厂的一边。让我们来吸引客户。您的解决方案看起来像

1-> A

2-> B

3-> C

因此,您的示例染色体为"ABC"。然后创建另一个染色体(例如“ BCA”) 现在,您需要一个拟合函数,希望将其最小化/最大化。 此功能将计算您的染色体的繁殖机会。根据您的情况,这就是总费用。 编写一个计算给定工厂和给定客户成本的函数。

现在,您要做的就是

  • 选择2条随机加权的染色体。 (权重通过拟合函数计算)
  • 从2条染色体中选取一个索引,并使用其切换部分创建新的染色体。
  • 如果新染色体具有无效部分(例如您的情况下的"ABA"),请进行固定移动(例如,使“ A”中的一个成为“ C”)。我们称之为“变异”。
  • 如果新染色体不存在,请将其添加到染色体组中。
  • 再次进入第一个过程。

您将对此进行一些迭代。您可能有数千条染色体。当您认为“足够”时,请停止该过程并按升序/降序对染色体组进行排序。第一条染色体将是您的结果。

我知道这使得处理时间/染色体依赖。我知道,如果运行不充分,可能会找到最佳染色体(根据生物学情况最合适)。但这就是遗传算法。甚至您的第一轮和第二轮也可能会或可能不会产生相同的结果,这很好。

根据您的情况,可能的染色体集非常小,因此,我保证您会在一两秒钟内找到最佳染色体。因为整个染色体对您来说是["ABC", "BCA", "CAB", "BAC", "CBA", "ACB"]

总而言之,您需要3条信息来应用遗传算法:

  • 我的染色体应该如何? (以及初始染色体组)
  • 我的拟合函数是什么?
  • 如何在我的染色体上进行交叉?

还有其他一些事情可以解决这个问题:

  • 没有变异,遗传算法可以坚持局部最优。它仍然可以用于有约束的优化问题。
  • 即使存在的染色体被交叉的可能性很小,您也不应对染色体组进行排序和截短,直到迭代结束。否则,您可能会停留在局部极值处,甚至更糟,可能会得到普通解而不是全局最优解。
  • 要加快处理速度,请选择非相似的初始染色体。没有足够的突变率,找到全局最优可能是一个真正的痛苦。

答案 1 :(得分:1)

如nejdetckenobi的答案中所述,在这种情况下,解决方案搜索空间太小,即只有8个可行解决方案["ABC", "BCA", "CAB", "BAC", "CBA", "ACB"]。我认为这只是您问题的简化版本,并且您的问题实际上包含更多的工厂和客户(但是工厂和客户的数量相等)。在这种情况下,您可以利用特殊的变异和交叉来避免回头客的不可行解决方案,例如["ABA", 'CCB', etc.]

对于突变,我建议使用交换突变,即随机选择两个客户,交换其相应的工厂(职位):

A BC 突变为A CB

A B C 突变为 C B A