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

10 篇文章 7 订阅
9 篇文章 8 订阅

说明:博主所有博文及源码中示例所用的支持向量机算法均使用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:MaxIt
    a=2-it*((2)/MaxIt); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0
    % 更新父代个体位置
    for par=1:nPop % 遍历父代个体
        for var=1:nVar % 遍历每个维度            
            % Alpha狼Hunting
            r1=rand(); % r1 is a random number in [0,1]
            r2=rand(); % r2 is a random number in [0,1]            
            A1=2*a*r1-a; % 计算系数A
            C1=2*r2; % 计算系数C
            D_alpha=abs(C1*parent_Alpha_Position(var)-parent_Position(par,var));
            X1=parent_Alpha_Position(var)-A1*D_alpha;
            % Beta狼Hunting
            r1=rand();
            r2=rand();            
            A2=2*a*r1-a; % 计算系数A
            C2=2*r2; % 计算系数C
            D_beta=abs(C2*parent_Beta_Position(var)-parent_Position(par,var));
            X2=parent_Beta_Position(var)-A2*D_beta;
            % Delta狼Hunting
            r1=rand();
            r2=rand();
            A3=2*a*r1-a; % 计算系数A
            C3=2*r2; % 计算系数C
            D_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;
        end
        parent_Val(par)=fobj(parent_Position(par,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
    end
    % 产生变异(中间体)种群
    for mut=1:nPop
        A=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
    % 产生子代种群,交叉操作 Crossover
    for child=1:nPop
        x=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); % 新个体当前维度值等于中间体对应维度值
            else
                z(var)=x(var); % 新个体当前维度值等于当前个体对应维度值
            end
        end
        child_Position(child,:)=z; % 交叉操作之后得到新个体
        child_Val(child)=fobj(z,input_train,output_train,input_test,output_test); % 新个体目标函数值
    end
    % 父代种群更新
    for par=1:nPop
        if child_Val(par)<parent_Val(par) % 如果子代个体优于父代个体
            parent_Val(par)=child_Val(par); % 更新父代个体
        end
    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(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)

这里写图片描述

  • 18
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 69
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值