摘要:如何为我想最小化一个量(质量(但对其他量有约束(最大加速度和最大速度需要小于某个值(的问题创建适应度函数?此外,我将如何让遗传算法实际改变模型中的参数(将在下面解释更多(。
背景:我正在做一个项目(火箭模拟(,我想安全地降落火箭,最大限度地减少使用的燃料质量,并确保最大加速度和速度对里面的宇航员来说是安全的。用户唯一控制的是在给定高度下所需速度的形式:v = f(x(。也许,我可以将我的问题分解为以下几个部分:
1(在不输入f(x(形式的情况下,是否有可能让遗传算法形成自己的"优化"函数?
2( 如果可能,我将如何实现成本函数? - 一些搜索使我找到了以下形式: 健康 =(体重(*mass_fuel_left - 对违反的每个限制进行处罚
3(如果我能够获得一个函数,我将如何实际让程序运行不同的迭代?
(这是针对 MATLAB 或 Python 的 - 我已经有用于模拟的工作代码,但只是想探索这个可能的扩展(
我真的很感激任何帮助或对有用来源的一些指导。
我不知道您的系统是如何工作的,但我想您只是向程序提供给定的功能,它会模拟着陆跟踪重要参数,例如使用的燃料质量、最大加速度和速度,对吗?所以就像模拟本身是某种黑匣子一样,你不知道引擎盖下的实际工作原理。 如果是这样,你基本上只是拿出一个函数并将其提供给模拟,它会告诉你它是否通过以及油箱中还剩下多少燃料。
在这种情况下,您的健身函数非常简单:
function fitness(Fx) {
result = simulate(Fx);
if(!result.pass) return -1;
return result.fuelLeft;
}
这只是伪代码,基本上它以我们的遗传算法标本函数f(x(作为输入,然后用它运行模拟:如果模拟没有通过(宇航员死亡(,那么标本就不好(请记住,杀人不是惩罚,这是永远不应该发生的事情,所以当他们死去时,标本甚至不应该运行以供选择(, 如果模拟通过,那么最好的功能是确保油箱中剩余更多燃料的功能。不管他们是宇航员是否被打乱了,只要他们还活着,你就不会在乎实际的最大加速度/速度。
因此,健身功能很容易推出(因为它通常是因为您应该尽可能保持简单(,但最困难的部分是想出真正有意义的不同功能,并有机会改进前几代。 请记住,当您使用优化算法时,您应该首先以某种方式找到一个可行的解决方案,然后您"环顾"该解决方案以使其更好。 遗传算法具体的作用是用可能的可行解决方案跨越标本群体,然后选择最佳标本来确定下一代。下一代是通过突变或繁殖(或两者兼而有之(前一个标本来确定的。定义突变和育种函数实际上可能非常困难,我认为这是题外话,但最终您的程序步骤应如下所示:
- 生成第一代以某种方式尝试提出通过模拟的不同功能(即使很糟糕(
迭代休耕
- 培育出具有
- 一些父级的新功能的函数对
- 改变上一代功能,打造更多新功能
- 使用每个新功能运行模拟,并使用适应度函数对它们进行排名
- 使用某种区分来只为下一个品种/突变步骤选择"最佳"功能。您实际上可以在每次迭代时设置此判别器,以便控制您的种群,例如,如果通过的样本太多,您会发现自己需要大量计算(可能无用(,因此您可以通过提高所需的适应度来使其更难进入下一代,另一方面,如果您发现迭代之间的结果没有变得更好, 也许你被锁定在某个局部最大值中,应该倾斜要求,以便允许更多不同的标本生成,它们可能会导致更好的未来解决方案。