1function [bestc,bestg,test_pre]=my_HGWO_SVR(para,input_train,output_train,input_test,output_test)
  2% 参数向量 parameters [n,N_iteration,beta_min,beta_max,pCR]
  3% n为种群规模,N_iteration为迭代次数
  4% beta_min 缩放因子下界 Lower Bound of Scaling Factor
  5% beta_max=0.8; % 缩放因子上界 Upper Bound of Scaling Factor
  6% pCR 交叉概率 Crossover Probability
  7% 要求输入数据为列向量(矩阵)
  8
  9%% 数据归一化
 10[input_train,rule1]=mapminmax(input_train');
 11[output_train,rule2]=mapminmax(output_train');
 12input_test=mapminmax('apply',input_test',rule1);
 13output_test=mapminmax('apply',output_test',rule2);
 14input_train=input_train';
 15output_train=output_train';
 16input_test=input_test';
 17output_test=output_test';
 18%% 利用差分进化-灰狼优化混合算法(DE_GWO)选择最佳的SVR参数
 19nPop=para(1); % 种群规模 Population Size
 20MaxIt=para(2); % 最大迭代次数Maximum Number of Iterations
 21nVar=2; % 自变量维数,此例需要优化两个参数c和g Number of Decision Variables
 22VarSize=[1,nVar]; % 决策变量矩阵大小 Decision Variables Matrix Size
 23beta_min=para(3); % 缩放因子下界 Lower Bound of Scaling Factor
 24beta_max=para(4); % 缩放因子上界 Upper Bound of Scaling Factor
 25pCR=para(5); %  交叉概率 Crossover Probability
 26lb=[0.01,0.01]; % 参数取值下界
 27ub=[100,100]; % 参数取值上界
 28%% 初始化
 29% 父代种群初始化
 30parent_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
 31parent_Val=zeros(nPop,1); % 目标函数值
 32for i=1:nPop % 遍历每个个体
 33    parent_Val(i)=fobj(parent_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
 34end
 35% 突变种群初始化
 36mutant_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
 37mutant_Val=zeros(nPop,1); % 目标函数值
 38for i=1:nPop % 遍历每个个体
 39    mutant_Val(i)=fobj(mutant_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
 40end
 41% 子代种群初始化
 42child_Position=init_individual(lb,ub,nVar,nPop); % 随机初始化位置
 43child_Val=zeros(nPop,1); % 目标函数值
 44for i=1:nPop % 遍历每个个体
 45    child_Val(i)=fobj(child_Position(i,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
 46end
 47%% 确定父代种群中的Alpha,Beta,Delta狼
 48[~,sort_index]=sort(parent_Val); % 父代种群目标函数值排序
 49parent_Alpha_Position=parent_Position(sort_index(1),:); % 确定父代Alpha狼
 50parent_Alpha_Val=parent_Val(sort_index(1)); % 父代Alpha狼目标函数值
 51parent_Beta_Position=parent_Position(sort_index(2),:); % 确定父代Beta狼
 52parent_Delta_Position=parent_Position(sort_index(3),:); % 确定父代Delta狼
 53%% 迭代开始
 54BestCost=zeros(1,MaxIt);
 55BestCost(1)=parent_Alpha_Val;
 56for it=1:MaxIt
 57    a=2-it*((2)/MaxIt); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0
 58    % 更新父代个体位置
 59    for par=1:nPop % 遍历父代个体
 60        for var=1:nVar % 遍历每个维度            
 61            % Alpha狼Hunting
 62            r1=rand(); % r1 is a random number in [0,1]
 63            r2=rand(); % r2 is a random number in [0,1]            
 64            A1=2*a*r1-a; % 计算系数A
 65            C1=2*r2; % 计算系数C
 66            D_alpha=abs(C1*parent_Alpha_Position(var)-parent_Position(par,var));
 67            X1=parent_Alpha_Position(var)-A1*D_alpha;
 68            % Beta狼Hunting
 69            r1=rand();
 70            r2=rand();            
 71            A2=2*a*r1-a; % 计算系数A
 72            C2=2*r2; % 计算系数C
 73            D_beta=abs(C2*parent_Beta_Position(var)-parent_Position(par,var));
 74            X2=parent_Beta_Position(var)-A2*D_beta;
 75            % Delta狼Hunting
 76            r1=rand();
 77            r2=rand();
 78            A3=2*a*r1-a; % 计算系数A
 79            C3=2*r2; % 计算系数C
 80            D_delta=abs(C3*parent_Delta_Position(var)-parent_Position(par,var));
 81            X3=parent_Delta_Position(var)-A3*D_delta;
 82            % 位置更新,防止越界
 83            X=(X1+X2+X3)/3;
 84            X=max(X,lb(var));
 85            X=min(X,ub(var));
 86            parent_Position(par,var)=X;
 87        end
 88        parent_Val(par)=fobj(parent_Position(par,:),input_train,output_train,input_test,output_test); % 计算个体目标函数值
 89    end
 90    % 产生变异(中间体)种群
 91    for mut=1:nPop
 92        A=randperm(nPop); % 个体顺序重新随机排列
 93        A(A==i)=[]; % 当前个体所排位置腾空(产生变异中间体时当前个体不参与)
 94        a=A(1);
 95        b=A(2);
 96        c=A(3);
 97        beta=unifrnd(beta_min,beta_max,VarSize); % 随机产生缩放因子
 98        y=parent_Position(a)+beta.*(parent_Position(b)-parent_Position(c)); % 产生中间体
 99        % 防止中间体越界
100        y=max(y,lb);
101        y=min(y,ub);
102        mutant_Position(mut,:)=y;
103    end
104    % 产生子代种群,交叉操作 Crossover
105    for child=1:nPop
106        x=parent_Position(child,:);
107        y=mutant_Position(child,:);
108        z=zeros(size(x)); % 初始化一个新个体
109        j0=randi([1,numel(x)]); % 产生一个伪随机数,即选取待交换维度编号???
110        for var=1:numel(x) % 遍历每个维度
111            if var==j0 || rand<=pCR % 如果当前维度是待交换维度或者随机概率小于交叉概率
112                z(var)=y(var); % 新个体当前维度值等于中间体对应维度值
113            else
114                z(var)=x(var); % 新个体当前维度值等于当前个体对应维度值
115            end
116        end
117        child_Position(child,:)=z; % 交叉操作之后得到新个体
118        child_Val(child)=fobj(z,input_train,output_train,input_test,output_test); % 新个体目标函数值
119    end
120    % 父代种群更新
121    for par=1:nPop
122        if child_Val(par)<parent_Val(par) % 如果子代个体优于父代个体
123            parent_Val(par)=child_Val(par); % 更新父代个体
124        end
125    end
126    % 确定父代种群中的Alpha,Beta,Delta狼
127    [~,sort_index]=sort(parent_Val); % 父代种群目标函数值排序
128    parent_Alpha_Position=parent_Position(sort_index(1),:); % 确定父代Alpha狼
129    parent_Alpha_Val=parent_Val(sort_index(1)); % 父代Alpha狼目标函数值
130    parent_Beta_Position=parent_Position(sort_index(2),:); % 确定父代Beta狼
131    parent_Delta_Position=parent_Position(sort_index(3),:); % 确定父代Delta狼
132    BestCost(it)=parent_Alpha_Val;
133end
134bestc=parent_Alpha_Position(1,1);
135bestg=parent_Alpha_Position(1,2);
136%% 图示寻优过程
137plot(BestCost);
138xlabel('Iteration');
139ylabel('Best Val');
140grid on;
141%% 利用回归预测分析最佳的参数进行SVM网络训练
142cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
143model_cs_svr=svmtrain(output_train,input_train,cmd_cs_svr); % SVM模型训练
144%% SVM网络回归预测
145[output_test_pre,~,decision_values]=svmpredict(output_test,input_test,model_cs_svr); % SVM模型预测及其精度
146test_pre=mapminmax('reverse',output_test_pre',rule2);
147test_pre = test_pre';
148plot(test_pre)
149xlabel('testpre');
150grid on;