Algorithm 分配工作给工人
有N个水管工,他们有M个工作要做,一般来说M>N 如果N>M,那么是时候裁员了!:) 作业的属性:Algorithm 分配工作给工人,algorithm,graph-algorithm,Algorithm,Graph Algorithm,有N个水管工,他们有M个工作要做,一般来说M>N 如果N>M,那么是时候裁员了!:) 作业的属性: 每个作业应在特定的时间窗口内执行,每个作业的时间窗口可能有所不同 每个作业的位置因作业而异 有些工作需要特殊技能。完成工作所需的技能可能因工作而异 有些工作比其他工作优先级更高。有些工作的“报酬”比其他工作高 管道工的特性: 水管工必须从一项工作开车到下一项工作,这需要时间。假设我们知道从每个工作地点到其他工作地点的旅行时间 有些水管工有其他人没有的技能 任务是找到水管工的最佳工作分配,从而使报酬
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难问题,但我没有这方面的证据。:)
我想它和这个很相似
由于空间/时间的褶皱,这似乎有点不同:管道工可以做a或B,但不能两者都做,因为它们之间的距离(完成a后不能及时到达B)。作业必须在特定的时间窗口内完成
此外,如果两项工作在时间上距离太近(即使它们在空间上距离很近),水管工可能无法同时完成这两项工作。例如,如果B必须在时间A_完成+时间A_旅行A_到B之前启动,那么B不能在A之后完成
谢谢你的建议!在这方面,任何关于好东西的建议都值得一读。即使在两个工作之间只安排一个水管工,也和NP难的旅行推销员问题一样困难 我可以推荐两种改进贪婪算法的一般方法。首先是本地搜索。在获得贪婪的解决方案后,通过分配/重新分配/取消分配几个作业,查看是否有任何小的改进。重复此操作,直到没有明显的改善或CPU时间用完 另一种方法是生成列的线性规划。这是更强大,但更多的参与。我们的想法是建立一个主计划,在主计划中,我们通过选择使用或不使用每一个可行的水管工时间表来获取尽可能多的回报,但要受到只做一次工作,不使用比现有更多水管工技能的包装限制。在解决主程序的每个阶段,对应于作业和管道工的双重值反映了执行特定作业/使用特定管道工的机会成本。子问题是如何找到水管工的路线,以便获得比水管工“成本”更多的(调整后的)报酬。这个子问题是NP难的(如上所述),但它可能适合于动态规划或进一步的线性规划技术,这取决于有多少工作。沿着这条路,你很快就会遇到学术运筹学的外部限制。类似于。