Оптимизация PDDL не дает наилучшего результата - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь найти кратчайший путь в net узлов. Начинаются с x1y1 и заканчиваются x9y9 . Каждому перемещению от узла к узлу назначается определенная стоимость. Цель состоит в том, чтобы найти путь с наименьшей общей стоимостью. Описание проблемы Раздел: init содержит информацию о том, какие узлы подключены и какова стоимость соединения:

(:init
    (neighbor x1y1 x1y2)
    (neighbor x1y2 x1y3)
    (neighbor x1y1 x2y1)
    (neighbor x1y3 x9y9)
    (neighbor x2y1 x9y9)
    (on runner x1y1)
    (= (cost-total) 0)
    (= (cost-step x1y1 x1y2) 2)
    (= (cost-step x1y2 x1y3) 2)
    (= (cost-step x1y1 x2y1) 100)
    (= (cost-step x1y3 x9y9) 2)
    (= (cost-step x2y1 x9y9) 2)
)

Как видите, я установил стоимость соединения между x1y1 и x2y1 равной 100, так что следует избегать подключения. Но Планировщик всегда создает решение, которое включает это соединение, а не находит путь с меньшими общими затратами. Планировщик Выход: Выходные данные планировщика снимков экрана Я новичок в PDDL и понятия не имею, что не так. Поэтому я разместил весь код ниже:

Домен:

;Header and description

(define (domain domain_name)

;remove requirements that are not needed
(:requirements :strips :typing :fluents :action-costs)
;(:requirements :strips :fluents :durative-actions :timed-initial-literals :typing :conditional-effects :negative-preconditions :duration-inequalities :equality)

(:types player field
)

; un-comment following line if constants are needed
;(:constants )

(:predicates
    (on ?player - player ?loc - field)
    (neighbor ?start - field ?end - field)
)


(:functions
    (cost-total)
    (cost-step ?from - field ?to - field)
)

(:action move
    :parameters (?player - player ?from - field ?to - field)
    :precondition (and 
        (on ?player ?from)
        (neighbor ?from ?to)
    )
    :effect (and 
        (on ?player ?to)
        (not (on ?player ?from))
        (increase (cost-total) (cost-step ?from ?to))
    )
)

)

Проблема:

(define (problem problem_name) (:domain domain_name)
(:objects x1y1 x1y2 x2y1 x1y3 x9y9 - field
          runner - player
)

(:init
    (neighbor x1y1 x1y2)
    (neighbor x1y2 x1y3)
    (neighbor x1y1 x2y1)
    (neighbor x1y3 x9y9)
    (neighbor x2y1 x9y9)
    (on runner x1y1)
    (= (cost-total) 0)
    (= (cost-step x1y1 x1y2) 2)
    (= (cost-step x1y2 x1y3) 2)
    (= (cost-step x1y1 x2y1) 100)
    (= (cost-step x1y3 x9y9) 2)
    (= (cost-step x2y1 x9y9) 2)
)

(:goal (and
    (on runner x9y9)
))

;un-comment the following line if metric is needed
(:metric minimize (cost-total))
)

1 Ответ

0 голосов
/ 27 апреля 2020

По скриншоту похоже, что вы используете плагин vscode и, следовательно, скорее всего онлайн-решатель. Это не оптимальный решатель, и поэтому нет гарантии, какие действия он будет или не будет использовать.

В любом случае, первый шаг - подтвердить, что у вас работает оптимальный планировщик. Тогда мы можем покопаться в PDDL, если проблема все еще есть.

...