2016-04-23 4 views
1

Ich bin neu in der PDL. Ich muss eine Lösung finden, bei der ein Roboter verschiedene Objekte in verschiedene Zielzellen legen kann. Ich benutze die Software von http://www.fast-downward.org/. Das Problem ist jedoch, dass meine Aktionen die gewünschte Lösung nicht finden können. Die Einschränkung besteht darin, dass sich keine 2 Objekte im selben Raum befinden können, selbst wenn der Roboter ein Objekt trägt. angehängt: die Domain-Datei:kann die Lösung für die Roboterpfadsuche nicht finden

(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)))) 

und das Problem Datei:

(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/IpcPlanner –

Antwort

0

Ihr Ansatz ist scheinbar richtig, aber Sie haben ein paar Tippfehler in Ihren Dateien, die die Möglichkeit der Suche nach einer Lösung behindern .

  1. problem.pddl:

    Änderung

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

    mit

    (OBJECT object1) (OBJECT object2) (OBJECT object3) 
    
  2. domain.pddl: Änderung

    Änderung

    (ROOM ?room1) (ROOM ?room1) 
    

    in Aktion MoveWithoutObject mit

    (ROOM ?room1) (ROOM ?room2) 
    

EDIT:

  1. Dies entging meiner ersten Überprüfung, da ich die Sprache überhaupt nicht kannte und ich nahm an, dass es eine universelle Quantifizierung über die Variablen gab. Sie auch Notwendigkeit MoveWithObject wie dieses Problem zu beheben:

    (: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))) 
    ) 
    

nun der Löser die folgende Lösung findet:

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 

ich die folgende Strategie verwendet diese Lösung für die Suche, andere Strategien könnte längere Wege finden:

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

Danke. Es ist ein guter Fortschritt. aber die Lösung scheint nicht richtig zu sein, da es das alte Objekt nicht freigeben kann, bevor es neu aufgenommen wird und es scheint, als ob sich zwei Objekte im selben Raum befinden, wenn sich der Roboter mit dem Objekt bewegt. Zum Beispiel: Roboter nimmt das Objekt2 von Raum4 auf und die nächste Zeile sagt, dass Roboter sich mit Objekt1 von Raum4 nach 5 bewegt. –

+0

@IstiaqueHassan Ich habe meine Antwort mit den angeforderten Korrekturen bearbeitet –

+0

Das funktioniert großartig ... :) Danke .. –

Verwandte Themen