Minizinc 为什么皮卡说这个模型不令人满意?
Minizinc 为什么皮卡说这个模型不令人满意?,minizinc,picat,Minizinc,Picat,picat解算器(v.2.6#2)声明示例模型knights.mzn包含在Minizing存储库中,并在此复制和粘贴: % RUNS ON mzn20_fd % RUNS ON mzn-fzn_fd % RUNS ON mzn20_mip % knights.mzn % Ralph Becket % vim: ft=zinc ts=4 sw=4 et % Tue Aug 26 14:24:28 EST 2008 % % Find a closed knight's tour of a chess
picat
解算器(v.2.6#2
)声明示例模型knights.mzn
包含在Minizing存储库中,并在此复制和粘贴:
% RUNS ON mzn20_fd
% RUNS ON mzn-fzn_fd
% RUNS ON mzn20_mip
% knights.mzn
% Ralph Becket
% vim: ft=zinc ts=4 sw=4 et
% Tue Aug 26 14:24:28 EST 2008
%
% Find a closed knight's tour of a chessboard (every square is visited exactly
% once, the tour forms a loop).
include "globals.mzn";
% n is the length of side of the chessboard.
%
int: n = 6;
% The ith square (r, c) on the path is given by p[i] = (r - 1) * n + c.
%
int: nn = n * n;
set of int: sq = 1..nn;
array [sq] of var sq: p;
set of int: row = 1..n;
set of int: col = 1..n;
% Break some symmetry by specifying the first and last moves.
%
constraint p[1] = 1;
constraint p[2] = n + 3;
constraint p[nn] = 2 * n + 2;
% All points along the path must be unique.
%
constraint alldifferent(p);
array [sq] of set of sq: neighbours =
[ { n * (R - 1) + C
|
i in 1..8,
R in {R0 + [-1, -2, -2, -1, 1, 2, 2, 1][i]},
C in {C0 + [-2, -1, 1, 2, 2, 1, -1, -2][i]}
where R in row /\ C in col
}
| R0 in row, C0 in col
];
constraint forall (i in sq where i > 1) (p[i] in neighbours[p[i - 1]]);
solve
:: int_search(
p,
input_order,
indomain_min,
complete
)
satisfy;
% It has been observed that Warnsdorf's heuristic of choosing the next
% square as the one with the fewest remaining neighbours leads almost
% directly to a solution. How might we express this in MiniZinc?
output ["p = " ++ show(p) ++ ";\n"];
% Invert the path to show the tour.
%
% array [sq] of var sq: q;
%
% constraint forall (i in sq) (q[p[i]] = i);
%
% output [ show(q[i]) ++ if i mod n = 0 then "\n" else " " endif
% | i in sq
% ] ++
% [ "\n"
% ];
不满意:
~$ mzn2fzn knights.mzn
~$ picat tools/picat/fzn_picat_cp.pi knights.fzn
% solving(knights.fzn)
% loading knights.fzn
=====UNSATISFIABLE=====
~$ mzn2fzn knights.mzn
~$ picat tools/picat/fzn_picat_sat.pi knights.fzn
% solving(knights.fzn)
% loading knights.fzn
=====UNSATISFIABLE=====
除基于Yices
(v.2.2.1
)的fzn2smt
之外,每隔一次minizing
解算器都会告诉我模型是可满足的
Q:这是软件中的错误还是不受支持的公式的样本?Picat在此模型上失败的原因是它——或者更确切地说是生成的Flatzing模型——包含“var set”变量(见下文),而这些变量在Picat中不受支持
var set of 1..36: X_INTRODUCED_36_ ::var_is_introduced :: is_defined_var;
var set of 1..36: X_INTRODUCED_38_ ::var_is_introduced :: is_defined_var;
var set of 1..36: X_INTRODUCED_39_ ::var_is_introduced :: is_defined_var;
理想情况下,Picat应该给出更好的错误消息,例如“不支持设置变量”
请注意,许多解算器不支持设置变量。例如,Chuffed在模型上抛出了这样一条好消息:
Error: LazyGeoff: set variables not supported in line no. 72
本机不支持设置变量的解算器可以包括标准库中的nosets
文件。此文件将确保将所有设置变量转换为多个布尔变量。理想情况下,此文件将包含在解算器minizinredefinitions.mzn
文件中,但您始终可以通过添加以下行直接从模型中包含此文件:
include "nosets.mzn";
非常感谢。错误消息确实会更好。@hakank@PatrickTrentin包含
include“nosets.mzn”代码>将所有设置变量转换为多个布尔变量。可以将其添加到模型或解算器库中的重新定义文件中。Picat可以考虑这样做。像chuffed、CBC、Gurobi这样的解决者使用它,它似乎翻译得很好。@Dekker1谢谢!我还有一个问题:Minizing竞赛中是否使用了该变量?没有,但Minizing挑战赛中使用的模型规范规定只能使用布尔变量和整数变量。由于对浮点和集合变量的支持有限,这些变量不包括在挑战中