基于樽海鞘群算法的线性规划求解matlab程序
1 樽海鞘群优化算法
1.1 生物启示
通过研究海底生物樽海鞘在觅食过程中群体呈链状向食物方向移动的行为活动,学者Mirjalili在2017年提出的一种新型启发式仿生算法—樽海鞘群智能优化算法(Salp Swarm Algorithm, SSA)。樽海鞘在生物分类中隶属樽海鞘科,身体形态为桶型,颜色略透明。它们的组织和水母非常相似,且运动方式也很像水母,樽海鞘的食物是浮游植物(海草等),它们是通过用身体吸—排海水从而进行运动。一般情况下樽海鞘身体长度为1-10厘米,在水中有时为单一个体有时为群体运动。樽海鞘的生物学研究仍处于初期阶段,主要是因为人类探索它们的生活环境难度很大,很难在实验室环境中对它们进行研究。樽海鞘最有趣的行为之一是它们的成群行为。在深海中,樽海鞘经常呈现链状进行群体活动。这种行为主要机理并不明确,但一些生物学者认为,这是为了通过群体协作使樽海鞘群运动更快,从而进行高效地觅食行为。
1.2 SSA算法
樽海鞘群算法(SSA)是学者Mirjalili于2017年提出的一种新型群智能算法,该算法寻优过程模仿海底生物樽海鞘呈链状运动的觅食行为[64]。使用数学模型将樽海鞘群活动的行为表达出来,樽海鞘链由以下两部分构成:领导者以及跟随者。领头的樽海鞘个体是领导者,处于樽海鞘链的最前面,而其余的樽海鞘个体则被称为跟随者。正如两组个体的名称一样,领导者的作用是对搜索方向进行决策,跟随者相互追随(直接或间接跟随领导者),使整个樽海鞘链像食物源的方向移动。与其他基于群体行为的智能优化算法类似,N维的搜索空间中,每一个樽海鞘的位置被定义为X,N即为优化问题中决策变量的个数,D为樽海鞘种群数量。则樽海鞘种群的位置由X N维矩阵组成,如下所示:
(1)在樽海鞘群觅食过程中,领导者需要根据自身与食物源的距离进行位置变化,可通过式(2.2)进行计算:
其中第j维度上1jx为第一个个体(领导者)的位置;jF为食物源在第j维的位置;,j jub lb分别为第j维空间的上限与下限;2 3c,c为随机数,2 3c,c[0,1];c有着平衡樽海鞘群算法在全局探索或局部开发两种状态的作用,因而1c为最重要的参数,由式(2.3)进行计算:
其中,e为自然对数的底,t代表本次迭代次数,maxT为算法设置的最大迭代次数。
(2)使用牛顿运动公式更新追随者位置如式2.4所示:
1.3 SSA算法流程
第一步 设置参数,种群初始化。根据所设定范围的搜索空间,生成一个规模为N×D的随机种群。
第二步 计算适应度值。按照目标函数计算公式,计算初始种群中N个樽海鞘个体的适应度值。
第三步 确定食物源位置。在实际寻优问题中,最优解是未知的。将樽海鞘群按照适应度值进行排序,适应度最优的樽海鞘的位置设为本次迭代的食物位置(当前最优位置)。
第四步 领导者与跟随者的确定。去除掉排在首位的樽海鞘个体,群体中剩余N−1个樽海鞘,按照初始种群适应度值的排序,将排在前一半的樽海鞘个体定义为领导者,其余樽海鞘个体视为追随者。
第五步 位置更新。首先根据式(2.2)更新领导者的位置,再根据式(2.5)更新追随者的位置。
第六步 计算更新后的群体的适应度。将更新后的每个樽海鞘个体的适应度值与当前食物的适应度值进行比较,若更新后樽海鞘的适应度值优于食物适应度值,则以适应度值更优的樽海鞘位置作为新的食物的位置。
第七步 重复步骤四-步骤六,当计算运行到最大迭代次数,输出当前的食物位置作为全局最优位置。
2 线性规划算例
2.1算例
2.2算例答案
3 樽海鞘群算法求解结果
1)迭代曲线
2)求解答案
4 matlab程序
1)主函数
%% 基于樽海鞘群算法的线性规划求解
clear
clc
close all
SearchAgents_no=30; % Number of search agents
Function_name='F1'; % Name of the test function that can be from F1 to F23 (
Max_iteration=200; % Maximum numbef of iterations
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[Best_score,Best_pos,SSA_cg_curve]=SSA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
%% 结果画图
figure
plot(SSA_cg_curve,'Color','r')
title('迭代曲线')
xlabel('Iteration');
ylabel('Best score obtained so far');
% axis tight
grid on
box on
legend('SSA')
%% 结果输出
display(['最优变量为 ', num2str(Best_pos)]);
display(['最优解为 ', num2str(Best_score)]);
。。。。略