【问题标题】:Room coverage in Answer Set Programming答案集编程中的房间覆盖率
【发布时间】:2018-04-17 14:37:31
【问题描述】:

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

  • X:x 坐标
  • Y:y 坐标
  • V:房间内点的值,0(起始点),1(指向掩体),2(障碍物),3(目标点)

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

谁能帮我指导我如何建模这个问题?

    void map_to_asp(std::ofstream& file,std::vector<std::vector<char>>& room)
{
  std::cout << room.size() << "," << room[0].size() << std::endl;
  for(int i = 0; i < room.size(); i++)
  {
    for(int j = 0;j < room[0].size(); j++)
    {
      switch(room[i][j])
      {
        case '@':
        file << "initial(" << i+1 << "," << j+1 << ").\n";
        break;
        case '.':
        file << "toClean(" << i+1 << "," << j+1 << ").\n";
        break;
        case '#':
        file << "obstacle(" << i+1 << "," << j+1 << ").\n";
        break;
        case 'X':
        file << "goal(" << i+1 << "," << j+1 << ").\n";
        break;
      }
    }
  }
}

提前谢谢你。

【问题讨论】:

  • 你有一个到目前为止所做的例子吗?
  • @ApoloRadomer 我编辑了从地图生成命题的重要功能

标签: robotics answer-set-programming clingo


【解决方案1】:

如果您的目标是为每个可能的路径建立一个模型,一个简单的方法是在图中进行迭代。

我们首先需要定义我们可以移动的所有位置(我们实际上是在解决任何问题之前构建一个图表):

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获取。


附注:

  • 由于我们不使用它们,您可以(应该)移除所有描述障碍物的 room/3。
  • 你也可以让你的目标点是人造的(在房间外面,但真正的目标是链接到它的),以便让你的路径通过真正的目标,而不会停下来。使用它,您可以实现对多个目标的支持。

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2018-01-11
    相关资源
    最近更新 更多