Minizinc中回文的有效谓词

这不是假的

为了帮助我学习Minizinc,我正在尝试解决一个简单的问题。我的代码找到了答案,但令我惊讶的是,这样一个简单的问题大约需要10秒钟才能运行。

问题是“最小回文整数> 10是多少,因此其位数之和也> 10也是回文?”。我只希望代码做大的假设:答案最多只能有8位数字。

我的代码是(toNum谓词来自hakank网站):

predicate toNum(array[int] of var int: a, var int: n,  int: base) =
          let { int: len = length(a) }
          in
          n = sum(i in 1..len) (
            ceil(pow(int2float(base), int2float(len-i))) * a[i]
          )
          /\ forall(i in 1..len) (a[i] >= 0 /\ a[i] < base)
;

predicate toNum10(array[int] of var 0..9: a, var int: n) = toNum(a, n, 10);

predicate palindrome_array(array[int] of var int: t) =
   let { int: l = length(t), var 1..l: d } in (
   forall(j in 1..d-1) (t[j] = 0) /\
   t[d] != 0 /\
   forall(j in d..(l+d-1) div 2) (t[j] = t[l+d-j])
   )
;
predicate palindrome_int(var int: n) =
   let { int: size = ceil(log10(int2float(ub(n))))+1,
         array[1..size] of var 0..9: digits } in (
   toNum10(digits, n) /\
   palindrome_array(digits)
   )
;

var int: n;
array[1..8] of var 0..9: t;
constraint toNum10(t, n);
constraint palindrome_int(n);
constraint n>10;  
var int: s = sum(t);
constraint palindrome_int(s);
constraint s>10;
constraint alldifferent([n, s]);
solve minimize n;

完整版本具有以下附加约束:

var int: s2 = sum(i in 1..8) (t[i]*t[i]);
constraint palindrome_int(s2);
constraint s2 > 10;

var int: s3 = sum(i in 1..8) (t[i]*t[i]*t[i]);
constraint palindrome_int(s3);
constraint s3 > 10;

constraint alldifferent([n, s, s2, s3]);

我的代码有什么问题/速度慢吗?

哈坎克

尝试替换“解决最小化n;”。具有以下标记策略:

solve :: int_search(t, first_fail, indomain_min, complete) minimize n;

在我的机器上,它花费的时间少于0.1秒。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章