我目前正在开发一个答案集编程问题,包括一个机器人,需要覆盖房间避开障碍物,并在所有房间都被覆盖时达到目标点。 我的想法是将房间地图转换为asp谓词,以room / 3的形式,作为参数:
程序必须满足的标准之一是覆盖值为1的每个点,这可以通过约束来实现,但我不知道如何对机器人运动进行建模。我的想法是使用形式move / 1的谓词,包括向上,向下,向左或向右。
有人可以帮助我指导我如何模拟这个问题吗?
.as-console-wrapper { max-height: 100% !important; top: 0; }
提前谢谢。
答案 0 :(得分:0)
如果你的目标是为每条可能的路径建立一个模型,那么一个简单的方法就是在图中进行迭代进展。
我们首先需要定义我们可以移动的所有位置(我们实际上是在解决任何问题之前构建图形):
position(X,Y,S):- room(X,Y,S) ; not S=2.
现在我们决定从任何位置(图的边缘)到哪里:
edge((X,Y),(I,J)):- position(X,Y,_) ; position(I,J,_) ; |X-I|=0..1 ; |Y-J|=0..1 ; |X-I|+|Y-J|=1..2 .
请注意,我们认为图表是无向的(例如,如果房间中有幻灯片,则不一定正确)。 让我们定义一些常量:
#const start_pos=(1,1).
#const goal=(5,5).
#const path_maxlen=100.
我们显然从起点开始:
path(1,start_pos).
现在,我们递归地指出还有下一条路可走,并且有一个限制,以避免太无用的解决方案。
0{path(N+1,E): path(N,S), edge(S,E), S!=goal}1:- path(N,_) ; N<path_maxlen.
我们必须避免所有无用的路径。
% a path that do not join the end is illegal.
:- path(N,E) ; not path(N+1,_) ; not E=goal.
% a path must go by all milestone (example of milestone: milestone(2,14)).
:- not path(_,(X,Y)): milestone(X,Y).
我们想要最短路径:
last_step(N):- path(N,_) ; not path(N+1,_).
#minimize{N: last_step(N)}.
完整代码可用here。
作为旁注: