我有一个迷你模型来调度一个项目,目前优化的总制造。然而,有时计划项目的总成本更重要。我想:
中。
我试图使用if <bool-exp> then <exp-1> else <exp-2> endif,但这似乎不适用于搜索序列/目标。
有办法这样做吗?
发布于 2022-01-23 10:37:31
下面是一些你能做的例子。
如果这两种方法都不适合您,请提供更多的上下文(最好是完整的MiniZinc模型+数据),并给出您想要做的事情和得到的错误消息。
据我所知,没有办法将完整的solve表达式放在if-then-endif表达式中。也就是说,以下是不可能的
% ...
if mode = 1 then
solve :: int_search(x,first_fail, indomain_split) minimize z1
elseif mode = 2 then
solve :: int_search(y,anti_first_fail, indomain_min) maximize z2
else
solve satisfy
endif
;前两个变体可能适用于更简单的情况。
方法1
使用变量将最优值(此处为z)最小化,然后将该值放入if-then-else-endif子句中。请注意,对于不同的情况,您必须小心地使标志正确。此外,必须选择z的域以涵盖适当的情况。
% int: mode = 1;
% int: mode = 2;
% int: mode = 3;
int: mode = 4;
var 0..10: x;
var 0..10: y;
var int: z;
constraint
if mode = 1 then
z in 0..100 /\
z = x*2*y
elseif mode = 2 then
z in 0..20 /\
z = x+y
elseif mode = 3 then
z in -100..0 /\
z = -(x*2*y)
else
z in -20..0 /\
z = -(x+y)
endif
;
solve minimize z;方法2
类似的想法是将if-then-else-endif子句移到solve部分:
int: mode = 1;
% int: mode = 2;
% int: mode = 3;
% int: mode = 4;
var 0..10: x;
var 0..10: y;
solve minimize
if mode = 1 then
x*y
elseif mode = 2 then
x+y
elseif mode = 3 then
-x*y
else
-(x+y)
endif; 这个版本的缺点是没有变量(z),可以设置适当的域。
方法3
第三种--然后我将使用更复杂的模型--是使用MiniZinc/Python:https://minizinc-python.readthedocs.io/en/latest/。
https://stackoverflow.com/questions/70820549
复制相似问题