另外 关于你这个问题, 你的目标函数和约束函数是否在工作目录下,还有 在调用的时候 在函数名前面加@试试, 希望能帮到你!遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。首先有个很神奇的现象:人类以及动物的进化都是朝着好的方向发展,虽然有的往坏的方向发展了,但是总体肯定是往好的方向发展。这看似不奇怪,但是我们知道,人类的基因组合是随机的,没有上帝约束。这种随机过程的结果却是一致的!!!!!我们的遗传算法就是从这里得到启发!比如我要求y=x1+x2的最大值,两个变量,我不用传统的数学方法,就用幼儿园的方法,把所有可能取值带进去算,然后找出最大的就行了!但是,有时候取值是连续的,没关系!使其离散化,就像把模拟信号化成数字信号一样!还有个问题,如果取值太多咋办?这就是遗传算法的精髓!
首先,我不用取所有可能取值,我只取几十个或者几百个(自己定),然后进行处理,怎样处理呢?让我们回到刚开始的人类进化问题,虽然没有上帝的帮忙,但是我们知道,自然界遵循优胜劣汰的发贼,遵循交叉变异的法则,虽然不能数字化,但是这是个趋势!我们就是把这种法则数学化!所取的几十个值我要剩下哪些?要抛弃哪些?要处理哪些?这都要我们自己选择,肯定是选择最合适的取值留下,经过一系列的处理,就生成了新的群体,然后再处理,自己约定处理到第几次就可以了,取出现过的最大值
不用担心取到的是不是最大值,因为数学上已经有了证明,这种方法是收敛的,概率是1,所以尽管放心的做,具体的做法要参考相关书籍,不难的。
遗传算法的最大用处就是解决数学理论不能解决的问题!比如路径规划,调度问题……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)