算法通用模板讲解

作用:

  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];

注意换行要用“;”,连接用“,”。

 

问题:最优值的平均值,如何进行求解,并存储起来?

解决:数据优劣时候:最大值、最小值、中位数、平均值、方差 ,标准差(std);

求平均值的同时求标准差,用于对比算法优劣,PSO解决problem1解的平均值和标准差与GWO解决problem1解的平均值和标准差平均值小的好,标准差小的好。

 

版本的改进十:

问题:收敛曲线数据求平均,反应算法的收敛快慢

解决:直接在存储收敛数据时,加上一个mean函数即可。

 

问题:数据一旦清掉,或者MATLAB关闭了,数据不存在了,只能重新运行。如何将数据保存下来,保存数据格式.mat文件,最好能够统一保存在一个文件夹下。

解决:引入sprintf函数,save函数,把数据转成mat,用算法的名字给命名,同时save把数据.mat文件保存到指定的文件夹下,实现了工作区清空,关闭软件,数据依然在。

 

posted on 2022-09-19 19:33  王立凯  阅读(189)  评论(0编辑  收藏  举报

导航