本节主要介绍如何利用哈里斯鹰优化算法对拉伸/压缩弹簧设计工程问题进行参数寻优。主要包括问题描述;适应度函数设计;主函数设计几个部分。
如图2.11所示,拉伸/压缩弹簧设计问题的目的是在满足最小挠度、震动频率和剪应力的约束下,最小化拉压弹簧的重量。该问题由3个连续的决策变量组成,即弹簧线圈直径( d 或 x 1 )、弹簧簧圈直径( D 或 x 2 )和绕线圈数( P 或 x 3 )。数学模型表示公式如下。
图2.11 拉伸/压缩弹簧设计问题示意图
最小化:
约束条件为:
变量范围:
0.05≤ x 1 ≤2
0.25≤ x 2 <1.3
2≤ x 3 ≤15
在该问题中,变量范围的约束条件如下:
0.05≤ x 1 ≤2
0.25≤ x 2 <1.3
2≤ x 3 ≤15
可以通过设置哈里斯鹰个体的边界条件进行设置。即设置哈里斯鹰个体的上边界为 ub =[2,1.3,15],哈里斯鹰个体的下边界为 lb =[0.05,0.25,2]。针对约束 g 1 ( X )− g 4 ( X ),在适应度函数中进行处理。针对不满足约束条件的情况,采用增加惩罚数的方式对适应度进行求解,当满足约束条件时,不增加惩罚数,反之增加。使得不满足条件个体的适应度比较大,竞争力减弱。定义不满足约束条件的个数为 n ,惩罚系数为 P ,惩罚数的计算如下:
V = n × P
适应度的计算如下:
fitness = f ( x )+ V
定义适应度函数fun如下:
%% 适应度函数 function [fitness,g] = fun(x) P=10E4;%惩罚系数 x1=x(1); x2=x(2); x3=x(3); f=(x3+2)*x2*x1^2; %约束条件计算 g(1)=1-(x2^3*x3)/(71785*x1^4); g(2)=(4*x2^2-x1*x2)/(12566*(x2*x1^3-x1^4))+1/(5108*x1^2)-1; g(3)=1-(140.45*x1)/(x2^2*x3); g(4)=(x1+x2)/1.5-1; V = P*sum(g>0);%惩罚数计算 fitness=f + V;%计算适应度 end
通过上述分析设置哈里斯鹰优化算法参数如下。
设置哈里斯鹰种群数量 pop 为30,最大迭代次数 maxIter 为100,个体维度 dim 为3(即 x 1 , x 2 , x 3 ),个体上边界 ub =[2,1.3,15],个体下边界 lb =[0.05,0.25,2]。
哈里斯鹰优化算法求解拉伸/压缩弹簧设计问题的主函数main设计如下:
%% 基于哈里斯鹰优化算法的拉伸/压缩弹簧设计 clc;clear all;close all; %参数设定 pop = 30;%种群数量 dim = 3;%变量维度 ub = [ 2,1.3,15];%个体上边界信息 lb = [0.05,0.25,2];%个体下边界信息 maxIter = 100;%最大迭代次数 fobj = @(x) fun(x);%设置适应度函数为fun(x) %哈里斯鹰优化算法求解问题 [Best_Pos,Best_fitness,IterCurve] = HHO(pop,dim,ub,lb,fobj,maxIter); %绘制迭代曲线 figure plot(IterCurve,'r-','linewidth',1.5); grid on;%网格开 title('哈里斯鹰优化算法迭代曲线') xlabel('迭代次数') ylabel('适应度') disp(['求解得到的x1为:',num2str(Best_Pos(1))]); disp(['求解得到的x2为:',num2str(Best_Pos(2))]); disp(['求解得到的x3为:',num2str(Best_Pos(3))]); disp(['最优解对应的函数值为:',num2str(Best_fitness)]); %计算不满足约束条件的个数 [fitness,g]=fun(Best_Pos); n=sum(g>0);%约束的值大于0的个数 disp(['违反约束条件的个数',num2str(n)]);
程序运行结果如图2.12所示。
图2.12 程序运行结果
运行结果如下:
求解得到的x1为:0.061677 求解得到的x2为:0.64799 求解得到的x3为:3.8189 最优解对应的函数值为:0.014343 违反约束条件的个数0
从收敛曲线上看,适应度函数值随着迭代次数不断减小,表明哈里斯鹰优化算法不断地对参数进行优化。最后,在约束条件范围内,得到了一组满足约束条件的参数,对拉伸/压缩弹簧的优化设计具有指导意义。