This is my blog.
这年头,听到机器学习的次数增多了
现在才知道这也算啊
看到了遗传的知识
觉得很亲切
对于公式乱码,图片加载不出来的问题,之后会陆续解决的
很奇怪的是我这里预览是对的呢!!!
步骤
- 编码
某一参数取值范围为\((L,U)\),使用长度为k的二进制编码表示该参数
\(\delta=\frac{U-L}{2^k-1}\) - 解码
\(x=L+(\sum_{(i=1)}^kb_i2^{i-1})\frac{U-L}{2^k-1}\)
其中,\(\sum_{(i=1)}^kb_i2^{i-1}\)就是一般的二进制转十进制的方法 - 交配
染色体部分交换,这里是指编码同长度的部分交换 - 突变
基因码小几率翻转,即0-1
互换 - 倒位
一个染色体某区段正常排列顺序发生180度的颠倒 - 个体适应度评估
个体适应度大的个体更容易被遗传到下一代 - 复制
若设种群中个体总数为N
,个体适应度为f_i
,则个体i
被选中的几率
\(P_i=\frac{f_i}{\sum_{(k=1)}^Nf_k}\)
拓展
- 协同进化
生物之间还存在协作、寄生的关系 弗洛伊德梦的解析法
巴拉巴拉 变猪猪∧_∧
(。・ω・。)つ━☆・。
⊂ ノ ・゜+.
しーJ °。+ ´¨)
.· ´¸.·´¨) ¸.·¨)
(¸.·´ (¸.·’*
唔,又看不懂了。。。
程序设计
流程图
|
|
分割线
∧_∧
(。·ω·。)つ━☆·。
⊂ ノ ·゜+.
しーJ °。+ ´¨)
.· ´¸.·´¨) ¸.·¨)
(¸.·´ (¸.·’*
|
|
参数规则
- 种群规模
0~100
- 变异概率
0.0001~0.2
- 交配概率
0.4~0.99
- 进化概率
100~500
- 种群初始化
GA Toolbox
唔~我下的matlab
貌似好多toolbox都没有啊
有人有资源吗??!
所以下面对我来说没用~
额。。。
x
经过遗传进化以后自变量最佳染色体返回值;fval
最佳染色体的适应度reason
算法停止的原因final_pop
本次运行得到的最后种群(可以将此作为下次运行的初始种群)@fitnessfun
适应度句柄函数nvars
目标函数自变量的个数options
为算法的属性设置
下面列出函数gaoptimset
属性
属性名 | 默认值 | 实现功能 |
---|---|---|
PopInitRange | [0,1] | 初始种群生成区间 |
PopulationSize | 20 | 种群规模 |
CrossoverFraction | 0.8 | 交配概率 |
MigrationFraction | 0.2 | 变异概率 |
Generations | 100 | 超过进化代数时算法停止 |
TimeLimit | Inf | 超过运算时间限制时算法停止 |
FitnessLimit | -Inf | 最佳个体等于或小于适应度阈值时算法停止 |
StallGenLimit | 50 | 超过连续代数不进化则算法停止 |
StallTimeLimit | 20 | 超过连续时间不进化则算法停止 |
InitialPopulation | [ ] | 初始化种群 |
PlotFcns | [ ] | 绘图函数,可供选择的有@gaplotbestf,@gaplotbestindiv |
GEATbx Toolbox
某个大学自己做的工具箱,给matlab添加路径就好。
然后因为工具箱内的文件后缀名是.M
,而不是.m
,不可以直接调用。就需要将文件名批处理。windows
可以写bat。
然而mac
连rename
命令都没有。
所以先装命令喽!
但是不可以改子目录的,而且会把每一个都改了,那个替换不会用啊,看了help
,但英语渣渣表示头疼。。。。所以就这样子分步做吧……至于文件夹那两个手动改回来。毕竟很快么( ̄▽ ̄)
try try try!!!
- 收集数据
归一化数据(按占比来重新规划数据)
归一化后某数据如下12345678910111213141516171819202122232425262728293031323334353637383940A = [0.3170.4610.6491.0000.2560.1560.5760.0770.0000.271];B = [0.6000.1000.0000.0000.1001.0000.0990.9990.8000.400];C = [0.4891.0000.0000.5290.4600.6320.3050.5290.1380.408];D = [0.0600.1410.4671.0000.0850.0600.4300.0290.0000.140];组建模型
MAX \(COR(\alpha,\beta,\lambda)=\frac{\sum_{i=1}^{10}[(E_i-\overline{E})(D_i-\overline{D})]}{\sqrt{\sum_{i=1}^{10}[(E_i-\overline{E})^2}\sqrt{\sum_{i=1}^{10}[(D_i-\overline{D})^2}}\)
s.t.
\(E=\alpha A_i+\beta B_i+\lambda C_i\)
\(\alpha+\beta+\lambda=1\)
\(0\leq\alpha\leq1\)
\(0\leq\beta\leq1\)
\(0\leq\lambda\leq1\)
求出目标函数如下1234567syms a b cE = a .* A + b .* B + c .* C;COR_UP = sum((E -mean(E)) .* (D - mean(D)));COR_DOWN = sqrt(sum((E - mean(E)) .* (E - mean(E)))) .* sqrt(sum((D - mean(D)) .* (D - mean(D))));COR = simplify(COR_UP ./ COR_DOWN)%貌似simple已经被淘汰了,应该是一样的意思%看起来和书上的输出结果不一样,也许数据敲错了
编写目标函数文件,将上结果作为目标函数文件的内容:
主要把乘除次方运算前加上.
即可
- 求解模型123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778clc;close;clear all;tic;%因为工具箱是导入的,这样可以去除警告warning off;%定义遗传算法参数%个体数目NIND = 35;%最大遗传代数MAXGEN = 180;%变量的维数NVAR = 3;%变量的二进制位数PRECI = 15;%代沟,决定父代复制到子代的程度GGAP = 0.7;%存储算法进化的效果trace = zeros(MAXGEN,2);%建立区域描述器%函数rep起到复制作用FieldD = [rep([PRECI],[1,NVAR]);rep([0;1],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];%规划种群%创建初始种群Chrom = crtbp(NIND,NVAR * PRECI);%代数计数器gen = 0;%把二进制的子串变为十进制x_value = bs2rv(Chrom,FieldD);%计算初始种群个体的目标函数ObjV = corr_zi(x_value(:,1),x_value(:,2),x_value(:,3));%进化计算while gen < MAXGEN%因为默认是最小值,这里要求的是最大值FitnV = ranking(-ObjV);%选择SelCh = select('sus',Chrom,FitnV,GGAP);%交叉SelCh = recombin('xovsp',SelCh,0.7);%突变SelCh = mut(SelCh);%二进制编码的染色体转换为十进制ObjVSel = bs2rv(SelCh,FieldD);%计算子代目标函数值ObjVSel = corr_zi(ObjVSel(:,1),ObjVSel(:,2),ObjVSel(:,3));%重新插入到子群中去以便于进行下一次进化[Chorm ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);gen = gen + 1;%遗传算法性能跟踪trace(gen,1) = max(ObjV);trace(gen,2) = sum(ObjV)/length(ObjV);end%绘制效果图plot(trace(:,1));hold on;plot(trace(:,2),'-.');grid;xlabel('进化代数/代');ylabel('y');title('***');legend('解的变化','种群均值的变化');%Y最优解,I种群的序号[Y,I] = max(ObjV);COR_Max =Y;X = bs2rv(Chrom,FieldD);disp(' ');disp('');disp(' ');total_three = sum(X(I,:));%归一化处理X_Value = [X(I,1)/total_three,X(I,2)/total_three,X(I,3)/total_three]toc;
后记
宿舍白天断电
这是什么操作啊
大冬天的,还得出来
出门的时候
第一次发现没拿手机
第二次发现没拿充电器
第三次发现没拿手套
第四次在找钥匙锁门
于是开开锁锁好几次
到了教室后发现
拿了充电宝,没拿线
带了电脑,没拿🎧
唔~所以
看来只能好好学习了
IDE换来换去
现在超级爱sublime test
强烈推荐(当然是c++代码了,据说适应多种代码)
当初小黄鸡推荐的时候说
你以后会要用到的
拭目以待喽
转载请注明出处,谢谢。
愿 我是你的小太阳