ASP 中有向图的路由检查
Route Inspection of Directed Graph in ASP
对于下面的多向图,我正在尝试编写一个至少访问所有边一次的程序。例如,在下图中,我正在寻找类似于“edge(1,2), edge(2,3), edge(3,1), edge(1,2), edge(2,4)”的结果, 边(4,5), 边(5,4), 边(4,3), 边(3,1)"
到目前为止,这是我的代码。它 运行 不正确,但我不知道如何修复 it.Could 请协助如何继续?欢迎任何建议或代码。
基本上,我相信我正在寻找欧拉循环的变体,其中边可以被访问不止一次。
edge(1,2). edge(2,3). edge(3,1).
edge(2,4). edge(4,3).
edge(4,5). edge(5,4).
#const s=1.
start(s).
time(1..20). % allow at most 20 time-steps
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
:- move(edge(X,Y),step(1)), edge(X,Y), X!=s. % start from s
:- move(edge(X,Y_1),step(T)), move(edge(Y_2,Y),step(TT)), TT=T+1, Y_1!=Y_2.
visited(X,Y,T) :- time(T),move(edge(X,Y),step(S)), S<T, T<=20.
visited(X,Y,T) :- time(T),move(edge(Y,X),step(S)), S<T, T<=20.
:- edge(X,Y), not visited(X,Y,20).
:- move(edge(X,Y),step(S)), S<=20, Y!=s. %ensures path is cycle (back to s)
#minimize { T : time(T) }. % here i try to get as many steps as possible out of the upper bound of 20
#show move/2.
您的代码行有问题
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
这里的问题是你在每个时间步都强制移动,这意味着你的路径必须有 20 步,这对于没有正好 20 步的解决方案的问题实例来说可能会有问题。
还有你的线路
:- move(edge(X,Y),step(S)), S<=20, Y!=s.
是一个问题,因为它强制每一步都以 s
结束 - 因此代码无法满足。
您也是在搜索最小值还是最大值?您的代码说明最小值,您的评论说明最大值。
我稍微修改了你的代码,现在它似乎可以工作了。主要变化是引入了步数并从谓词 visited
.
中删除了计时器
#const s=1.
start(s).
1 {endt(1..20)} 1. % guess end time
time(1..T) :- endt(T).
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
:- move(edge(X,Y),step(1)), edge(X,Y), X!=S, start(S). % start from s
:- move(edge(X,Y_1),step(T)), move(edge(Y_2,Y),step(T+1)), Y_1!=Y_2.
:- move(edge(X,Y),step(S)), edge(X,Y), Y!=s, endt(S). % end from s
visited(X,Y) :- move(edge(X,Y),step(_)).
visited(X,Y) :- move(edge(Y,X),step(_)).
:- edge(X,Y), not visited(X,Y). % visit all edges
#minimize { T : endt(T) }.
#show move/2.
输出:
Answer: 1
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,3),step(8)) move(edge(3,1),step(9))
Optimization: 9
OPTIMUM FOUND
对于 #maximize { T : endt(T) }.
:
Answer: 1
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,3),step(8)) move(edge(3,1),step(9))
Optimization: -9
Answer: 2
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,5),step(8)) move(edge(5,4),step(9)) move(edge(4,5),step(10)) move(edge(5,4),step(11)) move(edge(4,5),step(12)) move(edge(5,4),step(13)) move(edge(4,5),step(14)) move(edge(5,4),step(15)) move(edge(4,3),step(16)) move(edge(3,1),step(17)) move(edge(1,2),step(18)) move(edge(2,3),step(19)) move(edge(3,1),step(20))
Optimization: -20
对于下面的多向图,我正在尝试编写一个至少访问所有边一次的程序。例如,在下图中,我正在寻找类似于“edge(1,2), edge(2,3), edge(3,1), edge(1,2), edge(2,4)”的结果, 边(4,5), 边(5,4), 边(4,3), 边(3,1)"
到目前为止,这是我的代码。它 运行 不正确,但我不知道如何修复 it.Could 请协助如何继续?欢迎任何建议或代码。
基本上,我相信我正在寻找欧拉循环的变体,其中边可以被访问不止一次。
edge(1,2). edge(2,3). edge(3,1).
edge(2,4). edge(4,3).
edge(4,5). edge(5,4).
#const s=1.
start(s).
time(1..20). % allow at most 20 time-steps
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
:- move(edge(X,Y),step(1)), edge(X,Y), X!=s. % start from s
:- move(edge(X,Y_1),step(T)), move(edge(Y_2,Y),step(TT)), TT=T+1, Y_1!=Y_2.
visited(X,Y,T) :- time(T),move(edge(X,Y),step(S)), S<T, T<=20.
visited(X,Y,T) :- time(T),move(edge(Y,X),step(S)), S<T, T<=20.
:- edge(X,Y), not visited(X,Y,20).
:- move(edge(X,Y),step(S)), S<=20, Y!=s. %ensures path is cycle (back to s)
#minimize { T : time(T) }. % here i try to get as many steps as possible out of the upper bound of 20
#show move/2.
您的代码行有问题
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
这里的问题是你在每个时间步都强制移动,这意味着你的路径必须有 20 步,这对于没有正好 20 步的解决方案的问题实例来说可能会有问题。
还有你的线路
:- move(edge(X,Y),step(S)), S<=20, Y!=s.
是一个问题,因为它强制每一步都以 s
结束 - 因此代码无法满足。
您也是在搜索最小值还是最大值?您的代码说明最小值,您的评论说明最大值。
我稍微修改了你的代码,现在它似乎可以工作了。主要变化是引入了步数并从谓词 visited
.
#const s=1.
start(s).
1 {endt(1..20)} 1. % guess end time
time(1..T) :- endt(T).
1 { move(edge(X,Y),step(T)) : edge(X,Y) } 1 :- time(T).
:- move(edge(X,Y),step(1)), edge(X,Y), X!=S, start(S). % start from s
:- move(edge(X,Y_1),step(T)), move(edge(Y_2,Y),step(T+1)), Y_1!=Y_2.
:- move(edge(X,Y),step(S)), edge(X,Y), Y!=s, endt(S). % end from s
visited(X,Y) :- move(edge(X,Y),step(_)).
visited(X,Y) :- move(edge(Y,X),step(_)).
:- edge(X,Y), not visited(X,Y). % visit all edges
#minimize { T : endt(T) }.
#show move/2.
输出:
Answer: 1
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,3),step(8)) move(edge(3,1),step(9))
Optimization: 9
OPTIMUM FOUND
对于 #maximize { T : endt(T) }.
:
Answer: 1
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,3),step(8)) move(edge(3,1),step(9))
Optimization: -9
Answer: 2
move(edge(1,2),step(1)) move(edge(2,3),step(2)) move(edge(3,1),step(3)) move(edge(1,2),step(4)) move(edge(2,4),step(5)) move(edge(4,5),step(6)) move(edge(5,4),step(7)) move(edge(4,5),step(8)) move(edge(5,4),step(9)) move(edge(4,5),step(10)) move(edge(5,4),step(11)) move(edge(4,5),step(12)) move(edge(5,4),step(13)) move(edge(4,5),step(14)) move(edge(5,4),step(15)) move(edge(4,3),step(16)) move(edge(3,1),step(17)) move(edge(1,2),step(18)) move(edge(2,3),step(19)) move(edge(3,1),step(20))
Optimization: -20