2016-04-21 38 views
3

我正在製作一個卡車遊樂設施的調度程序,通過減少死盤最小化開車的總成本。我的計劃有兩個階段:制定初步計劃和優化計劃。該計劃目前保存爲Dictionary<Truck, List <Trip>>。這裏每輛卡車必須按照行程列表的順序驅動所有行程。旅程的順序與列表的順序相同。當其他線程正在使用字典時,合併字典中修改的好方法是什麼?

初始時間表是使用Munkres的算法在截止日期的不同階段創建的。如果初始時間表已經準備就緒,它將通過演變的遺傳算法進行優化。在GA中,很多線程都試圖改進計劃。一個線程可以工作如下:

  1. 獲取當前時間表。
  2. 隨機更改卡車的行程順序或更改卡車行程的分佈。
  3. 檢查修改後的時間表中是否仍有最後期限。如果不是從1開始,否則繼續。
  4. 檢查計劃的費用是否因修改而減少。如果不是從1開始,否則繼續。
  5. 設置/合併/更改時間表。

步驟3和步驟4是非常昂貴的操作(可能需要超過500毫秒)。我考慮將計劃保存爲ImmutableDictionary而不是Dictionary,以便在步驟1到工作計劃之後不會被其他線程更改。然後問題是:如何做第5步。任何想法如何我可以處理這個好?或者,我應該以另一種方式做到這一點,而不是ImmutableDictionary的想法?

使其更通用:合併其他線程也在使用的Dictionary的好方法是什麼?

+4

'ConcurrentDictionary'(https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx)? –

+0

在'ConcurrentDictionary'中,我發現了一些方法來解決與密鑰存在相關的併發問題,但這些方法不能解決我的問題。如果一個線程在另一個線程已經將序列改變爲{t8,t3,t2,t6}的時候將一系列行程'{t3,t8,t2,t6}'改變爲'{t3,t2,t8,t6} ,這是一個問題。這不是通過使用'ConcurrentDictionary'來解決的。也不要使用'ConcurrentList's,因爲旅行也可以在不同的列表之間進行更改。任何其他想法? –

+0

那麼,如果順序很重要,那麼爲什麼你使用'Dictionary'呢? 「字典中元素的順序是非確定性的」 - http://stackoverflow.com/questions/4007782/the-order-of-elements-in-dictionary –

回答

1

這聽起來像是一個案例,您將從使用ConcurrentDictionary詳細here on MSDN受益。這已經被評論員發現了,但是仍然值得正式表述。

您可以將此與Lazy<T>一起用於一些非常強大且線程安全的代碼。結賬使用this article。詳細說明其用法,請參見.NET Fiddle

static readonly ConcurrentDictionary<Guid, Lazy<T>> MostRecentData = 
      new ConcurrentDictionary<Guid, Lazy<T>>(); 

然後你就可以步行到MostRecentData變量並調用它的方法,如.AddOrUpdate,等這一個特別有兩個工廠lambda表達式如果鍵已經存在,其評估的除了字典和更新。