项目调度GA:染色体的高效数据结构



这是我之前的问题的延续,即如何表示单个染色体,我找到了一种方法,但我对如何在内存中表示这一点有问题。

我正在写一个项目调度优化库,这是一个Job Shop调度问题的特殊类型。简单地说,到目前为止,我的算法只适用于工人是项目的唯一资源(稍后我应该能够添加更多资源),并且到目前为止只有两种类型的约束(稍后也会有更多的约束):

1) 每个工人都对自己可以从事的项目有限制。只有一些工人能够胜任同一项目(例如:W1、W3、W7工人可以胜任P2项目;W2、W3和W5工人可以胜任P3项目;等等),但同一工人可以胜任多个项目,并且被允许在不同的时间从事多个项目(例如:W1连续5天[甚至几个小时]在P1工作,然后他切换到P2工作4天,然后他回到P1,等等)

2) 每个工人每天能工作多少小时都有一个限制——这应该代表一个工人的效率

首先,我创建了一个简单的时间表,其中只有4个项目和4名工人。

项目:

  • P1开始:5月1日截止日期:30天所需工作时间:300
  • P2开始:7月1日截止日期:60天所需工作时间:150
  • P3开始:5月15日截止日期:45天所需工作时间:50
  • P4开始:4月20日截止日期:20天所需工作时间:150

工人

  • W1效率:10h/天可用于项目:P1、P2、P3、P4
  • W2效率:5h/天可用于项目:P1、P3
  • W3效率:8h/天可用于项目:P1、P4
  • W4效率:6h/天可用于项目:P2、P4

在设置这样的问题时,我发现一个染色体(单个时间表)应该代表哪个工人每一个小时在哪个项目上工作,直到最后一个项目完成。

在这个例子中,时间表应该从4月20日到7月1日+60天。因此,总共130天x 12小时=1560小时。在每个时段中,应该有一名工作人员负责该时段的指定项目

插槽使用的正确数据结构是什么(为每个插槽分配新的Worker对象似乎效率很低?),并且能够进行交叉和变异?

您当然不需要分配任何东西,只需要分配一个数组。使用您的4个项目和4个工作人员,您可以预先分配所有4*4组合,并将对它们的引用存储在您的染色体中。

即使有数百个项目和工人,这也是可行的。您可以存储它们的索引,甚至可以将它们打包为更长的整数类型(对于多达20亿个项目和工作人员,long就可以了)。

然而,这是一个为时过早的优化,可能毫无用处,因为其他操作很可能会主导运行时间。

最新更新