Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何从包含交通线的文件构建图形?_List_Prolog_Graph Theory - Fatal编程技术网

List 如何从包含交通线的文件构建图形?

List 如何从包含交通线的文件构建图形?,list,prolog,graph-theory,List,Prolog,Graph Theory,我正在为Prolog中的项目而努力。我的问题是,给定一个包含交通线路的文件,其形式为lineNameOfLine、Type、ListOfStations。例如: line(m1, train, [a,b,c,d,e]) line(m2, train, [h,e,j,i]) ... 其中e是两条线路的相交车站,实际线路文件非常复杂,包含十几条线路和数百个车站。我必须做经典的图问题,比如找到一条路线,计算成本,等等 我知道我必须在开始之前构建一个无向图,所以我尝试了以下方法: adjacent(X

我正在为Prolog中的项目而努力。我的问题是,给定一个包含交通线路的文件,其形式为lineNameOfLine、Type、ListOfStations。例如:

line(m1, train, [a,b,c,d,e])
line(m2, train, [h,e,j,i])
...
其中e是两条线路的相交车站,实际线路文件非常复杂,包含十几条线路和数百个车站。我必须做经典的图问题,比如找到一条路线,计算成本,等等

我知道我必须在开始之前构建一个无向图,所以我尝试了以下方法:

adjacent(X,Y,[X,Y|_]).
adjacent(X,Y,[_|T]) :- adjacent(X,Y,T).

find_edge(LArret) :- forall(adjacent(X, Y, LArret), assert(edge(X,Y))).

connected(X,Y) :- edge(X,Y) ; edge(Y,X).

graph :-
    forall(ligne(_,_,L),  find_edge(L)).
但我并没有像预期的那样获得所有的优势。你们能给我一些建议吗?还是我一开始解决这类问题就错了

补充问题: 感谢提出的解决方案,我终于成功地定义了边。然后我尝试了这个经典算法来寻找a和B之间的路径,但有时搜索似乎没有结束,有时程序陷入搜索

connected(X,Y) :- edge(X,Y) ; edge(Y,X).

path(A,B,Path) :-
       travel(A,B,[A],Q), 
       reverse(Q,Path).

travel(A,B,P,[B|P]) :- 
       connected(A,B).
travel(A,B,Visited,Path) :-
       connected(A,C),           
       C \== B,
       \+member(C,Visited),
       travel(C,B,[C|Visited],Path). 

我认为原因可能是图中的一个循环或seraching中的一个无限循环,我如何避免这种问题,但仍能找到所有可能的路径

我可以使用以下代码和您的line/3定义创建您的edge/2定义列表:

adjacent(X,Y, [X,Y|_]).
adjacent(X,Y, [_|T]) :- adjacent(X,Y, T).

adjacent_lines(X,Y) :- line(_,_,L), adjacent(X,Y, L).

:- forall(adjacent_lines(X, Y), assert(edge(X, Y))).
它创建了第/3行事实指定的所有适用和有效的边缘/2事实。
至少,使用SWI Prolog,我不确定您是否需要构建任何图形:该图形由已提供的每条线路的站点列表定义。Boris,实际上我要做的是创建一对表示图形边缘的边[a,b]。如果不这样做,将很难找到例如路由,我在这一点上工作吗?谢谢你鼓舞人心的评论,我会再试一次。记住,你可以检查你的边缘/2事实是否存在与bagofX,Y,edgeX,Y,Ls。