0

我是 PDDL 的初学者,目前想建立一个项目,允许漫游者在火星上自主行动。基本上,流动站应该有电池。

例如。漫游者可以通过在航路点充电来增加数量(每个动作+10),百分比将减少a -> b(-15)。它应该建模得相当简单,所以随着时间的推移不会减少,我只是想在init某事中定义。比如:当它从 a 到 b 减少 10 时,从 b 到 c 减少 -10 和从 a 到 c -25 ......这是我目前的文件:

(define (domain rover)

    (:requirements :fluents)
    (:types     LOCATION - Obj
                ROVER - Obj)
    (:constants )
    (:predicates    (path           ?r - ROVER  ?l1 ?l2 - LOCATION)
                    (at             ?r - ROVER  ?l - LOCATION)

    )
    (:functions
            (battery-amount)
            ;(battery-capacity)
    )
    (:action move
            :parameters (?r - ROVER    ?from - LOCATION    ?to - LOCATION)
            :precondition (and (at ?r ?from) (path ?r ?from ?to) (> (battery-amount) 90)) 
            :effect (and (at ?r ?to) (not (at ?r ?from))
                    (decrease (battery-amount) 10)
            )
    )
)

这就是问题:

(define (problem      roverprob1)
    (:domain    rover)
    (:objects 
        r0              - ROVER
        l0 l1 l2 l3 l4   - LOCATION)
        
    (:init  (at r0 l1) (= (battery-amount) 100)
            (path r0 l3 l0) (path r0 l0 l3) (path r0 l3 l1) 
            (path r0 l1 l3) (path r0 l1 l2) (path r0 l2 l1)
            (path r0 l3 l4) (path r0 l4 l3)
    )
    (:goal  (and (at r0 l4)))    
)

我的想法是 mybattery-amount应该是域中的一个函数,它的初始值设置在 Problem with 100 中,并且从每个动作开始move应该将数量减少 10。

为了验证结果,我对动作移动实施了一个前提条件,它应该检查金额是否大于 90。

我的漫游车必须分两步才能到达位置 l4。所以他应该无法到达l4。

有趣的是,编辑器仍然找到了解决问题的方法。如果没有电池电量,我会得到相同的解决方案。在我看来,他没有更新价值,我不知道为什么^^

提前感谢您的任何帮助或建议!

更新

我进一步深入研究了这个问题,并为自己找到PDDLVSCode. 您可以在此处查看当前状态:当前状态 如果我查看 vs code 提供的可视化输出,我注意到以下内容:

(:init
(at r0 l1)
(= (fuel-level r0) 90)...)

当流动站有足够的能量沿着路径行驶时,燃料水平图显示如下:

燃料_使用_01

但是当我更改初始值时,流动站应该无法到达目标航路点

(:init
(at r0 l1)
(= (fuel-level r0) 50)...)

使用的燃料图表看起来确实非常不同:

Fuel_used_02

该图现在是一条似乎始终为 0 的线。所以我在想,刨床知道燃料不够,因此将其视为0,但前提条件不会触发。我希望输出如下:Goal 可以简化为 false或 sth。像那样。

我需要这个先决条件才能工作,因为最终,我希望漫游者在确定他无法以他的燃料水平行驶时为其电池充电......

4

0 回答 0