遗传算法的动态适应度函数

时间:2012-03-21 12:27:33

标签: genetic-algorithm job-scheduling

我不确定我是否完全理解遗传算法以及它们是如何工作的,我试图通过ai4r http://ai4r.rubyforge.org/geneticAlgorithms.html来学习

如果在Job Shop Scheduling中,我相信可以通过GA(?)解决,那么任何一项工作的成本是否与它的前辈相关?我以为我会根据染色体的位置来计算成本,并根据其放置的动态得分而不是二进制值,但我不确定这是否有效。

有人有这方面的经验吗?或者只有当任何两个基因组之间的差异是静态的时,GA才起作用吗?

我希望我在这里有正确的术语,正如我所提到的,我只是在学习。

-----------------------更新----------------------- ------------

我想我在这里使用了一些错误的术语。当我认为我真正想要使用的是cost matrix时,我提到了“健身”。

我要去的例子描述了这个

Each chromosome must represent a posible solution for the problem. This class conatins an array with the list of visited nodes (cities of the tour). The size of the tour is obtained automatically from the traveling costs matrix. You have to assign the costs matrix BEFORE you run the genetic search. The following costs matrix could be used to solve the problem with only 3 cities:


data_set = [    [ 0, 10, 5],
        [ 6,  0, 4],
        [25,  4, 0]
    ]
Ai4r::GeneticAlgorithm::Chromosome.set_cost_matrix(data_set)

所以在我的例子中,我认为每条染色体的“成本”都是动态的,基于它的邻居。

2 个答案:

答案 0 :(得分:2)

由于您在评论中要求回答这个问题,我自由地总结了我之前的回复,所以它都集中在一个地方。答案是"什么是惩罚用语"在下面的第3项中。

标准遗传算法的工作方式是每个染色体"是问题的完整解决方案。在您的情况下,要提交作业的订单。我认为,这种混淆的中心是这样一种观念,即由于特定工作在该时间表中对健身的个人贡献因时间表的其他部分而异,因此您必须需要一些动态的东西"。这不是真的。从GA的角度来看,唯一具有适应性的是整个解决方案。因此,动态问题是整个时间表的适应性随时间变化的问题。回到TSP,一个动态问题是,按照A,B,C,D和E的顺序巡回城市每次尝试时实际上都有不同的距离。虽然通过B的旅行费用取决于旅行中B之前和之后的哪些城市,但一旦你决定,成本是静态的,并且由于GA只收到整个旅行的费用,所以它知道的是[ A,B,C,D,E]具有恒定的适应性。不需要动态技巧。

现在,您的第二个问题是如何处理约束,例如,对于TSP示例,如果您需要确保销售人员在某个时间到达巴黎会怎么样?通常,有三种方法可以尝试处理此问题。

  1. 决不允许生成在2:00之前无法到达的解决方案。有时这很容易,有时很难。例如,如果约束是"他不能从城市X"开始,只是不能生成不以X开头的解决方案相当容易。通常,只需找到有效的解决方案可能很难,所以这种方法并不真正有效。

  2. 允许违反约束,但之后要修复它们。在TSP示例中,您允许交叉和变异产生任何可能的巡视,但是然后扫描它以查看他是否太晚到达巴黎。如果是这样,请将巴黎的位置与之前的某个城市交换。尽管如此,有时很难找到修复违规行为的好方法。

  3. 惩罚不可行解决方案的适用性。在这里,我的想法是,即使我不能阻止他太晚到达巴黎而且如果他这样做也无法修复它,我至少可以使健身状况恶化。对于TSP,健身是旅游的长度。所以你可能会说,如果一次旅行让他到巴黎太晚了,那么健身就是旅游的长度+ 100。这让解决方案留在了人群中(否则可能会非常好,所以你想要它有机会传递一些基因),但你选择它的可能性较小,因为你的选择和替换方法会选择具有更好适应度值的个体。

  4. 对于您的JSP问题,通常您希望最小化完工时间。如果您有一些约束,可以使用相同的三个选项。但据我所知,你并没有真正有这样的限制。我认为你试图在过程中注入太多的知识,而不是让进化算法自己提出来。也就是说,你不必担心告诉GA一些工作安排比其他工作更好。你只需为更好的适应性分配更高的适应性,让这个过程收敛。

    也就是说,注入这样的信息通常是一件非常好的事情,但是你希望首先对基本算法有一个很好的理解。让我们知道,对于TSP来说,一个好的解决方案更有可能连接彼此靠近的城市。我在GA中使用该信息的方式是非均匀地生成随机解(也许使用贪心启发式)。我也可以用定制的东西替换标准的交叉和变异算法。与交叉相比,突变通常更容易实现。为了改变TSP解决方案,我可能会选择两个连接的城市,打破连接,然后寻找一种重新连接它们的方式,即更接近"。也就是说,如果巡回是[A,B,C,D,E,F,G,H],我可能会随机选择边缘[B,C],然后寻找另一条边,也许是[F,G] ],当我将它们横向连接以获得[A,B,G,D,E,F,C,H]时,总游览长度较低。我甚至可以将该突变扩展到一步之外 - 创建一个循环,一直试图打破并重新连接边缘,直到它找不到更短的游览。这导致了通常所谓的混合GA,因为它是与本地搜索混合的GA;有时也称为Memetic算法。这些算法通常优于黑盒GA,因为您提供算法"提示"将它偏向于尝试你期望的好事。

    我认为这种模因算法的想法非常接近你在原始问题中所遇到的问题,这个问题想知道如何处理特定工作对健身的贡献取决于其他工作在哪里。时间表。唯一的绊脚石是你有点不走运,认为这有点合理的想法是"动态"导致你有点误入歧途,因为"动态"实际上这意味着完全不同的东西。

    总而言之,没有什么"动态"关于你的问题,所以人们用GA做动态问题的事情将完全没有用。一个标准的GA将没有花哨的技巧。但是,使用有关哪些计划更好地工作的信息的想法可以被引入到遗传算子中,并且可能会产生明显更好的整体算法。

答案 1 :(得分:0)

你可以使用GA找到最好的订单来做一些工作,或那些最能充分利用一天资源的工作。所以是的,他们彼此相关。

因此,您的适应度将是针对seq 1,3,4,5,6,2。

看看说找到最短路径算法,然后开始有意义