找不到机器人路径寻找的解决方案

时间:2016-04-23 05:58:39

标签: artificial-intelligence planning pddl

我是pddl的新手。我需要找到解决方案,其中机器人可以将不同的对象放在不同的目标单元格中我正在使用http://www.fast-downward.org/中的软件。但是,问题是我的操作无法按要求找到解决方案。 限制是即使机器人携带物体,也不能在同一房间内有2个物体。 附:域文件:

(define (domain gripper-strips)
(:predicates (ROOM ?x) ;iff x is a room
    (OBJECT ?x) ;iff x is an onject
    (HAND ?x) ;iff x is the robot's hand
    (FREE ?x) ;iff x is the robot's hand and it is free of object
    (ROBOT-AT ?x) ;iff x is a room and robot is located in x
    (OBJECT-AT ?x ?y) ;iff x is an object + y is a room and x is located at y
    (PATH ?x ?y) ;iff x and y are both room and there is no wall in-between
    (CARRY ?x) ;iff x is an object and robot is carrying it
)


  (:action MoveWithoutObject
   :parameters  (?room1 ?room2 ?hand)
   :precondition (and  (ROOM ?room1) (ROOM ?room1) (HAND ?hand) (not(=?room1 ?room2))
           (FREE ?hand) (ROBOT-AT ?room1) (PATH ?room1 ?room2))
   :effect (and  (ROBOT-AT ?room2)
         (not (ROBOT-AT ?room1)))
)

 (:action MoveWithObject
   :parameters  (?room1 ?room2 ?obj ?hand)
   :precondition (and  (ROOM ?room1) (ROOM ?room2) (OBJECT ?obj) (HAND ?hand) (not(=?room1 ?room2))
           (not (OBJECT-AT ?obj ?room1)) (not (OBJECT-AT ?obj ?room2))
           (ROBOT-AT ?room1) (not(FREE ?hand))
           (PATH ?room1 ?room2))
   :effect (and  (ROBOT-AT ?room2)
         (not (ROBOT-AT ?room1)))
)

 (:action Pickup
   :parameters (?obj ?room ?hand)
   :precondition  (and  (OBJECT ?obj) (ROOM ?room) (HAND ?hand)
            (OBJECT-AT ?obj ?room) (ROBOT-AT ?room) (FREE ?hand) (not(CARRY ?obj)))
   :effect (and (CARRY ?obj) (not (OBJECT-AT ?obj ?room)) (not (FREE ?hand)))
)

 (:action Release
   :parameters  (?obj ?room ?hand)
   :precondition  (and (OBJECT ?obj) (ROOM ?room) (HAND ?hand)
            (not(OBJECT-AT ?obj ?room)) (ROBOT-AT ?room) (not(FREE ?hand)) (CARRY ?obj))
   :effect (and (OBJECT-AT ?obj ?room)
        (not(CARRY ?obj))
        (FREE ?hand))))

和问题文件:

(define (problem strips-gripper-x-8)
(:domain gripper-strips)
(:objects room1 room2 room3 room4 room5 room6 room7 room8 room9
     object1 object2 object3
         hand)

  (:init (ROOM room1)(ROOM room2)(ROOM room3)(ROOM room4)(ROOM room5)(ROOM room6)(ROOM room7)(ROOM room8)(ROOM room9)
  (OBJECT object1)(OBJECT objec21)(OBJECT object3)
  (HAND hand)
  (FREE hand)
  (ROBOT-AT room1)
  (OBJECT-AT object1 room6)(OBJECT-AT object2 room4)(OBJECT-AT object3 room7)
  (PATH room1 room4)(PATH room4 room1)
  (PATH room4 room5)(PATH room5 room4)
  (PATH room5 room6)(PATH room6 room5)
  (PATH room5 room8)(PATH room8 room5)
  (PATH room6 room9)(PATH room9 room6)
  (PATH room6 room3)(PATH room3 room6)
  (PATH room3 room2)(PATH room2 room3)
  (PATH room8 room7)(PATH room7 room8))

  (:goal (and (OBJECT-AT object1 room7)(OBJECT-AT object2 room2)(OBJECT-AT object3 room9))))

1 个答案:

答案 0 :(得分:0)

您的方法看似正确,但您的文件中有一些拼写错误会妨碍找到解决方案的可能性。

  1. <强> problem.pddl:

    变化

    (OBJECT object1)(OBJECT objec21)(OBJECT object3)
    

    (OBJECT object1) (OBJECT object2) (OBJECT object3)
    
  2. domain.pddl:更改

    变化

    (ROOM ?room1) (ROOM ?room1)
    

    使用

    执行 MoveWithoutObject
    (ROOM ?room1) (ROOM ?room2)
    
  3. 修改

    1. 这是我第一次检查,因为我一开始并不知道语言,我认为对变量进行了普遍量化。您需要像这样修复 MoveWithObject

      (:action MoveWithObject
       :parameters  (?room1 ?room2 ?obj1 ?obj2 ?obj3 ?hand)
       :precondition (and  (ROOM ?room1) (ROOM ?room2) (HAND ?hand) (not(=?room1 ?room2))
         (OBJECT ?obj1) (OBJECT ?obj2) (OBJECT ?obj3) 
         (not (OBJECT-AT ?obj1 ?room1)) (not (OBJECT-AT ?obj1 ?room2))
         (not (OBJECT-AT ?obj2 ?room1)) (not (OBJECT-AT ?obj2 ?room2))
         (not (OBJECT-AT ?obj3 ?room1)) (not (OBJECT-AT ?obj3 ?room2))
         (not (= ?obj1 ?obj2))
         (not (= ?obj1 ?obj3))
         (not (= ?obj2 ?obj3))
         (ROBOT-AT ?room1) (not (FREE ?hand)) (PATH ?room1 ?room2))
         :effect (and  (ROBOT-AT ?room2)
               (not (ROBOT-AT ?room1)))
      )
      
    2. 现在解算器找到以下解决方案:

          Solution found!
          Actual search time: 2.23336s [t=4.41504s]
          movewithoutobject room1 room4 hand (1)
          movewithoutobject room4 room5 hand (1)
          movewithoutobject room5 room6 hand (1)
          pickup object1 room6 hand (1)
          movewithobject room6 room3 object1 object2 object3 hand (1)
          release object1 room3 hand (1)
          movewithoutobject room3 room6 hand (1)
          movewithoutobject room6 room5 hand (1)
          movewithoutobject room5 room8 hand (1)
          movewithoutobject room8 room7 hand (1)
          pickup object3 room7 hand (1)
          movewithobject room7 room8 object1 object2 object3 hand (1)
          movewithobject room8 room5 object1 object2 object3 hand (1)
          movewithobject room5 room6 object1 object2 object3 hand (1)
          movewithobject room6 room9 object1 object2 object3 hand (1)
          release object3 room9 hand (1)
          movewithoutobject room9 room6 hand (1)
          movewithoutobject room6 room3 hand (1)
          pickup object1 room3 hand (1)
          movewithobject room3 room6 object1 object2 object3 hand (1)
          movewithobject room6 room5 object1 object2 object3 hand (1)
          movewithobject room5 room8 object1 object2 object3 hand (1)
          movewithobject room8 room7 object1 object2 object3 hand (1)
          release object1 room7 hand (1)
          movewithoutobject room7 room8 hand (1)
          movewithoutobject room8 room5 hand (1)
          movewithoutobject room5 room4 hand (1)
          pickup object2 room4 hand (1)
          movewithobject room4 room5 object1 object2 object3 hand (1)
          movewithobject room5 room6 object1 object2 object3 hand (1)
          movewithobject room6 room3 object1 object2 object3 hand (1)
          movewithobject room3 room2 object1 object2 object3 hand (1)
          release object2 room2 hand (1)
          Plan length: 33 step(s).
          Plan cost: 33
      

      我使用以下策略来寻找此解决方案,其他策略可能会找到更长的路径:

       $ fast-downward.py --alias seq-opt-bjolp problem.pddl