0

我必须创建 PPDL,其中车辆在地图上运输货物。车辆具有承载多少货物的能力。在车辆装载货物之前,它需要知道车辆是否有足够的容量来承载该货物。如何为车辆对象分配容量?

我见过这样的例子:

< (passengers ?lift) (capacity ?lift)

很明显,在这种情况下,“电梯”具有容量属性和乘客属性。有人可以提供这个对象声明的外观示例吗?

为这个糟糕的问题道歉,我是 PDDL 的新手,并且仍然试图将我的头绕在它周围。

这是我将货物装载到车辆上的装载功能:

  (:action load
     :parameters (?vehicle ?cargo ?location)
     :precondition (and (at?vehicle ?location)  (at ?cargo ?location) (< (loadedCargo ?vehicle) (capacity ?vehicle)))
     :effect (and (at ?c ?vehicle) (increase(loadedCargo ?vehicle) + 1))

另一个问题是有不同类型的车辆,我们需要一种方法来确定我们正在装载哪种类型的车辆,因为不同的车辆具有不同的容量。

我很确定我使用的是 PDDL 2.1

4

1 回答 1

3

这完全取决于您愿意使用的计划类型。如果它是 2.1,那么您可以使用数字变量来做您想做的事情(这就是您在该示例中找到的)。论文 [此处] 中的图 1 也显示了这一点。

如果它只是您希望使用的经典规划,那么您需要在编码方面更聪明一点。像这样的谓词(capacity ?vehicle ?num)需要在?num类型对象所在的位置创建,number并且您创建了有限数量的谓词。如果您的容量足够小,这可以工作。

与往常一样,一个工作示例将有助于了解您卡在哪里。


编辑:确认PDDL2.1后

我可以通过您发布的 PDDL 看到的问题:

  • 中缺少一个空格at?vehicle
  • 您在先决条件中的容量检查应包括货物尺寸。例如,

    (< (+ (loadedCargo ?vehicle) (cargosize ?cargo)) (capacity ?vehicle))

  • 错误的变量名(at ?c ?vehicle)(应该是?cargo
  • 您的增加应使用中缀符号并包括货物尺寸:(increase (loadedCargo ?vehicle) (cargosize ?cargo))
  • 您需要从当前位置移除货物作为效果:(not (at ?cargo ?location))

我认为这就是我在这个例子中看到的所有问题,但我还没有测试过。

于 2020-04-13T12:41:55.923 回答