答案集编程中的房间覆盖范围

时间:2018-04-17 14:37:32

标签: robotics answer-set-programming clingo

我目前正在开发一个答案集编程问题,包括一个机器人,需要覆盖房间避开障碍物,并在所有房间都被覆盖时达到目标点。 我的想法是将房间地图转换为asp谓词,以room / 3的形式,作为参数:

  • X:x coord
  • Y:y coord
  • V:房间中的点数值,为0(初始点),1(指向封面),2(障碍物),3(目标点)

程序必须满足的标准之一是覆盖值为1的每个点,这可以通过约束来实现,但我不知道如何对机器人运动进行建模。我的想法是使用形式move / 1的谓词,包括向上,向下,向左或向右。

有人可以帮助我指导我如何模拟这个问题吗?

.as-console-wrapper { max-height: 100% !important; top: 0; }

提前谢谢。

1 个答案:

答案 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

作为旁注:

  • 由于我们不使用它们,你可以(应该)删除描述障碍的所有房间/ 3。
  • 你也可以让你的目标点是人为的(在房间外,但真正的goad与它相关联),以便让你的路径通过真正的目标,而不会停止。使用它,您可以实现对多个目标的支持。