C#有序组合算法

时间:2010-09-14 16:15:08

标签: c# math data-structures permutation

我正在尝试开发一个c#应用程序,它将在限制和成本内生成所有可能排列的列表。例如,我有80个工作列表。每个工作都有一个值(1-5)(通常为3),每个工程师都有一个限制,他们可以做多少,通常是20。

目前我已经开始制作所有可能组合的列表(n!/(k!*(nk)!其中n是作业总数,k是2)。每个作业之间的联系应该是用每个工作之间的距离加权。

从这里开始,我想选择一个初始启动工作并生成所有可能的工作组合列表(从开始工作)到20的限制,然后按重量总和进行排序。最低权重路线将赢得并分配给工程师。我的问题是我不知道如何处理这个问题 - 哪种数据结构最好?

通常大约有6-8名工程师(取决于工作量),我计划一次一个地给每个工程师一个路由 - 一旦将路线分配给另一个工程师,这些工作将从列表中删除并且新的使用生成的一组新组合选择启动作业。这听起来像是一种可接受的方法吗?

欢迎任何帮助。

3 个答案:

答案 0 :(得分:2)

我会尝试模拟退火,这是一种通过根据系统能量随机测试配置来找到全局最优的算法。

http://en.wikipedia.org/wiki/Simulated_annealing

检查文章中的伪代码。

答案 1 :(得分:1)

您可以查看Microsoft Solver Foundation: http://msdn.microsoft.com/en-us/devlabs/hh145003.aspx

另外,如果你进入Linq to Anything,请看看Bart de Smet的Linq to Z3 :) http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-LINQ-to-Z3

答案 2 :(得分:1)

没有有效的算法来解决这个问题。我会使用遗传算法(不一定找到最佳解决方案,但找到一个可接受的解决方案)。