我正在寻找一个库来帮助我解决基于约束的逻辑问题,我需要安排一系列不同持续时间的不同事件。这些事件具有与它们相关的不同属性,我的主要问题是我需要根据这些属性对“首选项”进行编码。这些偏好不是硬约束,但我希望最大限度地提高它们在解决方案中的满意程度。竞争优先权也有不同的偏好。
我已经看了几个约束求解器(Sat4j,clasp,Glucose,GlueMiniSat等)但是从我看到它们似乎只处理固定约束,并且设置首选项将是非-不重要的。
我不太关心它所使用的技术/语言 - 我很乐意为它编写一个包装器。
答案 0 :(得分:1)
当然,Choco Solver是一个功能强大的Java约束求解器,通常用于调度和规划。
我们来看下面的例子: "如果x = 10"
,那就太好了您可以通过不同方式对首选项进行编码。
1)通过变量和约束。
1.1)使用二进制变量
来修复约束ICF.arithm(x,"=",10).reifyWith(b);
它基本上意味着b = 1< => x = 10(因此约束可能满足也可能不满足),那么你可以最大化b(可能有一个权重)
1.2)通过差距变量
solver.post(ICF.arithm(x,'-',gap,"=",10);
然后你可以最小化间隙的绝对值(可能有一个重量) 约束。
2)通过搜索:在解决问题时,请求搜索策略在尝试其他值之前尝试x = 10。没有最优性证明,但它在实践中运作良好。
希望这有帮助。有关Choco Solver www.cosling.com
的更多支持,请随时与我们联系最好的,
答案 1 :(得分:0)
我认为OptaPlanner是一个可以帮助您解决此问题的工具,请查看:
OptaPlanner是一个约束满足求解器。它优化了业务 资源规划。每个组织都面临着调度难题:分配 一组有限的约束资源(员工,资产,时间和 钱)为客户提供产品或服务。 OptaPlanner 优化此类规划问题,以更少的方式开展更多业务 资源。用例包括车辆路线,员工排班,工作 调度,Bin装箱等等。
OptaPlanner是一款轻量级,可嵌入的计划引擎。它使 普通的Java™程序员可以有效地解决优化问题。 约束适用于纯域对象,可以重用现有代码。 无需输入困难的数学方程式。在下面 引擎盖,OptaPlanner结合了复杂的优化启发式和 元启发式(如禁忌搜索,模拟退火和后期 接受)和非常有效的分数计算。
OptaPlanner是Apache下发布的开源软件 软件许可。它使用100%纯Java™编写,可在任何JVM上运行 并且也可以在Maven Central存储库中找到。
来源:
它是Drools的一部分,它有另一个有趣的工具:
答案 2 :(得分:0)
另一个积极维护的图书馆是" choco-solver"。
答案 3 :(得分:0)
另一种选择是Gecode Toolkit。它是一个开源和现代的Constraint Programming Solver。