我有一个变量数组和它们之间的线性约束列表。对于每个变量,我都有一个集合,其中包含一个有效值的起始列表。使用 Minizinc,我怎样才能将这些起始值集减少到仅能满足约束的那些?
一个简单的例子来展示我想要实现的目标:
array[1..2] of var int: xy;
array[1..2] of set of int: xyvalid = [ {1, 5, 7}, 0..9 ];
constraint forall(i in 1..2)( xy[i] in xyvalid[i] );
constraint xy[1] + xy[2] = 7;
当我用一个solve satisfy
项目运行它并打印所有解决方案时xy
,我得到(删除了水平线):
[1, 6]
[5, 2]
[4, 3]
[3, 4]
我想要的是以某种方式获得一个 var set 数组,调用它xypossible
,在这种情况下等于[ {1, 3, 4, 5}, {2, 3, 4, 6} ]
。我想我可以定义一组约束,以某种方式检查,对于 中的每个可能值xypossible[1]
,有一个值xypossible[2]
产生一个有效的解决方案,反之亦然,然后求解以最大化 中所有集合的总基数xypossible
,但是当我的真实数据可能是几百个变量的规模时,有几十个线性约束,这对于代码来说很难看,而且运行起来很糟糕。
如果没有一种很好的方法可以将其作为模型,那么有没有一种方法可以捕获信息作为求解器识别有效值作为其自身工作的一部分的结果?