% 基于遗传算法和粒子群算法的组合完成迭代 %
%算法流程:https://blog.csdn.net/sfejojno/article/details/131629140 【这里面是所谓的嵌入式混合】
%混合优化算法的方法有很多,有并行混合、串行混合、嵌入式混合三种。
%粒子和染色体本质上是一样的东西%
%本代码的方法是直接将两种处理方法串起来:先用遗传算法优化,再计算适应度,再使用粒子群算法进行优化,最终得到本次迭代下的粒子和适应度值%
function BestFit_everyItration_Combine = funcGAPSO(BestFit_everyItration_Combine0,cfg)
BestFit_everyItration_Combine = BestFit_everyItration_Combine0;
x = cfg.x;
Num_iteration = cfg.Num_iteration;
CombineElement = cfg.CombineElement; %初始化的粒子/染色体
Num_Element = cfg.Num_Element;
%拿出参数
%遗传算法的
staynum = cfg.staynum;
muteNum = cfg.muteNum;
%粒子群算法的
Num_partical = cfg.Num_partical;
V_range = cfg.V_range;
W = cfg.W;
C1 = cfg.C1;
C2 = cfg.C2;
V_partical = cfg.V_partical;
%得到初始化下各粒子的最优适应度、全部粒子的最优适应度及粒子
Fitness0 = zeros(Num_Element,1);
for ii = 1:Num_partical
Fitness0(ii) = Rastrigin(CombineElement(ii,:));
end
%填充初始化的情况%
BestFit_partical = zeros(Num_Element,3);
BestFit_global = zeros(1,3);
BestFit_partical(:,1) = Fitness0;
BestFit_partical(:,2:end) = CombineElement;
[BestFit_global(1),id] = min(Fitness0);
BestFit_global(2:end) = CombineElement(id,:);
CombineElement_old = CombineElement;
V_partical_old = V_partical;
%画出每次迭代下各粒子的适应度
figure(103);hold on; xlabel('迭代次数');ylabel('各粒子适应度');title('串行混合算法下不同迭代次数下适应度的变化');grid on;hold on;
%进行迭代
for ii = 1:Num_iteration
%----先是遗传算法部分----%
%计算适应度和选取概率
for jj = 1:Num_Element
Fitness1(jj) = Rastrigin(CombineElement_old(jj,:));
end
[SelectionProbabilityOld] = CalSelectionProbability(Fitness1,Num_Element);
%此外,这里更新一次历次迭代的最优适应度
[BestFit_everyItration_Combine(ii,1),id] = min(Fitness1);
BestFit_everyItration_Combine(1,2:end) = CombineElement_old(id,:);
%交叉
for jj = 1:Num_Element-staynum
%基于轮盘赌方法选择父代染色体
dadID = ChoseParaments(SelectionProbabilityOld);
dadchromosome = CombineElement_old(dadID,:);
while 1
momID = ChoseParaments(SelectionProbabilityOld);
if momID ~= dadID
break;
end
end
momchromosome = CombineElement_old(momID,:);
%选好之后就是交叉,因为这里只有两个基因,那就从父母那边各拿一个。
ChromosomeOut(jj,:) = [dadchromosome(1) momchromosome(2)];
end
%变异,随机选择染色体的某个基因 然后随机变成可选范围内的值。
mutedID = zeros(1,muteNum); %需要变异的数量,这里定义一个装载已经发生了变异的染色体id
for pp = 1:muteNum
TasksID = randi(2); %从所有任务(基因)中随机选择一个任务
%选待变异的染色体,需要确保每次选择的不应该重复。
while 1
ChromosomeID = randi(Num_Element-staynum);
if isempty(find(mutedID == ChromosomeID))
break;
end
end
%确定将该染色体的该基因变异成什么,需要确保不变成和原来的值一样(虽然概率极低,但是还是写个循环)。
while 1
NodesID = rand(1)*(x(end)-x(1)) + x(1); %从所有可选范围中随机选择一个点
if NodesID ~= ChromosomeOut(ChromosomeID,TasksID)
break;
end
end
%完成变异
ChromosomeOut(ChromosomeID,TasksID) = NodesID;
mutedID(pp) = ChromosomeID;
end
%完成复制(也可以放在后面):选择几个适应度最高的直接复制到下一代,这几条不参与变异!
dataTmp = Fitness1;
maxVal = max(dataTmp);
for pp = 1:staynum
[~,ID] = min(dataTmp); %应该只会有一个值吧? 这里是找到最小的值(对应的适应度最大)
ChromosomeOut(pp+(Num_Element-staynum),:) = CombineElement_old(ID,:);
dataTmp(ID) = maxVal; %为了防止最大适应度的染色体被重复找到
end
%----对前述结果进行粒子群算法优化----%
%先计算适应度、更新最优适应度的粒子
for kk = 1:Num_Element
Fitness2(kk) = Rastrigin(ChromosomeOut(kk,:));
if BestFit_partical(kk,1) > Fitness2(kk)
BestFit_partical(kk,1) = Fitness2(kk);
BestFit_partical(kk,2:end) = ChromosomeOut(kk,:);
end
end
[Bestfit,id] = min(Fitness2);
if BestFit_global(1) > Bestfit
BestFit_global(1) = Bestfit;
BestFit_global(2:end) = ChromosomeOut(id,:);
end
%进行正式的迭代更新
WUse = W(2) - (W(2) - W(1))*ii/Num_iteration; %更新本次使用的惯性量
for jj = 1:Num_Element
%更新速度
V_partical_New(jj,:) = WUse*V_partical_old(jj,:) + C1*rand(1)*(BestFit_partical(jj,2:end) - ChromosomeOut(jj,:)) + ...
C2*rand(1)*(BestFit_global(2:end) - ChromosomeOut(jj,:));
%判断速度是否越界
for kk = 1:size(V_partical,2)
if V_partical_New(jj,kk) < V_range(1)
V_partical_New(jj,kk) = V_range(1);
elseif V_partical_New(jj,kk) > V_range(2)
V_partical_New(jj,kk) = V_range(2);
end
end
%更新粒子位置,这里输出的就是本次迭代下真正的输出。
CombineElement_New(jj,:) = ChromosomeOut(jj,:) + V_partical_New(jj,:);
%判断位置是否越界
for kk = 1:size(ChromosomeOut,2)
if CombineElement_New(jj,kk) < x(1)
CombineElement_New(jj,kk) = x(1);
elseif CombineElement_New(jj,kk) > x(end)
CombineElement_New(jj,kk) = x(end);
end
end
end
%新变旧
CombineElement_old = CombineElement_New;
V_partical_new = V_partical_old;
%画出本次迭代下各粒子的适应度
scatter(ii,Fitness1,'ro');
end
figure(103);hold off;
%% 基于适应度计算每条染色体的选取概率 %%
function [SelectionProbability] = CalSelectionProbability(adaptability,Chromosome_num)
%但是我们这里是越小适应度越大,所以先取倒数
adaptability = 1./adaptability;
adaptability_ALL = sum(adaptability);
SelectionProbability = zeros(1,Chromosome_num);
for i = 1:Chromosome_num
SelectionProbability(i) = adaptability(i)/adaptability_ALL;
end
end
%% 使用轮盘赌算法来选择父/母染色体 %%
function [ID] = ChoseParaments(SelectionProbability)
randval = rand(1);
%需不需要预先对概率值的顺序随机化?%
%这里暂时不随机化,或者随机化的过程可以在该函数外边进行%
probability = 0;
for j = 1:length(SelectionProbability)
probability = SelectionProbability(j) + probability;
if probability >= randval
ID = j;
break;
end
end
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
粒子群算法与遗传算法的对比&串行混合优化仿真 - 基于Rastrigin测试函数博文对应的代码.zip (6个子文件)
粒子群算法与遗传算法的对比&串行混合优化仿真 - 基于Rastrigin测试函数博文对应的代码
funcGAPSO.m 8KB
funcPSO.m 4KB
main.m 3KB
Rastrigin.m 300B
funcConfig.m 1KB
funcGA.m 5KB
共 6 条
- 1
资源评论
墨@#≯
- 粉丝: 745
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功