有N个管道工和他们要做的M个工作,其中M> N一般。
如果N>那么现在是裁员的时候了! :)
工作属性:
水管工的属性:
任务是找到最适合管道工的工作分配,以便最大化奖励。
可能并非所有工作都可以完成。例如,有一个管道工和两个工作,如果他们正在做工作A,他们可能无法完成工作B,因为他们没有足够的时间从A到B工作完成A和B应该开始。在这种情况下,最佳方案是让水管工以最大的回报完成工作,我们就完成了。
我在想一个像这样工作的贪婪算法:
sort jobs by reward
while true:
for each job:
find plumbers that could potentially handle this job
make a note of the association, used in next loop
if each plumber is associated with a different job, break
for each job that can be handled by a plumber:
assign job to a plumber:
if more than one plumber can handle this job, break tie somehow:
for instance if plumber A can do jobs X,Y but
plumber B can only do X, then give X to B.
else just pick a plumber to take it
remove assigned job from further consideration
if no jobs got assigned:
break out of "while true" loop
我的问题:有更好的方法吗?看起来像NP难题,但我没有证据。 :)
我猜它与Assignment Problem类似。
似乎它有点不同但是由于空间/时间的皱纹:水管工可以做A或B,但不是两者都因为它们之间的距离(完成后不能及时到达B)一个)。必须在某些时间窗口完成工作。
如果水管工在时间上太近(即使它们在太空中很近),也可能无法接受这两项工作。例如,如果必须在time_A_finished + time_to_travel_A_to_B之前启动B,那么B不能在A之后完成。
感谢您的任何想法!关于在这个领域阅读的好东西的任何指针也很受欢迎。
答案 0 :(得分:2)
即使在工作之间只安排一名管道工也与NP难以驾驶的销售员问题一样困难。
我可以建议两种改进贪婪算法的通用方法。首先是本地搜索。获得贪婪的解决方案后,通过分配/重新分配/取消分配一些作业,查看是否有任何小的改进。重复,直到没有明显改进或CPU时间用完为止。
另一种方法是使用列生成进行线性编程。这更强大但涉及的更多。我们的想法是建立一个主程序,我们尝试通过选择使用或不使用每个可行的管道工时间表来尽可能多地获取奖励,但要受到仅仅做一次工作且不使用更多管道工技能的包装限制的限制。可用。在解决主程序的每个阶段,对应于作业和管道工的双重值反映了执行特定工作/使用特定管道工的机会成本。子问题是计算出如何管道水管工以便获得比水管工更多(调整后)的奖励"成本"。这个子问题是NP难的(根据上面的注释),但它可能适用于动态编程或进一步的线性编程技术,具体取决于有多少个工作。按照这条道路,你将迅速进入学术运作研究的外部极限。