MiniZinc如何为数组各位置单独定义可选枚举值集合?
问题原因
你写的约束存在逻辑冲突:内层forall(j in t[i])(result[i] = j)要求result[i]同时等于t[i]中的所有元素,只要某个位置的可选集合元素数量≥2,就不可能满足条件,这就是模型报不一致错误的直接原因。
正确写法
你只需要用MiniZinc的集合成员运算符in,直接约束每个位置的变量属于对应可选集合即可,修正后的完整模型如下:
set of int: RANGE = 1..5; enum OPTS = {A,B,C,D}; array[RANGE] of set of OPTS: t = [{A,B,C},{A,B},{A,B,C,D},{B,D},{A}]; array[RANGE] of var OPTS: result; % 核心约束:每个位置的结果只能选对应集合内的选项 constraint forall(i in RANGE)( result[i] in t[i] ); output [show(result)]
效果说明
这个模型运行后会生成符合要求的解,比如你举的示例[B,A,B,D,A]就是可行解之一,且第五位的result[5]因为t[5] = {A},所以只能取A,完全符合你的需求。
内容的提问来源于stack exchange,提问作者MikeyB
相关产品推荐
相关产品推荐

