我想对任务进行带约束的调度(类似于作业车间调度问题),我考虑使用类似微软求解器基础(Microsoft Solver Foundation)的工具(我需要使用C#)。但据我所知,这种方法只能通过寻找最优的最大值或最小值来解决问题,这需要很长时间。我需要一个近似解,这样调度在总时间上不是最优的(尽可能好),但所有约束都能得到满足。有什么解决这个问题的建议吗?
回答:
我建议你使用Z3求解器。它提供了C#的API。基本上,它是一个SMT求解器,可以在给定约束下寻找“足够好”的解决方案。用SMTLIB语言定义你的问题可能会相当困难。
如果你觉得太难,可以看看Minizinc或Clingo求解器——只需将问题表述生成成文本文件,从你的C#代码中作为一个独立进程运行求解器,然后从输出文本文件中解析解决方案。
编辑
如果你想最小化调度长度,可以尝试以下方法。假设存在长度为K的调度。在这个假设下,你的计划问题是否可满足?让我们调用求解器来找出答案!生成几个不同K值的问题,并迭代运行求解器。使用二分查找来减少尝试次数。