2016-04-23 107 views
1

我是新來的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)))) 
+0

http://www.fast-downward.org/IpcPlanners –

回答

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) 
    

編輯:

  • 由於我首先不知道該語言,因此我逃過了第一次檢查,並且假設對變量進行了通用量化。您需要解決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))) 
    ) 
    
  • 現在求解器找到以下解決方案:

    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 
    
    +0

    謝謝。這是一個很好的進展。但是解決方案似乎並不正確,因爲它在拾取新對象之前無法釋放舊對象,並且在機器人以對象移動時似乎在同一個房間中有兩個對象。例如:機器人從room4拾取object2,然後下一行說機器人從object4從room4移動到5。 –

    +0

    @IstiaqueHassan我編輯了我的答案與請求的修復程序 –

    +0

    這個作品是偉大的... :)謝謝.. –