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

时间:2016-04-20 14:26:41

标签: java optimization scheduling genetic-algorithm job-scheduling

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

我正在编写项目计划优化库,这是一种特殊的作业车间调度问题。为了简单起见,到目前为止,我的算法只能用 worker 作为项目的唯一资源(以后我应该能够添加更多资源),并且只有两种类型的约束(稍后)到目前为止还会有更多的限制:

1)每个工人都限制他可以从事哪些项目。 只有一些工人熟练地在同一个项目上工作(例如:W1,W3,W7工人可以在项目P2上工作; W2,W3,W5可以在项目P3上工作;等等),但同样的工人可以熟练地工作多个项目,并允许在不同的时间处理多个项目(例如:W1连续工作在P1 5天[甚至几小时],然后他切换到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; 效率:10小时/天;项目的可用:P1,P2,P3,P4
  • W2; 效率:5小时/天;项目的可用:P1,P3
  • W3; 效率:8小时/天;项目的可用:P1,P4
  • W4; 效率:每天6小时;项目的可用:P2,P4

如果像这样设置了一个问题,我发现一个染色体(单一时间表)应该代表哪个工作人员在最后一个项目完成之前每一小时工作一个项目。

在这个例子中,时间表应该从4月20日到7月1日+ 60天。所以总共130天x 12小时= 1560小时。在每个广告位中,该小时广告位应该有一个具有指定项目的工作人员

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

1 个答案:

答案 0 :(得分:1)

你肯定不必分配任何东西,而是一个阵列。通过4个项目和4个工作人员,您可以预先分配所有4 * 4组合并在染色体中存储对它们的引用。

即使有数百个项目和工人,这也是可行的。您可以存储它们的索引,甚至可以将它们打包成一个更长的整数类型(最多有20亿个项目和工作者,long会这样做。)

然而,这是一个非常不成熟且可能无用的优化,因为其他操作很可能会主导运行时间。