arrays - Minizinc 更简单的数组模型方法?
问题描述
是否可以仅使用 int 和 conjuctive/disjunctive 语句将数组和 for all 语句模型表示为更简单的方法?我正在尝试跳过数组和所有语句,但它似乎不适用于整数。在给出结果的数组 .mzn 方法下方:
int: x;
int: y;
int: z;
int: k;
array[1..50] of {0,1,5,15,30}: Ingredient_1=[30 , 30 , 30 , 15, 15, 15, 5 , 5 , 5 , 1, 1, 1, 30 , 30 , 30 , 15, 15, 15, 5 , 5 , 5 , 1, 1, 1, 30 , 30 , 30 , 15, 15, 15, 5 , 5 , 5 , 1, 1, 1, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ];
array[1..50] of {0,3,7,12}: Ingredient_2=[3 , 7 , 12, 3 , 7 , 12, 3 , 7 , 12, 3 , 7 , 12, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 3 , 3 , 7 , 7 , 7 , 12, 12, 12, 3 , 3 , 3 , 7 , 7 ];
array[1..50] of {0,3,6,1000}: Ingredient_3= [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 6 , 1000, 3 , 6 , 1000, 3 , 6 , 1000, 3 , 6 , 1000, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 6 , 1000, 3 , 6 , 1000, 3 , 6 , 1000, 0 , 0 , 0 , 0 , 0];
array[1..50] of {0,3,6,1000}: Ingredient_4=[0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 6 , 1000, 3 , 6 , 1000, 3 , 6 , 1000, 3 , 6 , 1000, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 6 , 1000, 3 , 6];
%decision variable%
var set of 1..50 : occur;
%c1
constraint x=0-> forall (i in occur) (Ingredient_4 [i]= 0);
%c2
constraint y=7 \/ y=6 -> forall (i in occur)(Ingredient_1 [i]=30 );
%c3
constraint y=1 -> forall (i in occur)(Ingredient_1 [i]=0 ) ;
%c4 z in 5..7
constraint z =5 \/ z=6\/ z=7 -> forall (i in occur)(Ingredient_4[i] !=0) ;
%c5
constraint k=7 \/ k=6 -> forall (i in occur)(Ingredient_2 [i] =12);
%c6
constraint k=5 -> forall (i in occur)(Ingredient_2 [i] =7);
%c7
constraint k=4 \/ k=3 -> forall (i in occur)(Ingredient_2 [i] !=0);
solve satisfy;
output ["product ids:" ++show(occur) ++"\n"
++"Ingredient_1:" ++show(i in occur) (Ingredient_1[i])++"\n"
++"Ingredient_2:" ++show(i in occur) (Ingredient_2[i])++"\n"
++"Ingredient_3:" ++show(i in occur) (Ingredient_3[i])++"\n"
++"Ingredient_4:" ++show(i in occur) (Ingredient_4[i])++"\n"
++"Total number of products:"++ show(card(occur))++"\n"
];
%Data Input
y =7;
x=0;
z=0;
k=4;
以及一段时间后不返回的整数更简单的方法:
int: x;
int: y ;
int: z ;
int: k;
%Decision Variables
var int : Ingredient_1;
var int : Ingredient_2;
var int : Ingredient_3;
var int : Ingredient_4;
var int :product ;
constraint x=0-> Ingredient_4= 0;
constraint y=7 \/ y=6 -> Ingredient_1=30 ;
constraint y=1 -> Ingredient_1=0 ;
constraint z in 5..7 -> Ingredient_4!=0 ;
constraint k=7 \/ k=6 ->Ingredient_2 =12;
constraint k=5 -> Ingredient_2 =7;
constraint k=4 \/ k=3 ->Ingredient_2 !=0;
constraint
(product = 1 /\ Ingredient_1 = 30 /\ Ingredient_2=3 /\ Ingredient_3 =0 /\ Ingredient_4 = 0)
\/
( product= 2 /\ Ingredient_1= 30 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 3 /\ Ingredient_1= 30 /\ Ingredient_2 = 12 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 4 /\ Ingredient_1= 15 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 5 /\ Ingredient_1= 15 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 6 /\ Ingredient_1= 15 /\ Ingredient_2 = 12 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 7 /\ Ingredient_1= 5 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 8 /\ Ingredient_1= 5 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 9 /\ Ingredient_1= 5 /\ Ingredient_2 = 12 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 10 /\ Ingredient_1= 1 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 11 /\ Ingredient_1= 1 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 12 /\ Ingredient_3= 1 /\ Ingredient_2 = 12 /\ Ingredient_3= 0 /\ Ingredient_4= 0 ) \/
( product= 13 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 14 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 15 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 16 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 17 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 18 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 19 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 20 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 21 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 22 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 23 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 24 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 25 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 26 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 6 ) \/
( product= 27 /\ Ingredient_1= 30 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 1000 ) \/
( product= 28 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 29 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 6 ) \/
( product= 30 /\ Ingredient_1= 15 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 1000 ) \/
( product= 31 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 32 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 6 ) \/
( product= 33 /\ Ingredient_1= 5 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 1000 ) \/
( product= 34 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 35 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 6 ) \/
( product= 36 /\ Ingredient_1= 1 /\ Ingredient_2 = 0 /\ Ingredient_3= 0 /\ Ingredient_4= 1000 ) \/
( product= 37 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 38 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 39 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 40 /\ Ingredient_1= 0 /\ Ingredient_2 = 7 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 41 /\ Ingredient_1= 0 /\ Ingredient_2 = 7 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 42 /\ Ingredient_1= 0 /\ Ingredient_2 = 7 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 43 /\ Ingredient_1= 0 /\ Ingredient_2 = 12 /\ Ingredient_3= 3 /\ Ingredient_4= 0 ) \/
( product= 44 /\ Ingredient_1= 0 /\ Ingredient_2 = 12 /\ Ingredient_3= 6 /\ Ingredient_4= 0 ) \/
( product= 45 /\ Ingredient_1= 0 /\ Ingredient_2 = 12 /\ Ingredient_3= 1000 /\ Ingredient_4= 0 ) \/
( product= 46 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 47 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 6 ) \/
( product= 48 /\ Ingredient_1= 0 /\ Ingredient_2 = 3 /\ Ingredient_3= 0 /\ Ingredient_4= 1000 ) \/
( product= 49 /\ Ingredient_1= 0 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 3 ) \/
( product= 50 /\ Ingredient_1= 0 /\ Ingredient_2 = 7 /\ Ingredient_3= 0 /\ Ingredient_4= 6 );
solve satisfy;
%data
y = 7;
x=0;
z=0;
k=4;
解决方案
您的问题是一个很好的例子,说明问题的不同表述如何在不同的求解器上表现得非常不一致。
您的初始公式在一般 CP 求解器(如 Gecode)上工作得相对较好。尽管它包含析取、更多的决策变量和具体化(所有这些都可能是坏的),但它会相对快速地找到解决方案。这似乎表明求解器可以传播很多,即使有具体的约束。
但是,您的第二个模型包含一个巨大的析取约束。CP 求解器通常只需要猜测这些约束的哪些部分会成立,哪些不会成立。这意味着该约束的传播将为零,直到知道有关该约束的更多信息为止。这意味着搜索非常重要!
这种约束格式与 SAT 公式没有什么不同,当这个模型与 LCG 求解器(内部有一个 SAT 求解器)一起使用时,就像 chuffed 一样,模型在一秒钟内就完成了求解。Chuffed 从错误中学习,因此可以消除其搜索树的许多部分。
推荐阅读
- c# - 在我看来,是否有必要引用 ApplePay.js?如果是,比怎么样?
- amazon-web-services - 在 Elastic Beanstalk 实例上安装 ffmpegthumbnalier
- c# - c# SetForegroundWindow 和 SendMessageTimeout
- razor - 当用户无权查看 Umbraco 页面时如何通过 XSLT 隐藏元素
- php - 调用 isSumbitted() 和 isValid() 导致“未定义方法”错误
- node.js - npm 错误!使用 wsl 将 npm 模块安装到 Windows 10 时出现错误 -13
- ios - iPad 上的快照模式视图控制器出现非圆角
- react-vis - react-vis 中是否有一个函数可以将每个线系列缩放到它的 % 范围内,域最小值设置为 0,最大值设置为 100
- jeditable - 为什么使用 jeditable 时代码会崩溃?
- node.js - 浏览器不呈现 Dockerized AngularJS 应用程序