2015-03-30 55 views
3

想象我跟在隊列等待名單的時間計算

Service 1 - 5 minutes 
Service 2 - 10 minutes 
Service 3 - 5 minutes 
Service 4 - 15 minutes 
Service 5 - 20 minutes 

下一個等待名單。如果我有兩個工作人員在排隊我怎麼能估計等待時間下一個人服務這5個客戶走在商店裏。

+1

這讓我想起了裝箱算法的......除了你同時填寫兩個區間。 – Dai 2015-03-30 22:40:51

+1

取決於你的意思是「估計」..你可以總結等待時間和除以職員人數.. – Blorgbeard 2015-03-30 22:41:00

+1

我想我可以總結時間和除以職工人數,如果這是最好的方式。 – Craig 2015-03-30 22:42:21

回答

6

其實這很簡單 - 這是"W" queue model as described by Eric Lippert

設置陣列中兩個「工作人員」的成員:

List<int>[] staff = new [] {new List<int>(), new List<int>()}; 

定義隊列:

int[] queue = new int[] {5, 10, 5, 15, 20}; 

然後模擬處理 - 每個客戶以後會去到首先完成的服務商:

foreach (int i in queue) 
{ 
    List<int> shortest = staff.OrderBy(s=>s.Sum()).First(); 
    shortest.Add(i); 
} 

要進來的「下一個」人員必須等到第一個服務人員免費,這是每一個客戶的總和服:

int nextTime = staff.Min(s=>s.Sum()); 

Console.WriteLine("The wait time for the next customer is {0} minutes",nextTime); 

輸出:

等待時間爲下一位顧客是25分鐘。

+0

這是優雅的! – zerkms 2015-03-30 23:09:11

+0

如果您希望進一步深入理論,Little的法律是一個開始的好地方:http://en.wikipedia.org/wiki/Little%27s_law – lzcd 2015-03-30 23:23:22

+0

上,直接的答案。 – Aizen 2015-03-31 00:10:11

1

這裏有一個不那麼優雅的方式來做到這一點...

private static int GetEstimatedWaitTime(Queue<int> currentQueue, int numServers) 
{ 
    int waitTime = 0; 

    // Short-circuit if there are more servers than items in the queue 
    if (currentQueue.Count < numServers) return waitTime; 

    // Create a copy of the queue so we can dequeue from it 
    var remainingItems = new Queue<int>(); 
    foreach (var item in currentQueue) 
    { 
     remainingItems.Enqueue(item); 
    } 

    // Grab an item for each server 
    var itemsBeingServiced = new List<int>(); 
    for (int i = 0; i < numServers; i++) 
    { 
     itemsBeingServiced.Add(remainingItems.Dequeue()); 
    } 

    do 
    { 
     // Get the shortest item left, increment our wait time, and adjust other items 
     itemsBeingServiced.Sort(); 
     var shortestItem = itemsBeingServiced.First(); 
     waitTime += shortestItem; 

     itemsBeingServiced.RemoveAll(item => item == shortestItem); 

     for (int i = 0; i < itemsBeingServiced.Count; i++) 
     { 
      itemsBeingServiced[i] = itemsBeingServiced[i] - shortestItem; 
     } 

     // Add more items for available servers if there are any 
     while (itemsBeingServiced.Count < numServers && remainingItems.Any()) 
     { 
      itemsBeingServiced.Add(remainingItems.Dequeue()); 
     } 

    } while (itemsBeingServiced.Count >= numServers); 

    return waitTime; 
}