求实现基于粒子群算法的函数极值寻优算法MATLAB程序

求实现基于粒子群算法的函数极值寻优算法MATLAB程序,第1张

for i=1:sizepop

% 随机产生一个种群

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)

在命令窗口中输入下面这些求解代码:

clear 

lb=[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换了就可以。优化函数结构都差不多。

希望对你有帮助!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12421774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存