minizinc修复功能的用途是什么?

时间:2018-10-08 07:11:42

标签: minizinc

我看到fix文档说:

http://www.minizinc.org/doc-lib/doc-builtins-reflect.html#Ifunction-dd-T-cl-fix-po-var-opt-dd-T-cl-x-pc

function array [$U] of $T: fix(array [$U] of var opt $T: x)
Check if the value of every element of the array x is fixedat this point in evaluation. If all are fixed, return an array of their values, otherwise abort.

我认为它可以用于将var强制转换为par。 这是代码。

array [1..num]   of var int: value  ;
%% generate random numbers from 0..num-1, this should fix the value of the var "value"  or so i think
constraint forall(i in index_set(value))(let {int:temp_value=discrete_distribution([1|i in index_set(value)]); } in value[i]=trace(show(temp_value)++"\n", temp_value));

%%% this i was expecting to work, as "value" elements are fixed above
array [1..num]   of int:value__  =[ trace(show(fix(value[i])), fix(value[i])) | i in index_set(value)] ;

但是我得到了

MiniZinc: evaluation error:
    with i = 1
  in call 'trace'
  in call 'fix'
  expression is not fixed

我的问题是:

1)我想我应该期待这个错误,因为minizinc不是顺序执行语言?

2)仅在使用fix语句的情况下,用户指南中的output示例。它是唯一使用fix的地方吗?

3)我如何将var强制转换为par

通过我尝试此var到par转换的方式,因为我在数组生成器表达式上遇到问题。这是代码

int:num__=200;
int:seed=134;
int: two_m=2097184;
%% prepare weights for generating numbers form 1..(two_m div 64), basically same weight
array [1..(two_m div 64)] of int: value_6_wt= [seed+1 | i in 1..(two_m div 64)] ;
%% generate numbers. this dose not work gives out 
%% in variable declaration for 'value6'
%% parameter value out of range
array [1..num__] of int : value6 = [ discrete_distribution(value_6_wt) | j in 1..num__];

1 个答案:

答案 0 :(得分:2)

在MiniZinc语言中,参数与变量之间的区别仅在于参数在编译时必须具有值。在编译器中,我们将尽可能多的变量转换为参数。这使求解器免于要做一些工作。当我们知道变量已被转换为参数时,就可以使用fix函数说服类型系统,我们确实可以将该变量用作参数并查看其值。

然而,这里的问题是,当变量未固定为一个值时,fix被定义为中止。如果未进行测试,则需要一些(魔术/)有关编译过程的知识。在您的情况下,似乎在优化阶段之前评估了第二个数组,在该阶段中解决了所有混叠问题。这就是为什么它不起作用的原因。 (这确实是声明性语言的结果之一)

尽管fix仅可以在示例中的输出语句中使用(保证可以使用),但是它在MiniZinc库中的许多位置中都可以使用。例如,如果我们看一下用于MIP求解器的库,则在其中一个参数是参数的情况下,可以有效地编码许多约束。因此,您经常会看到,该库中的a约束首先使用is_fixed测试其参数,然后如果返回true,则使用更好的编码。

输出语句以及is_fixed返回true时,都可以保证变量是固定的,并确保编译不会中止。没有其他方法可以将变量强制为参数,但是除非您要处理从属谓词定义,否则您可以信任MiniZinc编译器以确保生成的FlatZinc将包含参数而不是变量。

相关问题