作用:
1.作论文—数据—程序进行实现;
2.程序多种多样,需要一个通用的模板;
3.关键:通用的地方是什么?
4.算法之间的共同点与不同点;
注意:
不在命令行窗口运行,只让其作为一个输出窗口,即直观看到结果即可。
如何实现,新建一个M文件,专门用于调用和执行。
算法的模板:
1.参数设置:
(1)优化算法参数:种群大小——个体/向量的个数;算子参数;等等
(2)优化问题参数:维数——变量个数;边界——变量的范围/可行域;等等%%%通用的
2.初始化种群:多少,维数是多少,边界;%%%通用的
3.计算目标函数值:代入优化问题得到;%%%通用的
4.新个体的产生:算子———每个算法都不一样,即算法与算法之间核心区别;
5.边界约束:让新产生的变量在可行域内;
6.计算新个体的函数值及更新操作:保证算法收敛过程,贪婪机制——保留优秀个体;用新产生的newpop和newfitness去更新原来的pop和fitness。%%%通用的
7.记录相关数据:算法得到相关数据。
程序模板大块:
1.问题模块,即目标函数写出来;%%%通用的
(1)for循环,输入输出明白是哪些;size函数, switch函数,调用函数;
(2)问题维数,问题的变量边界/可行域,可以根据problem值,自动选择。
2.算法模块:10种
版本的改进一:
问题:保留多个算法?只有run,通过复制,不建议;
解决:让每个算法都有属于自己的m文件,专门用于调用
版本的改进二:
问题:如何实现,多个算法共存,根据需要调用。
解决:引入switch函数,以及algorithm变量。
进一步改进:
问题:algorithm变量可以自动进行变换
解决:引入一个循环即可。
版本的改进三:
问题:能不能同时解决多个问题,比如PSO解决1-3个问题,GWO解决问题1-3
解决:引入一个for循环,让problem与算法放在一起,就可以实现。
版本的改进四:
问题:算法不止一个子文件。这个时候怎么办,还想存放属于自己的东西
解决:分别建立一个文件夹,用算法名字命名,实现自己的小空间,算法相互独立
程序上需要添加一个路径:addpath('PSO'),让我们找到属于PSO的文件夹,然后再去调用该文件夹下的PSO的m文件。
版本改进五:
问题:大家都需要共用的m文件/程序,放在一起,大家都可以来用,放在哪?
解决:新建一个public文件夹,程序中添加(‘public’),放在一开始的地方,程序之前。
版本的改进六:
问题:不同的算法使用的N,种群大小数可能是不一样的,是有区别的,怎么办?
解决:只需要将N的大小和算法放在一起,就可以进行区别了。
问题:不同的算法使用的迭代次数maxt可能是不一样的,是有区别的,怎么办?
解决:maxt和算法放在一起。
版本改进七:
问题:解的输出模块改进,我们想要哪个解?
解决:想要的并不是过程,我想要的是最优值/最优解,迭代的最后一个。
进一步修正,想要什么:1.收敛曲线;2.一个最优值;3.一个最优解。
收敛曲线-记录每一代最优值。
最优值:函数值递减的,最后一次迭代的结果就是最值。
最优解:最优值对应的个体。
版本的改进八:
问题:如何减少误差?多次计算,取平均值来减少误差 。
解决:多次计算,取平均值。
问题:如何实现多次运行?
解决:多次运行就是算法的多次执行。(25-30次)参数runmax放在main函数里,作为输入放在PSO的输输入部分,在PSO.m文件里加了个for循环,找到一个起点——整个程序最前端,找到一个终点——整个程序最尾端。
问题:如何进行解的记录?
解决:最优值和run有关,在算法循环完结束后,加个与run有关的记录解。
最优解:向量1*D,在算法循环完后,记录时候(run,1:D),
收敛曲线值:与run有关,在算法循环完后,记录的时候 (run,1:maxt)。
版本改进九:
问题:当运行不同的问题时,得到解被覆盖 ,如何解不被覆盖?
解决:通过引入Test...来存储/记录每一个问题的解,以实现不被覆盖。
Testoptimalval=[];
Testoptimalval=[Testoptimalval;optimalval];
注意换行要用“;”,连接用“,”。
问题:最优值的平均值,如何进行求解,并存储起来?
解决:数据优劣时候:最大值、最小值、中位数、平均值、方差
求平均值的同时求标准差,用于对比算法优劣,PSO解决problem1解的平均值和标准差与GWO解决problem1解的平均值和标准差。平均值小的好,标准差小的好。
版本的改进十:
问题:收敛曲线数据求平均,反应算法的收敛快慢
解决:直接在存储收敛数据时,加上一个mean函数即可。
问题:数据一旦清掉,或者MATLAB关闭了,数据不存在了,只能重新运行。如何将数据保存下来,保存数据格式.mat文件,最好能够统一保存在一个文件夹下。
解决:引入sprintf函数,save函数,把数据转成mat,用算法的名字给命名,同时save把数据.mat文件保存到指定的文件夹下,实现了工作区清空,关闭软件,数据依然在。