solve minimize
即使有多个最佳解决方案,我也只能得到一个解决方案。我在求解器配置中启用了多个解决方案的打印输出。其他最优解solve satisfy
与非最优解一起找到。
可能是基数函数card()
在两个集合的大小相等的情况下按枚举值排序吗?换句话说,那card(A, B) > card(B, C)
?如果是这样,我是否必须切换顶点的表示?
我正在创建一个 MiniZinc 程序来查找给定图形的最小顶点覆盖。此示例中的图表是这样的:
最小顶点覆盖解决方案是:
[{A, B, C, E}, {A, B, E, F}, {A, C, D, E}, {B, C, D, E}, {B, C, D, F}, {B, D, E, F}]
. 我的代码只输出{A, B, C, E}
.
数据文件:
VERTEX = {A, B, C, D, E, F};
edges = [|1, 0, 1, 0, 0, 0, 0, 0, 0
|1, 1, 0, 1, 1, 0, 0, 0, 0
|0, 1, 0, 0, 0, 1, 1, 0, 0
|0, 0, 1, 1, 0, 0, 0, 1, 0
|0, 0, 0, 0, 1, 1, 0, 1, 1
|0, 0, 0, 0, 0, 0, 1, 0, 1|];
求解程序:
% Vertices in graph
enum VERTEX;
% Edges between vertices
array[VERTEX, int] of int: edges;
int: num_edges = (length(edges) div card(VERTEX));
% Set of vertices to find
var set of VERTEX: span;
% Number of vertices connected to edge resulting from span
array[1..num_edges] of var 0..num_edges: conn;
% All edges must be connected with at least one vertex from span
constraint forall(i in 1..num_edges)
(conn[i] >= 1);
% The number of connections to each edge is the number of vertices
% in span with a connection to that edge
constraint forall(i in 1..num_edges)
(conn[i] = sum([edges[vert,i]| vert in span]));
% Minimize the number of vertices in span
solve minimize card(span);