【发布时间】:2020-11-10 08:18:12
【问题描述】:
有一个无向图 (V,E),边上的权重 w : E → N, a 目标 k ∈ N,阈值 O ∈ N。 重量小于阈值的图表。换句话说,选择 k 分别来自 V 和 E 的顶点和 k - 1 条边,使得它们 构成一棵树,以及所选边的权重之和 小于O。
编写一个以 V、E、w、k 和 O 作为输入的 ASP 程序,并找到 满足约束的边的选择,或输出 如果不能满足约束条件,则为“不可满足”。选择 边隐含地诱导顶点的选择,所以没有 需要明确显示选定的顶点。
这个问题的一个实例是通过谓词 vertex/1 提供的, 权重/3、目标/1 和阈值/1。所有边都有权重,所以 weight(a, b, 10) 形式的语句。可用于声明 顶点 a 和 b 之间同时存在一条边 声明它们的重量,并且不需要任何多余的边缘/ 2 谓词。
我尝试了以下方法:
% instance
vertex ( v1 ). vertex ( v2 ). vertex ( v3 ).
vertex ( v4 ). vertex ( v5 ). vertex ( v6 ).
vertex ( v7 ). vertex ( v8 ). vertex ( v9 ).
weight ( v1 , v2 ,3). weight ( v1 , v3 ,3).
weight ( v2 , v4 ,1). weight ( v2 , v5 ,5).
weight ( v3 , v4 ,3). weight ( v3 , v6 ,4).
weight ( v4 , v5 ,4). weight ( v4 , v7 ,1).
weight ( v5 , v7 ,7).
weight ( v6 , v7 ,2). weight ( v6 , v8 ,2).
weight ( v7 , v9 ,3).
weight ( v8 , v9 ,2).
target (4).
threshold (4).
% encoding
(P-1) {select(X, Y) : weight(X, Y, Z)} (Q-1) :- target(P), target(Q).
sum(S) :- S = #sum {W,X,Y : select(X,Y), weight(X,Y,W); W,X,Z : select(X,Z), weight(X,Z,W) }.
:- sum(S),threshold(M), S > M.
:- select(A,B), select(C,D), A == C ; A == D ; B == C ; B == D.
#show select/2.
我得到以下输出:
clingo version 5.5.0
Reading from stdin
Solving...
Answer: 1
select(v2,v4) select(v4,v7) select(v6,v7)
Answer: 2
select(v2,v4) select(v4,v7) select(v6,v8)
Answer: 3
select(v2,v4) select(v4,v7) select(v8,v9)
SATISFIABLE
Models : 3
Calls : 1
Time : 0.013s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
我只是期待
select(v2,v4) select(v4,v7) select(v6,v7)
因为其他的显然不是发辫。
我认为这是因为有问题的行:
:- select(A,B), select(C,D), A == C ; A == D ; B == C ; B == D.
我该如何纠正这个问题?
【问题讨论】:
-
好的,第一次尝试是限制选定节点的数量,这将为示例提供正确的输出。但它不会强迫一棵树。
-
您是对的,尽管如果目标更改为 5 并且其他一切都保持不变,它将不起作用(我认为)?因为目标是基于权重的,与节点数无关。但我可能是错的。
标签: undirected-graph answer-set-programming clingo