gpt4 book ai didi

c# - 当其他线程正在使用字典时,在字典中合并修改的好方法是什么?

转载 作者:行者123 更新时间:2023-11-30 17:38:20 26 4
gpt4 key购买 nike

我正在为卡车行程制定一个调度程序,通过减少空载来最大限度地降低总驾驶成本。我的计划分为两个阶段:初步规划和优化规划。该规划当前保存为 Dictionary<Truck, List <Trip>> .在这里,每辆卡车都必须按照行程列表的顺序驾驶所有行程。行程的顺序与列表的顺序相同。

初始计划是使用 Munkres 的算法在截止日期的不同阶段创建的。如果初始计划准备就绪,它将通过进化的遗传算法进行优化。在 GA 中,很多线程都试图改进调度。线程可以按以下方式工作:

  1. 获取当前时间表。
  2. 随机更改卡车的行程顺序或更改卡车的行程分配。
  3. 检查最后期限是否仍然在修改后的时间表中。如果不是从1重新开始,否则继续。
  4. 检查是否通过修改降低了进度成本。如果不是从1重新开始,否则继续。
  5. 设置/合并/更改日程安排。

第 3 步和第 4 步是非常昂贵的操作(可能需要超过 500 毫秒)。我考虑过将时间表保存为 ImmutableDictionary而不是 Dictionary ,这样在第 1 步之后的工作时间表就不会被其他线程改变。那么问题是:如何执行第 5 步。知道如何处理好这个吗?或者我应该用不同于 ImmutableDictionary 的其他方式来做想法?

使其更通用:合并 Dictionary 的好方法是什么?其他线程也在使用吗?

最佳答案

这听起来像是您会受益于使用 ConcurrentDictionary 的情况详细here on MSDN .评论员已经提出这一点,但仍然值得正式说明。

您可以将 this 与 Lazy<T> 结合使用对于一些非常强大和线程安全的代码。结帐this article两者一起使用。这是一个.NET Fiddle详细说明其用法。

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

然后你可以走到MostRecentData变量并调用其方法,如 .AddOrUpdate等。这个特别需要两个工厂 lambda,它们评估对字典的添加和更新(如果 key 已经存在)。

关于c# - 当其他线程正在使用字典时,在字典中合并修改的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com