2

我正在尝试使用 PDDL解决点亮难题。为了实现将灯泡放置在单元格中的效果,我必须在 (x, y) 中放置一个灯泡,然后只要没有黑色单元格就点亮相同的行和列。我无法点亮细胞,直到黑色细胞。

例如,对于一个 5*5 的网格,如果我想在 (0,1) 处放置一个灯泡,并且在 (3, 1) 处有黑色单元格,我只想点亮单元格 (0,1),( 1,1), (2,1) 如果我只考虑列。但我不想点亮单元格 (4,1),因为它在黑色单元格之后。

所以,如果我使用类似 forall 的东西,当它在一行/列中找到一个黑色单元格时,我将如何打破 for all 循环?

4

1 回答 1

2

我认为看看 PDDL 中的公理和派生谓词是值得的。这使得构建传递闭包并从其他变量中获取信息成为可能。

事实上,你可以从网格结构(哪些细胞是黑色的)和灯泡的信息中得出哪些细胞有光。因此,您可以为每个单元定义派生谓词 lit((x,y)) 并使用公理编写背景理论:

  • 点亮((x,y))<=灯泡((x,y))
  • 点亮((x,y))<=点亮((x',y'))和连接((x,y),(x',y'))和〜黑色((x,y))

对于所有非黑色单元格,目标公式可能类似于:“lit((0,0)) and ... and ... lit((n,m))”。

于 2019-06-24T12:01:26.410 回答