通过Q学习学习扫雷行为

时间:2019-10-09 16:01:39

标签: c++ q-learning

我正尝试使用Q学习在Mat Buckland的智能扫地机的谨慎版本上进行扫雷行为,该版本可在http://www.ai-junkie.com/ann/evolved/nnt1.html处进行分配。分配将我们限制为在有效为40x40的网格上进行2000次移动的50次迭代,每次重置时都会重置地雷,并在随机位置生成代理。

我尝试执行q学习,包括对移动的惩罚,对扫雷的奖励以及对未命中地雷的惩罚。清扫器代理似乎无法学习如何在50次迭代中有效地扫雷,因为它知道去特定的单元格是好的,但是在地雷消失之后,它不再受到奖励,而是会因移动到该单元而受到惩罚费用

我想仅在清除所有地雷以使环境保持静态时才尝试提供奖励,因为这样只会导致并非所有地雷都被收集或所有地雷都被收集的状态,但由于以下原因而努力实施该代理每次迭代仅移动2000次,并且能够回溯,因此它永远都无法在有或没有奖励收集地雷的情况下,在限制范围内一次扫描所有地雷。

我的另一个想法是为每个地雷都拥有一个有效的新Q矩阵,因此,一旦收集了地雷,清扫工就会转换到该矩阵,并在不考虑当前地雷的情况下进行操作。

我是否可以采用更好的方法,或者对我可以尝试的方法做一些更实际的调整?

对规则的更明确的解释:

  • 地图边缘会回绕,因此,从地图的右边缘移开会导致漫游器出现在左边缘等。
  • 扫地机器人可以从任何地图图块向下,向左或向右移动。
  • 当机器人与地雷相撞时,地雷被认为是被扫地然后清除的。
  • 该机器人的目标是学习从任何起始位置扫掠地图上的所有地雷。

1 个答案:

答案 0 :(得分:1)

鉴于清扫车总能看到最近的地雷,这应该很容易。从您的问题中,我认为您唯一的问题是为代理人状态找到良好的奖励功能和代表。

定义状态

绝对位置在随机环境中很少有用,尤其是在环境如您的示例中那样无限的情况下(因为机器人可以越过边界并在另一侧重生)。这意味着代理程序不需要环境大小(我们实际上将需要它来模拟无限空间,因此)。

奖励函数根据代理的当前状态与其之前的状态进行比较来计算其返回值。但是我们如何定义状态?让我们看一下我们实际需要的操作代理的方式。

  1. 代理人的职位。
  2. 最近的地雷的位置。

这就是我们所需要的。现在我错误地说绝对立场不好。这是因为它使Q表(您称其为Q矩阵)是静态的,并且非常易碎。因此,让我们尝试从奖励函数中完全消除理想职位,并将其替换为相对职位。幸运的是,这在您的情况下非常简单:我们使用最近的地雷与代理商之间的相对位置,而不是使用绝对位置。

现在我们不再处理坐标,而是向量。让我们计算点之间的向量:v = pos_mine - pos_agent。此向量为我们提供了两个非常重要的信息:

  1. 最近的矿井的方向,以及
  2. 到最近的地雷的距离。

这些都是我们使代理能够运作的全部。因此,代理状态可以定义为

State: Direction x Distance

其距离是浮点值,方向是描述角度的浮点或归一化向量。

定义奖励功能

鉴于我们新定义的状态,我们在奖励函数中唯一关心的就是距离。由于我们所需的只是将特工移向地雷,因此距离至关重要。以下是奖励功能如何工作的一些猜测:

  1. 如果探员扫雷(距离== 0),则返还巨额奖励(例如100)。
  2. 如果特工向地雷移动(距离在缩小),则返回中立(或少量)的奖励(例如0)。
  3. 如果特工离开地雷(距离在增加),请重新奖励负奖励(例如-1)。

从理论上讲,由于我们惩罚远离地雷的行为,因此这里甚至不需要规则1。

结论

剩下的唯一事情就是确定一个好的学习率和折扣,以便您的代理在50次迭代后表现良好。但是,鉴于环境的简单性,这甚至没有什么关系。实验。