我正在尝试设计一种带有神经网络的遗传算法,让汽车穿过在 Unity 中生成的城市到达随机目标目的地。我设计了它并且代码有效,但代理只学习避开障碍物而不是移动到指定的目标目的地。
目前我的健身功能是:
((1 / (1 + totalDistanceTravelled)) + (1 / (1 + distanceToTarget)) + (1 / (1 + numberOfCollisions)) + sensors.Average())
我如何修改它以满足预期的结果?
如果需要更多,请告诉我。
让我们以一种可能更易读的方式仔细看看您的健身功能(尽管我认为括号也有帮助):
(
(
1 / (1 + totalDistanceTravelled)
) +
(
1 / (1 + distanceToTarget)
) +
(
1 / (1 + numberOfCollisions)
) +
sensors.Average()
)
看起来你在权衡行驶距离、目标距离和碰撞次数。不确定 sensors.Average() 是什么(不熟悉 unity),但我认为这可能不是问题所在。
让我们假设碰撞次数远小于行进距离或到目标的距离。假设我们有 10 次碰撞,我们已经行驶了 100 个单位,还有 100 个单位要行驶。
前两个是0.0099,第二个是0.09。如果我们认为越高越好,那么它肯定会优先避免东西,至少直到你非常接近目标或者你有很多碰撞。
更好的选择是使用碰撞次数作为系数。像这样的东西:
(
(
(
1 / (1 + totalDistanceTravelled)
) +
(
1 / (1 + distanceToTarget)
)
) *
(
1 / (1 + numberOfCollisions)
) +
sensors.Average()
)
在这种情况下,我们同样考虑距离,然后将其乘以碰撞因子
设计一个良好的适应度函数并不是一项微不足道的任务,事实上,它通常是创建一个成功的遗传算法的核心任务。你没有提供太多细节,但我会尝试提供一些有用的分析。
良好的适应度函数的一个要求是,它必须至少从基因空间中的某些起点提供一条通向您想去的地方的平滑路径。也就是说,如果你从基因空间中的一个随机点开始,你能否使用适应度函数作为指导,逐步迁移到基因空间中越来越好的地方。
看看你的健身功能,我的倾向是,最容易找到的解决方案就是不要移动太多。让我们把健身功能分解成它的组成部分:
1/(1 + distance-travelled)
1/(1 + distance-to-target)
1/(1 + number-collisions)
sensor-average
- 不确定这是什么?假设
distance-to-target
是10。前三个分量是1 + 1/10 + 1
。如果你向目标靠近一步而不与任何东西发生碰撞,前三个分量是 1/2 + 1/9 + 1
比以前少。这显然不是你想要做出正确行动的反馈。
对于这个任务,我认为你希望
distance-to-target
支配适应度,即如果你更接近目标,无论其他因素如何,适应度都应该增加。
我没有一个理想的健身功能,但我会考虑一下。
假设等效的
distance-to-taret
,distance-travelled
应该是下一个最重要的因素。假设两个结果在 5
中达到 distance-to-target
,则行进距离较短的那个应该得分较高。
number-collision
需要相对于distance-travelled
,否则,您可以通过不旅行来最小化number-collisions
。
想法是您需要研究健身功能的细节,并确保它始终提供正确的反馈。这并不像听起来那么容易,因为大多数适应度函数都有多个变量。
如果存在在适应度函数中找到局部最大值而不实际解决问题的有害解决方案,算法可能会找到它。