首页 > 解决方案 > 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;

标签: arraysminizinc

解决方案


您的问题是一个很好的例子,说明问题的不同表述如何在不同的求解器上表现得非常不一致。

您的初始公式在一般 CP 求解器(如 Gecode)上工作得相对较好。尽管它包含析取、更多的决策变量和具体化(所有这些都可能是坏的),但它会相对快速地找到解决方案。这似乎表明求解器可以传播很多,即使有具体的约束。

但是,您的第二个模型包含一个巨大的析取约束。CP 求解器通常只需要猜测这些约束的哪些部分会成立,哪些不会成立。这意味着该约束的传播将为零,直到知道有关该约束的更多信息为止。这意味着搜索非常重要!

这种约束格式与 SAT 公式没有什么不同,当这个模型与 LCG 求解器(内部有一个 SAT 求解器)一起使用时,就像 chuffed 一样,模型在一秒钟内就完成了求解。Chuffed 从错误中学习,因此可以消除其搜索树的许多部分。


推荐阅读