首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minzinc:动态地在目标之间切换

Minzinc:动态地在目标之间切换
EN

Stack Overflow用户
提问于 2022-01-23 09:03:06
回答 1查看 53关注 0票数 0

我有一个迷你模型来调度一个项目,目前优化的总制造。然而,有时计划项目的总成本更重要。我想:

  1. 在my .dzn中使用一个值(即目标,1= makespan,2=成本,3=其他一些在不同目标/解决命令之间的变量切换,在my .mzn

中。

我试图使用if <bool-exp> then <exp-1> else <exp-2> endif,但这似乎不适用于搜索序列/目标。

有办法这样做吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-23 10:37:31

下面是一些你能做的例子。

如果这两种方法都不适合您,请提供更多的上下文(最好是完整的MiniZinc模型+数据),并给出您想要做的事情和得到的错误消息。

据我所知,没有办法将完整的solve表达式放在if-then-endif表达式中。也就是说,以下是不可能的

代码语言:javascript
复制
% ...
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的域以涵盖适当的情况。

代码语言:javascript
复制
% 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部分:

代码语言:javascript
复制
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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70820549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档