You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 08:39:00