欢迎来到本博客❤️❤️❤️
作者研究:本科计算机专业,研究生电气学硕。主要研究方向是电力系统和智能算法、机器学习和深度学习。目前熟悉python网页爬虫、机器学习、群智能算法、深度学习的相关内容。希望将计算机和电网有效结合!⭐️⭐️⭐️
欢迎您的到来
⛅⛅⛅ 个人主页:电力系统科研室
专栏目录:电力系统与算法之美
博主课外兴趣:中西方哲学,送予读者:
做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。在我这个专栏记录我有空时的一些哲学思考和科研笔记:科研和哲思。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“真理”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......
本文目录如下:⛳️⛳️⛳️
目录
1 概述
1.1 智能优化算法
1.2 群智能算法
2 粒子群算法
2.1 概念
2.1.1 粒子群优化算法思想
2.1.2 更新规则
2.1.3 惩罚项
2.2 程序框图
2.2.1 伪代码
2.2.2 程序框图
3 Matlab仿真结果
3.1 单目标算例测试
3.2 多目标算例测试
4 Matlab代码
5 写在最后
2.1 概念
2.1.1 粒子群优化算法思想
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。粒子群算法思想来源于实际生活中鸟捕食的过程。假设在一个n维的空间中,有一群鸟(m只)在捕食,食物位于n维空间的某个点上,对于第i只鸟某一时刻来说,有两个向量描述,一个是鸟的位置向量,第二个是鸟的速度。假设鸟能够判断一个位置的好坏,所谓“好坏”,就是离食物更近了还是更远了。鸟在捕食的过程中会根据自己的经验以及鸟群中的其他鸟的位置决定自己的速度,根据当前的位置和速度,可以得到下一刻的位置,这样每只鸟通过向自己和鸟群学习不断的更新自己的速度位置,最终找到食物,或者离食物足够近的点。
粒子群是比较经典的有自适应过程的算法,类似的有蝙蝠算法、布谷鸟算法、蜂群算法等,某个粒子的移动会参考历史最优和当前最优,可以通过设置c1、c2表示两者的重要程度,每个粒子移动的速度也是不一样的,速度也会收到w的影响,以上三者共同决定粒子下一步到达的位置。
2.1.2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
其中:f为当前适应度函数的平均值;v为粒子速度;x为粒子位置;rand()为介于(0,1)之间的随机数;c1、c2是学习因子,通常c1=c2=2;best为当前最优解;bestx为历史最优解。
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
公式(2)和 公式(3)被视为标准PSO算法
2.1.3 惩罚项
惩罚项。它的思想类似线性规划内点法,都是通过增加罚函数,迫使模型在迭代计算的过程中始终在可行域内寻优。
在粒子群算法中,每一步迭代都会更新 Pbest 和 Gbest,虽然可以将有约束问题转换为无约束问题进行迭代求解,但是问题的解 xi依然存在不满足约束条件的情况,因此需要编制一些规则来比较两
个粒子的优劣,规则如下:
1.如果两个粒子 xi 和 xj 都可行,则比较其适应度函数 f(xi)和f(xj),值小的粒子为优。
2.当两个粒子 xi 和 xj 都不可行,则比较惩罚项 P(xi)和 P(xj), 违背约束程度小的粒子更优。
3.当粒子 xi 可行而粒子 xj 不可行,选可行解。对于粒子的上下限约束 可以体现在位置更新函数里,不必加惩 罚项。 具体思路就是遍历每一个粒子的位置,如果超除上下限,位置则更改为上下限中的任何一个位置
2.2.1 伪代码
2.2.2 程序框图
%% 数据
% 导入数据
Data.X(:,1) = 273.15 + [10,10,10,10,25,25,25,25,25,25,45,45,45,45,60,25,60,25,25,25,25,25,25,45,45,45,45,45]';
Data.X(:,2) = [0.375,0.4615384615,0.375,0.4615384615,0.5,0.6666666667,1,0.5,0.6666666667,1,0.3,0.375,0.5,0.6666666667,0.6666666667,0.6666666667,0.6666666667,0.6666666667,0.5,0.6666666667,0.33,0.3975903614,0.4962406015,0.5,0.6666666667,0.33,0.3975903614,0.4962406015]';
Data.Z(:,1) = [-7.5537637992E-09,-2.1091060158E-08,-2.4744654476E-09,-1.1909690888E-08,-2.5494146682E-08,-3.6534067388E-08,-2.0441327997E-07,-2.7816139152E-08,-3.9722823789E-08,-2.5558879943E-07,-3.7081071174E-08,-4.3007308318E-08,-6.2938212113E-08,-9.0264728912E-08,-7.9104978801E-08,-3.7248333193E-08,-9.5269370486E-08,-3.7576964623E-08,-6.6857952050E-08,-8.3174676784E-08,-3.0432038521E-08,-3.4780276714E-08,-4.6606775564E-08,-6.9015595281E-08,-1.0059784557E-07,-3.9048782594E-08,-4.9525103732E-08,-6.9429082045E-08]';
% 定义目标函数适应度
Data.Function = @(C, X)((C(1)*X(1) + C(2)*X(1)^2 + C(3)*X(1)^3 + C(4)*X(2)^1 + C(5)*X(2)^2 + C(6)*X(2)^3 + C(7)*exp(X(1) * (C(8) - X(2)))) / 1E+09);
%% 目标函数
Ec = 376.3 + 697*A + 2900*B - 116.3*C - 56667*B^2 + 10.67*C^2 + 11333*A*B - 36.7*A*C;
Ra = 0.64590 - 0.5461*A - 7.703*B + 0.02107*C + 1.3056*(A^2) + 160.35*(B^2) - 1.083*A*B - 0.07181*A*C;
MRR = 0.03670 + 0.00224*A + 0.536*B - 0.01211*C - 7.28*B^2 + 0.001043*C^2 + 0.645*A*B - 0.0104*B*C;
%% 输出
ObjFun(1,1) = Ec;
ObjFun(1,2) = Ra;
ObjFun(1,3) = MRR;
end
本文仅展现部分代码,全部代码见:正在为您运送作品详情
部分理论引用网络文献,若有侵权请联系博主删除。