首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MiniZinc中支持带有决策变量的pow()

在MiniZinc中支持带有决策变量的pow()
EN

Stack Overflow用户
提问于 2020-11-22 00:43:11
回答 2查看 95关注 0票数 0

我试图用一个决策变量构建一个模型,该变量的范围为0..10,约束条件是它必须被4整除。输出必须是最小化值(x-7)^2的输出。通过调查我发现Gecode已经支持它了。

我尝试按如下方式构建模型,但使用内置pow()时出错。

代码语言:javascript
复制
% Decision variable

var 0..10: x;  

% Constraints

constraint (x mod 4) == 0;

% Call to the resolver
int: obj = pow(x-7, 2);

solve minimize obj;

% Solution

output["x = ", show(x), "\nobj = ", show(obj)];

我得到以下错误:

代码语言:javascript
复制
MiniZinc: type error: initialisation value for `obj' has invalid type-inst: expected `int', actual `var int'

我认为发生这种情况是因为将变量视为决策变量,而不仅仅是整数参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-22 10:57:50

要将pow()调用从解决方案时间移到编译时间,可以使用预先计算的数组:

代码语言:javascript
复制
% Decision variable

var 0..10: x;  

set of int: DomainX = 0..10;
array[DomainX] of int: xa = array1d(DomainX, [pow(i-7, 2) | i in DomainX]);

% Constraints

constraint (x mod 4) == 0;

% Call to the resolver
var int: obj = xa[x];

solve minimize obj;

% Solution

output["x = ", show(x), "\nobj = ", show(obj)];

正如hakank注释的那样,变量obj必须是var int类型,因为它依赖于决策变量。

票数 2
EN

Stack Overflow用户

发布于 2020-11-22 10:44:00

@hankank的解决方案是正确的。使用var int: obj = pow(x-7, 2);

var int中的变量(例如,MiniZinc )是决策变量,其他名称(在MiniZinc中可能称为变量)称为参数(例如par intint)。这是两种截然不同的类型,原因很充分:任何只包含参数的计算都保证能够在MiniZinc编译期间执行,而任何使用变量的计算通常都必须由求解者来决定。

请注意,使用pow实际上也可能给线性求解器(即MIP求解器)带来问题。在这种情况下,计算仍然可以是线性的,因为转换使用的是常量,但是两个参数都是变量的表达式pow(x,y)不能由线性求解器决定。

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

https://stackoverflow.com/questions/64949609

复制
相关文章

相似问题

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