我正在製作一個卡車遊樂設施的調度程序,通過減少死盤最小化開車的總成本。我的計劃有兩個階段:制定初步計劃和優化計劃。該計劃目前保存爲Dictionary<Truck, List <Trip>>
。這裏每輛卡車必須按照行程列表的順序驅動所有行程。旅程的順序與列表的順序相同。當其他線程正在使用字典時,合併字典中修改的好方法是什麼?
初始時間表是使用Munkres的算法在截止日期的不同階段創建的。如果初始時間表已經準備就緒,它將通過演變的遺傳算法進行優化。在GA中,很多線程都試圖改進計劃。一個線程可以工作如下:
- 獲取當前時間表。
- 隨機更改卡車的行程順序或更改卡車行程的分佈。
- 檢查修改後的時間表中是否仍有最後期限。如果不是從1開始,否則繼續。
- 檢查計劃的費用是否因修改而減少。如果不是從1開始,否則繼續。
- 設置/合併/更改時間表。
步驟3和步驟4是非常昂貴的操作(可能需要超過500毫秒)。我考慮將計劃保存爲ImmutableDictionary
而不是Dictionary
,以便在步驟1到工作計劃之後不會被其他線程更改。然後問題是:如何做第5步。任何想法如何我可以處理這個好?或者,我應該以另一種方式做到這一點,而不是ImmutableDictionary
的想法?
使其更通用:合併其他線程也在使用的Dictionary
的好方法是什麼?
'ConcurrentDictionary'(https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx)? –
在'ConcurrentDictionary'中,我發現了一些方法來解決與密鑰存在相關的併發問題,但這些方法不能解決我的問題。如果一個線程在另一個線程已經將序列改變爲{t8,t3,t2,t6}的時候將一系列行程'{t3,t8,t2,t6}'改變爲'{t3,t2,t8,t6} ,這是一個問題。這不是通過使用'ConcurrentDictionary'來解決的。也不要使用'ConcurrentList's,因爲旅行也可以在不同的列表之間進行更改。任何其他想法? –
那麼,如果順序很重要,那麼爲什麼你使用'Dictionary'呢? 「字典中元素的順序是非確定性的」 - http://stackoverflow.com/questions/4007782/the-order-of-elements-in-dictionary –