2016-09-14 50 views
3

我有以下屬性的系統:算法再平衡的循環任務

  1. 有跡象表明,對就業工作的工人。工人可以被添加或刪除。每個工作人員可以同時運行多個工作。

  2. 有工作。這些工作永遠運行(無限期)並分配給工人。可以添加或刪除作業。

我正在使用循環法將作業分配給啓動時的工作人員,這項工作非常好。

但是,當添加和刪除工作人員以及添加和刪除作業時,我想重新分配分配給工作人員的作業。

儘管可能在發生上述任何變化時使用循環算法重新分配所有內容,但它會進行比所需更多的更改。

換句話說,是否有任何循環重新平衡算法在那裏會導致對作業的差異/變化的最小量?

+1

工人如何在同一時間工作多個工作?在你的描述中,還有一個隱含的假設,即工人可以打斷他在工作中的工作,而另一個工人可以恢復這個中斷的工作。問題解決了嗎?還是您希望解決此問題的答案? – fjardon

+0

一名工人可以同時工作多個工作,因爲每項工作都是作爲一個去程序啓動的。換句話說,每個工作可以被認爲是一個線程(儘管去例程不是線程)。工作相對簡單:將消息從數據庫推送到消息總線,因此將作業切換到另一個工作人員是微不足道的。 – F21

+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

在某些情況下,您的解決方案並不十分理想,因爲通過更少的工作轉移可以保持同樣好的平衡。例如,如上例所示,從'W3'中刪除作業'J7'後,接下來從'W2'中刪除'J6'。你的算法現在將作業'J8'從'W4'轉移到'W2'以保持平衡,而將作業分配保持原樣並以更高的效率(以所需的轉換數量計),而不是重新排序工人*,以便'W2'移動到工作列表的末尾。 –

+0

在第一種情況下,假設我們有'J7'作業(不包括'J8'和'J9'),則'J6'被刪除。那麼你不覺得把'J7'移到'W2'是不必要的嗎? –

+0

你是對的。我並不是說這是一個完美的解決方案。合併工人重新排序應該非常簡單(例如,比較當前工人的工作數量與第一個工人的工作數量)。不過,批量插入和刪除是一個完全不同的故事。 –

0

爲了減少或優化的作業運動的次數:雙(workernumOfJobsAssigned)的

創建列表(比如,workers),並分別保持一個可變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 

之後,拆除工人可以通過從離開的工人+另外一個工作,以保持工人逐一做拆除作業的完成。