我正在编写项目计划优化库,这是一种特殊的作业车间调度问题。为了简单起见,到目前为止,我的算法只能用 worker 作为项目的唯一资源,到目前为止只有两种类型的约束:
1)每个工人都限制他可以从事哪些项目。 只有一些工人熟练地在同一个项目上工作(例如:W1,W3,W7工人可以在项目P2上工作; W2,W3,W5可以在项目P3上工作;等等),但同样的工人可以熟练地工作多个项目,并允许在不同时间处理多个项目(例如:W1连续5天在P1上工作,然后他切换到P2 4天,然后他回到P1等)
2)每个工人都限制他每天可以工作多少小时 - 这应该代表工人的效率
首先,我创建了一个简单的时间表,仅包含4个项目和4个工作人员。
项目:
工:
如果像这样设置问题,遗传算法的染色体应该是什么样的,换句话说,如何将这些数据转换成遗传算法将知道如何工作的GA染色体用(计算它的数值适应度)?
Java
中的一个例子是完美的。
答案 0 :(得分:1)
我想我每天都要接受他们工作的工人和项目。 因此,对于每个预定的日期,请记下每个工作人员他们将要处理的项目。
然后,您可以计算适合度,作为在给定分配的每个项目截止日期之前完成的工作百分比。
突变可以在某一天将工人的分配更改为其他项目。 交叉可以将工作人员的分配与不同的基因组交换一天或多天,或者将所有工作人员的完全分配与一个或多天交换为不同的染色体可能更有效
答案 1 :(得分:1)
flup's answer中的直接解决方案很可能会导致突变产生几乎没有任何有效的时间表。并且交叉会更糟糕。
问题在于做错事太容易了。从最佳安排的工作人员那里,只需一步就可以安排他们。由于最佳通常是某个n维多面体的顶点,因此它与无效状态接壤。
所以我建议用染色体部分进行间接表示,比如“如果可能的话,将W2分配给P3”。对于你的日程安排的每一小时,你都要经过染色体部分并尽可能地应用它的规则。
这可以相当简单地优化,这样你就不必每小时处理一次(下一个小时的结果通常是相同的)。
实际上,通过观察只有少数相关时间点,即项目的开始和截止日期,很可能可以准确地解决上述问题。在他们之间,所有小时数在以下意义上是相同的:当您交换5月1日的时间表和5月2日的时间表时,您将得到完全相同的结果。使用这种等价物,问题可能是一种暴力强迫。