首先了解一下理论背景啥的:
1. 非线性规划:
非线性规划是20世纪50年代形成的一门新兴学科。
它研究一个n元实函数在一组等式或不等式的约束条件下的极值问题,非线性规划的理论来源于1951年库恩·塔克建立的最优条件。20世纪50年代,非线性规划的研究主要注重对梯度法和牛顿法的研究。20世纪60年代侧重于对牛顿方法和共轭梯度法的研究。20世纪70年代是非线性规划飞速发展时期,约束变尺度方法和Lagrange乘子法为这一时期的主要研究成果。20世纪80年代以来,随着计算机技术的快速发展,非线性规划方法取得了长足进步,在信赖域法,稀疏拟牛顿法、并行计算、内点法和有限存储法等有领域取得了丰硕的研究成果。
2. 非线性规划函数
函数fmincon是MATLAB最优化工具箱中求解非线性规划问题的函数,它从一个预估值出发,搜索约束条件下非线性多元函数的最小值。
函数fmincon的约束条件为:
其中,x、b、beq、lb和ub是矢量,A和Aeq为矩阵;c(x)和ceq(x)返回矢量的函数;f(x)、c(x)和ceq(x)是非线性函数。
基本用法:
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
其中,nonlcon为非线性约束条件;lb和ub分别为x的下界和上界。当函数输入参数不包括A、b、Aeq、beq时,默认A=0、b=0、Aeq=[ ]、beq = [ ]。x0为x的初设值。
3. 遗传算法的基本思想
遗传算法师一类借鉴生物界自然选择和自然遗传机制的随机搜索算法,非常适用于处理传统搜索算法难以解决的复杂和非线性优化问题。目前,遗传算法已被广泛应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。
与传统搜索算法不同,遗传算法从随机产生的初始解开始搜索,通过一定的选择、交叉、变异操作逐步迭代以产生新的解。群体中的每个个体代表问题的一个解,称为染色体,染色体的好坏用适应度来衡量,根据适应度的好坏从上一代中选择一定数量的优秀个体,通过交叉、变异形成下一代群体。结果若干代的进化之后,算法收敛于最好的染色体(解),它即是问题的最优解或次优解。
遗传算法的优点是将问题参数编码成染色体后进行优化,而不针对参数本身,从而不受函数约束条件的限制;搜索过程从问题解的一个集合开始,而不是单个个体,具有隐含并行搜索特性,可以大大减少陷入局部最小的可能性。而且优化计算时算法不依赖于梯度信息,且不要求目标函数可连续及可导,使其适用于求解传统搜索方法难以解决的大规模、非线性组合优化问题。
4. 算法结合思想
经典非线性规划算法大多采用梯度下降的方法求解,局部搜索能力较强,但是全局搜索能力较弱。遗传算法采用选择、交叉和变异算子进行搜索,全局搜索能力较强,但是局部搜索能力较弱,一般只能得到问题的次优解,而不是最优解。
在我看的书上,老师结合了两种算法的优点,一方面采用遗传算法进行全局搜索,一方面采用非线性规划算法进行局部搜索,以得到问题的全局最优解。
以下是例子:
问题描述:采用遗传算法和非线性规划的方法求解如下函数的极小值:
其中的变量都在0~0.9π之间。
该函数的最小值为-2,最小值位置为(π/2,π/2,π/2,π/2,π/2)。
算法流程:
其中,种群初始化模块根据求解问题初始化种群,适应度值计算模块根据适应度函数计算种群中染色体的适应度值,选择、交叉和变异为遗传算法的搜索算子,N为固定值,当进化次数为N的倍数时,则采用非线性寻优的方法加快进化,非线性寻优利用当前染色体值采用函数fmincon寻找问题的局部解。
遗传算法实现:
1. 种群初始化
由于遗传算法不能直接处理问题空间的参数,因此必须通过编码把要求问题的可行解表示成遗传空间的染色体或者个体。常用的编码有位串编码、Grey编码、实数编码(浮点法编码)、多级参数编码、有序串编码、结构式编码等。
实数编码不必进行数值转换,可以直接在解的表现型上进行遗传算法操作。因此本案例采用该方法编码,每个染色体为一个实数向量。
2. 适应度函数
适应度函数是用来区分群体中个体好坏的标准,是进行自然选择的唯一依据,一般是由目标函数加以变换得到。本案例是求函数的最小值,把函数值的倒数作为个体的适应度值。函数值越小的个体,适应度值越大,个体越优。适应度计算的函数为:
3. 选择操作
选择操作从旧群体中以一定概率选取优良个体组成新的种群,以繁殖得到下一代个体。个体被选中的概率跟适应度值有关,个体适应度值越高,被选择的概率越大。遗传算法选择操作有轮盘赌法、锦标赛法等多种方法,本案例选择轮盘赌法,即基于适应度比例的选择策略,个体i被选中的概率为:
其中,Fi为个体i的适应度值,N为种群个体数目。
4. 交叉操作
交叉操作是指从种群中随机选择两个个体,通过两个染色体的交换组合,把父串的优秀特征遗传给子串,从而产生新的优秀个体。由于个体采用实数编码,所以交叉操作采用实数交叉法,第k个染色体ak和第l个染色体al在j位的交叉操作方法为
其中,b是[0,1]区间的随机数。
5. 变异操作
变异操作的主要目的是维持种群多样性。变异操作从种群中随机选取一个个体,选择个体中的一点进行变异以产生更优秀的个体。第i个个体的第j个基于aij进行变异的操作方法为:
其中,amax是aij的上界,amin是aij的下界,,r2是一个随机数,g是当前迭代次数,Gmax是最大进化次数,r为[0,1]区间的随机数。
6. 非线性寻优
遗传算法迭代计算一次,以遗传算法当前计算的结果为初始值,采用MATLAB优化工具箱中的线性规划函数fmincon进行局部寻优,并把寻找到的局部最优值作为新个体染色体继续进化。
以上就是全过程了,代码的话,我照着老师的步骤练练,下次发hhh。
代码在: