混合灰狼优化(HGWO,DE-GWO)算法matlab源码

2024-09-04 18:32

本文主要是介绍混合灰狼优化(HGWO,DE-GWO)算法matlab源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明:博主所有博文及源码中示例所用的支持向量机算法均使用faruto改进的LIBSVM工具箱3.1版本,详细可参见faruto博客http://blog.sina.com.cn/u/1291365075以及http://www.matlabsky.com/thread-17936-1-1.html。

今天学习一个比较新的优化算法,用差分进化(DE)改进原始的灰狼优化(GWO)得到的HGWO(也可以叫DE-GWO)算法。仍然以优化SVR参数为例,需要的同学可以根据需要自己修改源码。

完整程序和示例文件地址:http://download.csdn.net/detail/u013337691/9675376
百度云链接: http://pan.baidu.com/s/1qYvVguS 密码: i7ie

function [bestc,bestg,test_pre]=my_HGWO_SVR(para,input_train,output_train,input_test,output_test)
% 参数向量 parameters [n,N_iteration,beta_min,beta_max,pCR]
% n为种群规模,N_iteration为迭代次数
% beta_min 缩放因子下界 Lower Bound of Scaling Factor
% beta_max=0.8; % 缩放因子上界 Upper Bound of Scaling Factor
% pCR 交叉概率 Crossover Probability
% 要求输入数据为列向量(矩阵)%% 数据归一化
[input_train,rule1]=mapminmax(input_train');
[output_train,rule2]=mapminmax(output_train');
input_test=mapminmax('apply',input_test',rule1);
output_test=mapminmax('apply',output_test',rule2);
input_train=input_train';
output_train=output_train';
input_test=input_test';
output_test=output_test';
%% 利用差分进化-灰狼优化混合算法(DE_GWO)选择最佳的SVR参数
nPop=para(1); % 种群规模 Population Size
MaxIt=para(2); % 最大迭代次数Maximum Number of Iterations
nVar=2; % 自变量维数,此例需要优化两个参数c和g Number of Decision Variables
VarSize=[1,nVar]; % 决策变量矩阵大小 Decision Variables Matrix Size
beta_min=para(3); % 缩放因子下界 Lower Bound of Scaling Factor
beta_max=para(4); % 缩放因子上界 Upper Bound of Scaling Factor
pCR=para(5); %  交叉概率 Crossover Probability
lb=[0.01,0.01]; % 参数取值下界
ub=[100,100]; % 参数取值上界
%% 初始化
% 父代种群初始化
parent_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
parent_Val=zeros(nPop,1); % 目标函数值
for i=1:nPop % 遍历每个个体parent_Val(i)=fobj(parent_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
end
% 突变种群初始化
mutant_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
mutant_Val=zeros(nPop,1); % 目标函数值
for i=1:nPop % 遍历每个个体mutant_Val(i)=fobj(mutant_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
end
% 子代种群初始化
child_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
child_Val=zeros(nPop,1); % 目标函数值
for i=1:nPop % 遍历每个个体child_Val(i)=fobj(child_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
end
%% 确定父代种群中的Alpha,Beta,Delta狼
[~,sort_index]=sort(parent_Val); % 父代种群目标函数值排序
parent_Alpha_Position=parent_Position(sort_index(1),:); % 确定父代Alpha狼
parent_Alpha_Val=parent_Val(sort_index(1)); % 父代Alpha狼目标函数值
parent_Beta_Position=parent_Position(sort_index(2),:); % 确定父代Beta狼
parent_Delta_Position=parent_Position(sort_index(3),:); % 确定父代Delta狼
%% 迭代开始
BestCost=zeros(1,MaxIt);
BestCost(1)=parent_Alpha_Val;
for it=1:MaxIta=2-it*((2)/MaxIt); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0% 更新父代个体位置for par=1:nPop % 遍历父代个体for var=1:nVar % 遍历每个维度            % Alpha狼Huntingr1=rand(); % r1 is a random number in [0,1]r2=rand(); % r2 is a random number in [0,1]            A1=2*a*r1-a; % 计算系数AC1=2*r2; % 计算系数CD_alpha=abs(C1*parent_Alpha_Position(var)-parent_Position(par,var));X1=parent_Alpha_Position(var)-A1*D_alpha;% Beta狼Huntingr1=rand();r2=rand();            A2=2*a*r1-a; % 计算系数AC2=2*r2; % 计算系数CD_beta=abs(C2*parent_Beta_Position(var)-parent_Position(par,var));X2=parent_Beta_Position(var)-A2*D_beta;% Delta狼Huntingr1=rand();r2=rand();A3=2*a*r1-a; % 计算系数AC3=2*r2; % 计算系数CD_delta=abs(C3*parent_Delta_Position(var)-parent_Position(par,var));X3=parent_Delta_Position(var)-A3*D_delta;% 位置更新,防止越界X=(X1+X2+X3)/3;X=max(X,lb(var));X=min(X,ub(var));parent_Position(par,var)=X;endparent_Val(par)=fobj(parent_Position(par,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值end% 产生变异(中间体)种群for mut=1:nPopA=randperm(nPop); % 个体顺序重新随机排列A(A==i)=[]; % 当前个体所排位置腾空(产生变异中间体时当前个体不参与)a=A(1);b=A(2);c=A(3);beta=unifrnd(beta_min,beta_max,VarSize); % 随机产生缩放因子y=parent_Position(a)+beta.*(parent_Position(b)-parent_Position(c)); % 产生中间体% 防止中间体越界y=max(y,lb);y=min(y,ub);mutant_Position(mut,:)=y;end% 产生子代种群,交叉操作 Crossoverfor child=1:nPopx=parent_Position(child,:);y=mutant_Position(child,:);z=zeros(size(x)); % 初始化一个新个体j0=randi([1,numel(x)]); % 产生一个伪随机数,即选取待交换维度编号???for var=1:numel(x) % 遍历每个维度if var==j0 || rand<=pCR % 如果当前维度是待交换维度或者随机概率小于交叉概率z(var)=y(var); % 新个体当前维度值等于中间体对应维度值elsez(var)=x(var); % 新个体当前维度值等于当前个体对应维度值endendchild_Position(child,:)=z; % 交叉操作之后得到新个体child_Val(child)=fobj(z,input_train,output_train,input_test,output_test); % 新个体目标函数值end% 父代种群更新for par=1:nPopif child_Val(par)<parent_Val(par) % 如果子代个体优于父代个体parent_Val(par)=child_Val(par); % 更新父代个体endend% 确定父代种群中的Alpha,Beta,Delta狼[~,sort_index]=sort(parent_Val); % 父代种群目标函数值排序parent_Alpha_Position=parent_Position(sort_index(1),:); % 确定父代Alpha狼parent_Alpha_Val=parent_Val(sort_index(1)); % 父代Alpha狼目标函数值parent_Beta_Position=parent_Position(sort_index(2),:); % 确定父代Beta狼parent_Delta_Position=parent_Position(sort_index(3),:); % 确定父代Delta狼BestCost(it)=parent_Alpha_Val;
end
bestc=parent_Alpha_Position(1,1);
bestg=parent_Alpha_Position(1,2);
%% 图示寻优过程
plot(BestCost);
xlabel('Iteration');
ylabel('Best Val');
grid on;
%% 利用回归预测分析最佳的参数进行SVM网络训练
cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
model_cs_svr=svmtrain(output_train,input_train,cmd_cs_svr); % SVM模型训练
%% SVM网络回归预测
[output_test_pre,~]=svmpredict(output_test,input_test,model_cs_svr); % SVM模型预测及其精度
test_pre=mapminmax('reverse',output_test_pre',rule2);
test_pre = test_pre';
function x=init_individual(xlb,xub,dim,sizepop)
% 参数初始化函数
% lb:参数下界,行向量
% ub:参数上界,行向量
% dim:参数维度
% sizepop 种群规模
% x:返回sizepop*size(lb,2)的参数矩阵
xRange=repmat((xub-xlb),[sizepop,1]);
xLower=repmat(xlb,[sizepop,1]);
x=rand(sizepop,dim).*xRange+xLower;
%% SVR_fitness -- objective function
function fitness=fobj(cv,input_train,output_train,input_test,output_test)
% cv为长度为2的横向量,即SVR中参数c和v的值cmd = ['-s 3 -t 2',' -c ',num2str(cv(1)),' -g ',num2str(cv(2))];
model=svmtrain(output_train,input_train,cmd); % SVM模型训练
[~,fitness]=svmpredict(output_test,input_test,model); % SVM模型预测及其精度
fitness=fitness(2); % 以平均均方误差MSE作为优化的目标函数值
clear
clc
close all
load wndspd % 示例数据为风速(时间序列)数据,共144个样本
%% HGWO-SVR
% 训练/测试数据准备(用前3天预测后一天),用前100天做训练数据
input_train(1,:)=wndspd(1:97);
input_train(2,:)=wndspd(2:98);
input_train(3,:)=wndspd(3:99);
output_train=[wndspd(4:100)]';
input_test(1,:)=wndspd(101:end-3);
input_test(2,:)=wndspd(102:end-2);
input_test(3,:)=wndspd(103:end-1);
output_test=(wndspd(104:end))';
para=[30,500,0.2,0.8,0.2];
[bestc,bestg,test_pre]=my_HGWO_SVR(para,input_train',output_train',input_test',output_test');
%% 预测结果图
err_pre=output_test'-test_pre;
figure('Name','测试数据残差图')
set(gcf,'unit','centimeters','position',[0.5,5,30,5])
plot(err_pre,'*-');
figure('Name','原始-预测图')
plot(test_pre,'*r-');hold on;plot(output_test,'bo-');
legend('预测','原始',0)
set(gcf,'unit','centimeters','position',[0.5,13,30,5])
toc

参考文章:Aijun Zhu, Chuanpei Xu, Zhi Li, Jun Wu, and Zhenbing Liu. Hybridizing grey wolf optimization with differential evolution for global optimization and test scheduling for 3D stacked SoC. Journal of Systems Engineering and Electronics Vol. 26, No. 2, April 2015, pp.317–328.
文章地址:http://ieeexplore.ieee.org/document/7111168/

(广告)欢迎扫描关注微信公众号:Genlovhyy的数据小站(Gnelovy212)

这里写图片描述

这篇关于混合灰狼优化(HGWO,DE-GWO)算法matlab源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136697

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.