遗传算法结合非线性规划求解问题

阅读文本前,建议了解上一篇文章

非线性规划研究一个n元实函数在一组等式或不等式的约束条件下的极值问题。利用MATLAB中的fmincon函数求解非线性规划问题的函数,他从一个预估值出发,搜索约束条件下非线性多元函数的最小值。主要注重对梯度法的研究。

遗传算法适用于处理传统搜索算法难以解决的复杂和非线性优化的问题。遗传算法的优点是将问题参数编码成染色体后进行优化,而不针对参数本身,从而不受函数约束条件的限限制。而且优化计算时算法不依赖于梯度信息。且不要求目标函数连续及可导,使其适于求解传统搜索方法难以解决的大规模、非线性组合优化问题。

经典非线性规划算法大多采用梯度下降的方法求解,局部搜索能力较强,但是全局搜索能力显得不足。遗传算法采用选择、交叉和变异算子进行搜索,从而其全局搜索能力较强,但是局部搜索却相对较弱,一般只能得到问题的次优解。因此,我们将两种算法进行结合,以得到问题的全局最优解。

下面利用两种算法的结合求解函数的极小值。

f ( x ) = − 5 s i n x 1 s i n x 2 s i n x 3 s i n x 4 s x i n x 5 − s i n 5 x 1 s i n 5 x 2 s i n 5 x 3 s i n 5 x 4 s x i n 5 x 5 + 8 f(x)=-5sinx_1sinx_2sinx_3sinx_4sxinx_5-sin5x_1sin5x_2sin5x_3sin5x_4sxin5x_5+8 f(x)=5sinx1sinx2sinx3sinx4sxinx5sin5x1sin5x2sin5x3sin5x4sxin5x5+8

已知该函数最小值为-2,最小值取值为x1到x5均取值为π/2。

该算法流程为种群初始化—>适应度值计算—>选择—>交叉—>变异—>非线性规划,若不满足条件则重复进行到适应度值计算步骤;若满足条件则结束。

主函数如下:

%% 遗传算法参数
maxgen=30;                         %进化代数
sizepop=100;                       %种群规模
pcross=[0.6];                      %交叉概率
pmutation=[0.01];                  %变异概率
lenchrom=[1 1 1 1 1];              %变量字串长度
bound=[0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi];  %变量范围

%% 个体初始化
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %种群结构体
avgfitness=[];                                               %种群平均适应度
bestfitness=[];                                              %种群最佳适应度
bestchrom=[];                                                %适应度最好染色体

% 初始化种群
for i=1:sizepop
    individuals.chrom(i,:)=Code(lenchrom,bound);       %随机产生个体
    x=individuals.chrom(i,:);
    individuals.fitness(i)=fun(x);                     %个体适应度
end

%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[];

%% 进化开始
for i=1:maxgen
    % 选择操作
    individuals=Select(individuals,sizepop);
    avgfitness=sum(individuals.fitness)/sizepop;
    % 交叉操作
    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
    % 变异操作
    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound);
    
    if mod(i,10)==0
        individuals.chrom=nonlinear(individuals.chrom,sizepop);
    end
    
    % 计算适应度
    for j=1:sizepop
        x=individuals.chrom(j,:);
        individuals.fitness(j)=fun(x);
    end
    
    %找到最小和最大适应度的染色体及它们在种群中的位置
    [newbestfitness,newbestindex]=min(individuals.fitness);
    [worestfitness,worestindex]=max(individuals.fitness);
    
    % 代替上一次进化中最好的染色体
    if bestfitness>newbestfitness
        bestfitness=newbestfitness;
        bestchrom=individuals.chrom(newbestindex,:);
    end
    individuals.chrom(worestindex,:)=bestchrom;
    individuals.fitness(worestindex)=bestfitness;
    
    avgfitness=sum(individuals.fitness)/sizepop;
    
    trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
%进化结束

%% 结果显示
figure
[r c]=size(trace);
plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');
title(['函数值曲线  ' '终止代数=' num2str(maxgen)],'fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('函数值','fontsize',12);
legend('各代平均值','各代最佳值','fontsize',12);
ylim([1.5 8])
disp('函数值                   变量');
% 窗口显示
disp([bestfitness x]);
grid on

左图为移除上述主函数中的非线性规划部分,右图为运行上述主函数。

遗传算法结合非线性规划求解问题_第1张图片
遗传算法结合非线性规划求解问题_第2张图片

仅运用遗传算法时得到数据:函数值为2.0652,x1=1.5841、x2=1.5111、x3=1.5744、x4=1.5612、x5=1.5944;而当基于遗传算法和非线性规划时得到数据:函数值为2.0000,x1到x5取值均为1.5708。

由此可见,将非线性规划方法同遗传算法相结合,可以得到函数的最优解,提高了两者的算法性能。


需要源码请在文章下留言

你可能感兴趣的:(matlab,算法,开发工具)