创建具有多个无关约束的目标函数的适应度函数吗?

时间:2019-08-17 20:46:21

标签: genetic-algorithm

摘要::对于一个我要最小化一个量(质量)但对其他量有约束(最大加速度和最大速度必须小于1的问题),如何创建适应度函数一定的值)?另外,我如何获得一种遗传算法来实际改变模型中的参数(将在下面进行解释)。

上下文:我正在进行一个项目(火箭模拟),在该项目中,我希望安全着陆火箭,最大程度地减少燃料消耗,并确保最大加速度和速度对内部的宇航员是安全的。用户唯一控制的是给定高度下的所需速度形式:v = f(x)。也许,我可以将问题分解为以下几个部分:

1)如果不输入f(x)的形式,是否有可能使遗传算法形成其自身的“优化”功能?

2)如果可能,我将如何实施成本函数? -一些搜索使我想到了某种形式: Fitness =(重量)* mass_fuel_left-违反每个约束的惩罚

3)如果我能够获得一个函数,我实际上将如何使程序在不同的迭代中运行?

(这是用于MATLAB或Python的-我已经有用于仿真的工作代码,但只想探索这个可能的扩展)

我非常感谢您对有用资源的任何帮助或指导。

1 个答案:

答案 0 :(得分:1)

我不知道您的系统如何工作,但是我想您只是给程序提供了给定的功能,它就模拟着陆跟踪重要参数,例如所用的燃料质量,最大加速度和速度,对吗?因此,就像模拟本身就是某种黑匣子一样,您不知道引擎盖下的实际工作原理。 如果是这样,您基本上只是想出一个功能并将其提供给模拟,它会告诉您是否通过了该功能以及油箱中剩余了多少燃油。

在这种情况下,您的健身功能非常简单:

function fitness(Fx) {
    result = simulate(Fx);
    if(!result.pass) return -1;
    return result.fuelLeft;
}

这只是伪代码,基本上它将作为遗传算法样本的函数f(x)作为输入,然后使用它运行模拟:如果模拟未通过(宇航员死亡),则样本为否好(请记住,杀死人不是惩罚,这是绝不的事情,因此当他们死了的时候,甚至不应该选择样本),如果模拟通过,那么最好的功能就是确保油箱中有更多燃料的燃料。只要宇航员还活着,只要他们还活着,就没关系,只要您还活着,您就不会在乎实际遇到的最大加速度/速度。

因此健身功能很容易实现(通常应尽可能使它保持简单),但是最难的部分是提出切实可行并有机会的不同功能更好地代代相传 请记住,在使用优化算法时,您首先应该以某种方式找到可行的解决方案,然后再在该解决方案周围“寻找”以使其变得更好。 遗传算法的具体作用是在可能的可行解决方案中覆盖整个样本,然后选择最佳的解决方案来确定下一代。通过突变或繁殖(或同时)前一个样本来确定下一代。定义突变和育种功能实际上可能非常困难,我认为这是不合时宜的,但是最后,您的程序步骤应如下所示:

  1. 以某种方式尝试生成能够通过模拟的不同功能的第一代产品(即使性能很差)

迭代休憩

  1. 繁殖了几个功能,同时又有了新功能,这两个功能都具有父级功能
  2. 更改上一代功能以创建更多新功能
  3. 使用每个新功能运行仿真,并使用适应度功能对其进行排名
  4. 使用某种区分方式仅选择“最佳”功能用于下一步的繁殖/变异步骤。实际上,您可以在每次迭代时都设置此判别式,以便可以控制总体,例如,如果通过的标本过多,您会发现自己需要进行大量计算(可能无用),因此可能会使创建起来更加困难另一方面,如果通过提高所需的适应度来达到下一代,则如果发现迭代之间的结果并没有得到改善,则可能是您锁定了某个局部最大值,因此应该精简要求,以便允许生成更多不同的样本并它们可能会带来更好的未来解决方案。