Path 输出路由并避免用户在prolog中输入的路由
输出prolog列表路径并避免用户在prolog中输入的某些路由 大家好,我正在做一个项目,一栋建筑包含多个区域,每个区域都有一个出口,我们想通过这些区域疏散人员到出口,用户输入两个参数,第一个是“感染区域”,另一个参数是“我们想疏散的人员区域”。 输出应该是从“我们要疏散的人群区域”到避开感染区域的出口的所有安全路线 例如: 用户输入Path 输出路由并避免用户在prolog中输入的路由,path,prolog,Path,Prolog,输出prolog列表路径并避免用户在prolog中输入的某些路由 大家好,我正在做一个项目,一栋建筑包含多个区域,每个区域都有一个出口,我们想通过这些区域疏散人员到出口,用户输入两个参数,第一个是“感染区域”,另一个参数是“我们想疏散的人员区域”。 输出应该是从“我们要疏散的人群区域”到避开感染区域的出口的所有安全路线 例如: 用户输入(z11,z12)//表示z11被感染,我们要疏散的人在z12 输出:z12->z22->exit3。及 z12->z21->exit2。和z12->电梯 事实是
(z11,z12)
//表示z11被感染,我们要疏散的人在z12
输出:z12->z22->exit3。及
z12->z21->exit2。和z12->电梯
事实是:
path(z11,z12).
path(z12,z11).
path(z12,z22).
path(z12,z21).
path(z22,z12).
path(z22,z21).
path(z21,z22).
path(z11,exit1).
path(z12,elevators).
path(z21,exit2).
path(z22,exit3).
请帮我写代码。您选择将谓词命名为
path/2很不方便,因为我们可能希望使用该名称调用生成出口路径的对象。因此,首先我要将您的所有事实从path/2
重命名为connected/2
。然后,您需要对出口进行注释:
exit(exit1). exit(exit2).
exit(elevators).
否则,您必须在其他地方对它们进行硬编码
一个简单的方法是解决一般路径问题,然后检查以确保路径不包含受感染的站点。看起来是这样的:
path(Start, Path) :- path(Start, Path, []).
path(Start, [Exit], Seen) :-
exit(Exit),
connected(Start, Exit),
\+ memberchk(Exit, Seen).
path(Start, [Next|Rest], Seen) :-
connected(Start, Next),
\+ memberchk(Next, Seen),
path(Next, Rest, [Next|Seen]).
safe_path(Start, Avoid, Path) :-
path(Start, Path),
\+ memberchk(Avoid, Path).
这很容易推广到处理避免区域集:
safe_path(Start, AvoidList, Path) :-
path(Start, Path),
forall(member(Avoid, AvoidList), \+ memberchk(Avoid, Path)).
Prolog中有趣和有趣的大部分工作都是通过生成/测试范例完成的。最简单、最直接的公式通常是生成太多(你可能会说太笼统)并在测试中设置所有限制的公式。一般来说,通过使生成器在生成可能性方面更加智能,可以实现更好的性能--将代码从“测试”部分移动到“生成和测试”的“生成”部分
通常,您面临的第一个问题是生成一棵无限树。这在图形中尤其如此。path/3
中的memberchk/2
和Seen
列表用于防止循环,并且是使路径集有限所必需的。在path/3
的基本情况下使用exit/1
也有助于提高性能,因为我们不生成中间路径。很高兴在你的特殊情况下,你能侥幸逃脱
最后要避免的就是最后筛糠。生成过程不知道如何避免这些节点,因此测试将生成并删除所有中毒路径。如果以这种方式性能不足,您可以直接将代码移动到path/2
,执行类似的检查,以查看列表。您选择将谓词命名为路径/2
,这很不方便,因为我们可能希望使用该名称调用生成出口路径的对象。因此,首先我要将您的所有事实从path/2
重命名为connected/2
。然后,您需要对出口进行注释:
exit(exit1). exit(exit2).
exit(elevators).
否则,您必须在其他地方对它们进行硬编码
一个简单的方法是解决一般路径问题,然后检查以确保路径不包含受感染的站点。看起来是这样的:
path(Start, Path) :- path(Start, Path, []).
path(Start, [Exit], Seen) :-
exit(Exit),
connected(Start, Exit),
\+ memberchk(Exit, Seen).
path(Start, [Next|Rest], Seen) :-
connected(Start, Next),
\+ memberchk(Next, Seen),
path(Next, Rest, [Next|Seen]).
safe_path(Start, Avoid, Path) :-
path(Start, Path),
\+ memberchk(Avoid, Path).
这很容易推广到处理避免区域集:
safe_path(Start, AvoidList, Path) :-
path(Start, Path),
forall(member(Avoid, AvoidList), \+ memberchk(Avoid, Path)).
Prolog中有趣和有趣的大部分工作都是通过生成/测试范例完成的。最简单、最直接的公式通常是生成太多(你可能会说太笼统)并在测试中设置所有限制的公式。一般来说,通过使生成器在生成可能性方面更加智能,可以实现更好的性能--将代码从“测试”部分移动到“生成和测试”的“生成”部分
通常,您面临的第一个问题是生成一棵无限树。这在图形中尤其如此。path/3
中的memberchk/2
和Seen
列表用于防止循环,并且是使路径集有限所必需的。在path/3
的基本情况下使用exit/1
也有助于提高性能,因为我们不生成中间路径。很高兴在你的特殊情况下,你能侥幸逃脱
最后要避免的就是最后筛糠。生成过程不知道如何避免这些节点,因此测试将生成并删除所有中毒路径。如果以这种方式性能不足,您可以直接将该代码移动到路径/2
,执行与使用查看的列表类似的检查。问题是什么?问题是什么?非常感谢,但是你能帮我解决这个问题吗:用户应该使用GUI窗口输入这两个参数>>>我如何通过让用户输入这两个参数来编码???恐怕你必须自己做一些编程。Use.hi,我想在实现代码后询问,例如,如果起点是:z11,感染区域是:exit3,结果是:Q=[exit1];Q=[z12,电梯];Q=[z12,z11,exit1];Q=[z12,z21,exit2];错。然后在第三条路径中,人们将从z11到z12,然后再回到z11>>>>>>>这不应该发生>>>>我如何删除第三条选择???此外,它如何生成完整的答案(路径输出从起点开始),例如:“起点是”z11,感染区是“exit3”,结果应该是[z11->z12->电梯]和[z11->exit1]…等等。这两个问题都有明显的解决方案。尝试一下。非常感谢,但是你能帮我解决这个问题吗:用户应该使用GUI窗口输入这两个参数>>>我如何通过让用户输入这两个参数来编码???恐怕你必须自己做一些编程。使用。嗨,我想问一下实施