如何让Clingo优先优化高权重软约束后再处理低权重约束?
如何让Clingo按优先级顺序依次优化软约束?
我有一个包含多组不同权重软约束的Clingo程序,代码如下:
maximize {1@100, X: constraint1(X)}. minimize {1@70, X: constraint2(X)}. . . . minimize {1@1, X: constraintK(X)}.
当前求解器的优化过程(模型代价)为:
(1,0,0,...,0) => (2,1,0,...,0) => (2,0,0,...,0) => (3,1,1,...,1) => (3,0,1,...,1)
可见求解器会同时优化所有软约束,在constraint1未完全优化时就开始处理后续约束。我希望求解器先完全优化优先级高的约束,再依次处理后续约束,期望过程如下:
(1,0,0,...,0) => (2,1,0,...,0) => (3,2,1,...,0) => ... => (99,75,30,...,70) # 此时constraint1达到最优 => (99,70,29,...,70) # 开始优化第二个约束 => ... => (99,46,19,...,43) # constraint2达到最优,开始优化第三个约束等
请问是否可以实现该行为?或者这是否违背ASP范式?
可以实现这种分层优先级优化的行为,而且完全符合ASP范式,Clingo本身就支持这种需求。
核心原理
你当前的写法会让Clingo采用帕累托优化(同时优化所有层级代价),而你需要的是字典序优化——先确保高优先级约束达到全局最优,再在这个前提下处理下一层级的约束。
修改方法
只需要将所有优化目标合并到同一个#minimize(或#maximize)语句中,用分号分隔不同层级,明确指定字典序优化顺序:
#minimize { -1@100, X: constraint1(X); # 用负号将maximize转为等价的minimize目标 1@70, X: constraint2(X); ... 1@1, X: constraintK(X) }.
如果所有目标都是同方向(比如全是minimize),直接合并即可:
#minimize { 1@100, X: constraint1(X); 1@70, X: constraint2(X); ... 1@1, X: constraintK(X) }.
原写法的问题
原写法中每个独立的maximize/minimize语句会被视为单独的优化目标,Clingo默认会做帕累托优化——只要某个模型在至少一个目标上更优,就会被保留并继续迭代,这就导致了“同时处理多个约束”的情况。而字典序优化会强制优先穷尽最高优先级目标的所有最优可能,再推进到下一层级。
效果验证
修改后,Clingo会先将constraint1优化到无法再提升(或降低)代价的状态,才会开始处理constraint2,完全匹配你期望的分步优化过程。
内容的提问来源于stack exchange,提问作者ILoveET
相关产品推荐
相关产品推荐

