% 随机产生一个种群
pop(i,:)=2*rands(1,2) % 初始化粒子
V(i,:)=0.5*rands(1,2) % 初始化速度
% 计算粒子适应圆樱梁度值
fitness(i)=fun(pop(i,:))
end
[bestfitness bestindex]=min(fitness)
zbest=pop(bestindex,:) % 群体极值位置
gbest=pop% 个体极值位置
fitnessgbest=fitness % 个体极值适应度值
fitnesszbest=bestfitness % 群体极值适应度值
% 迭代寻优
for i=1:maxgen
% 粒子位置和速度更新
for j=1:sizepop
% 速度更颂谈新
V(j,:)=V(j,:)+c1*rand*(gbest(j,:)-pop(j,:))+c2*rand*(zbest-pop(j,:))
V(j,find(V(j,:)>Vmax))=Vmax
V(j,find(V(j,:)<Vmin))=Vmin
% 粒子更新
pop(j,:)=pop(j,:)+0.5*V(j,:)
pop(j,find(pop(j,:)>popmax))=popmax
pop(j,find(pop(j,:)<popmin))=popmin
%新粒子适应度值
fitness(j)=fun(pop(j,:))
end
% 个体极值和种群极值更新
for j=1:sizepop
% 个体极值更新
if fitness(j)>fitnessgbest(j)
gbest(j,:)=pop(j,:)
fitnessgbest(j)=fitness(j)
end
% 群体极值更新
if fitness(j)>fitnesszbest
zbest=pop(j,:)
fitnesszbest=fitness(j)
end
end
% 每代最优值记录到橘运yy数组中
result(i)=fitnesszbest
end
% 画出每代最优个体适应度值
plot(result)
title('最优个体适应度值','fontsize',12)
xlabel('进化代数','fontsize',12)ylabel('适应度值','fontsize',12)
可以利用libsvm工具箱中自带的k折交叉验证方法进行参数的寻优。
k折交叉验证的基本思想如下:
k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。
libsvm工具箱中交叉验证的使用方法如下:
predict = trian(data_label, data_train, cmd)% train_label表示训练输出样本数据;
% data_train表示训练输入样本数据;
% cmd就是训练参数困则的正尺核设置,如设置为cmd='-v 5'就表示进行5折交叉验证(该设置中省略了其他参数的举掘设置,即保存默认设置)。
你好
像这样的求最小值,可以用很多算法,可以用命令窗口编程,或者利用磨裤扒优化工具箱。对于初学者,可以利用optimization toolbox里面算法,只要自己写一个目标函数就可以了。
一般的有约束多变量函数都可以通过fmincon函数求解得到,但是如果初始值选取不恰当也可以可以陷入局部最优。全局最优搜索能力比较强的可能属智能算法了,如遗传算法等等下面我采用fmincon函数尝试求解:
目标函数写好好,保存为funmint.m文件,函数如下
function Z=funmint(x)x1=x(1)
x2=x(2)
x3=x(3)
x4=x(4)
S1=x(5)
S2=x(6)
eg=64.11-0.043-0.49*x2-0.06*x3-0.075*x4-3.258e-4*x1*x2+9.712e-5*x1*x3...
+2.781e-4*x1*x4-4.738e-5*x2*x3-1.212e-3*x2+6.053e-4*x3*x4+...
7.775e-4*x1^2+1.125e-3*x2^2-8.665e-4*x3^2+5.89e-3*x4^2
sd=-6.02953+0.03583*x1+0.067595*x2-2.90115e-3*x3-0.053463*x4-1.7325e-4*x1*x2+...
1.1525e-4*x1*x3-7.4375e-5*x1*x4-6.3375e-5*x2*x3+4.03125e-4*x2*x4-...
3.16562e-4*x3*x4+3.625e-6*x1^2-1.07375e-4*x2^2-2.68437e-5*x3^2-3.27344e-4*x4^2
Z=sd+1e7*abs(-eg+0.0518*sd+S1)+1e7*abs(0.1-eg-0.0518*sd+S2)
在命令窗口中输入下面这些求解代码:
clearlb=[60 瞎昌235 40 21 0 0]
ub=[80 255 80 29 Inf Inf]
x0=[70 245 60 25 10 10]
options=optimset('Algorithm','active-set')
[x,fval]= fmincon(@funmint,x0,[],[],[],[],lb,ub,[],options)
可以得到一个最小值,以及对应的6个变量如下:
x=[62.9860 244.9435 74.5278 21.3001 1.8670 2.0691]
最小值为:
fval=3.4326
当然你也可以换用其他函数,只要把纯悉fmincon换了就可以。优化函数结构都差不多。
希望对你有帮助!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)