我的系统具有以下属性:
有工人从事工作。可以添加或删除工人。每个工作人员可以同时运行多个作业。
有工作。这些工作永远运行(无限期)并分配给工人。可以添加或删除作业。
我正在使用循环法在启动时为工作人员分配工作,这项工作非常顺利。
但是,我希望在添加和删除工作人员以及添加和删除工作时重新平衡分配给工作人员的工作。
虽然可以在上述任何更改发生时使用循环算法重新分配所有内容,但它会进行比所需更多的更改。
换句话说,是否有任何循环重新平衡算法会导致分配的差异/更改量最小化?
答案 0 :(得分:1)
我认为,您的循环法以下列方式分配作业:
W1 W2 W3 W4
-----------------
J1 J2 J3 J4
J5 J6 J7 J8
J9
添加新工作非常简单。您只需记住您分配了上一个作业的工作人员(循环算法的状态,将在下文中称为最后一个工作人员)并将新作业分配给下一个工作人员。增加最后一名工人。
如果要删除作业(例如上例中的J7
),请执行以下操作:首先,删除作业:
W1 W2 W3 W4
-----------------
J1 J2 J3 J4
J5 J6 J8
J9
然后选择最后一个工作人员的最后一个工作并将其重新分配给失去工作的工人(除非删除的工作是最后一个工作):
W1 W2 W3 W4
-----------------
J1 J2 J3 J4
J5 J6 J9 J8
减少最后一名工人
如果要添加工作人员,请执行以下操作:选择最后一个工作人员的最后一个工作并将其分配给新工作人员,直到新工作人员的工作数等于或小于工作人员的工作数。第一个工人。
W1 W2 W3 W4 W5
----------------------
J1 J2 J3 J4 J8
J5 J6 J9
相应地更新最后一名工人。
如果您已经拥有以上所有内容,则删除工作人员非常简单:只需完成所有工作并一次添加一个工作。例如。如果您删除W2
:
W1 W3 W4 W5
----------------------
J1 J3 J4 J8
J5 J9 J2 J6
根据数据的大小,您应该使用适当的数据结构来提高效率。但我相信你知道使用什么结构。
答案 1 :(得分:0)
减少或优化工作机会的数量:
创建一个列表(例如,workers
)对(worker
和numOfJobsAssigned
)并分别维护变量maxJobsToAnySingleWorker
。
达到平衡状态(即所有workers
具有相同数量的作业)后,将maxJobsToAnySingleWorker
增加1,然后添加新作业。
Start with maxJobsToAnySingleWorker = 0
For addition of a Job:
Set Done to false
for each worker in workers
if numOfJobsAssigned < maxJobsToAnySingleWorker
Increase worker.numOfJobsAssigned by 1
Set Done to true
break
if Done is false (equilibrium state)
increase maxJobsToAnySingleWorker by 1
Increase FirstWorker.numOfJobsAssigned by 1
For removal of a Job from a worker, say myWorker:
Done = false
Remove Job
if myWorker.numOfJobsAssigned == maxJobsToAnySingleWorker-1
Do nothing
else
for each worker in workers
if (numOfJobsAssigned > 1) and (numOfJobsAssigned == maxJobsToAnySingleWorker)
Delegate Job from worker to myWorker
Decrease worker.numOfJobsAssigned by 1
Done = true
break
if worker is lastWorkerInList
Decrease maxJobsToAnySingleWorker by 1
遵循上述逻辑,删除工作人员可以通过执行 删除工作人员+将工作添加到留住工人来完成强>一个接一个。