Matlab-遗传算法

This is my blog.
这年头,听到机器学习的次数增多了
现在才知道这也算啊
看到了遗传的知识
觉得很亲切
对于公式乱码,图片加载不出来的问题,之后会陆续解决的
很奇怪的是我这里预览是对的呢!!!

步骤

  1. 编码
    某一参数取值范围为\((L,U)\),使用长度为k的二进制编码表示该参数
    \(\delta=\frac{U-L}{2^k-1}\)
  2. 解码
    \(x=L+(\sum_{(i=1)}^kb_i2^{i-1})\frac{U-L}{2^k-1}\)
    其中,\(\sum_{(i=1)}^kb_i2^{i-1}\)就是一般的二进制转十进制的方法
  3. 交配
    染色体部分交换,这里是指编码同长度的部分交换
  4. 突变
    基因码小几率翻转,即0-1互换
  5. 倒位
    一个染色体某区段正常排列顺序发生180度的颠倒
  6. 个体适应度评估
    个体适应度大的个体更容易被遗传到下一代
  7. 复制
    若设种群中个体总数为N,个体适应度为f_i,则个体i被选中的几率
    \(P_i=\frac{f_i}{\sum_{(k=1)}^Nf_k}\)

拓展

  1. 协同进化
    生物之间还存在协作、寄生的关系
  2. 弗洛伊德梦的解析法
    巴拉巴拉 变猪猪

    ∧_∧
    (。・ω・。)つ━☆・
    ⊂   ノ    ・゜+.
     しーJ   °。+
    ´¨)
          .· ´¸.·´¨) ¸.·¨)
             (¸.·´ (¸.·’*

唔,又看不懂了。。。

程序设计

流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
st=>start: Start:>http://www.google.com[blank]
e=>end:>http://www.google.com
op1=>operation: t=0;
op2=>operation: 初始化P(t);
op3=>operation: 计算P(t)的适应值;
sub1=>subroutine: 选择交叉变异
cond=>condition: 不满足
or 满足停止条件?:>http://www.google.com
io=>inputoutput: catch something...
st->op1->op2->op3->cond
cond(yes)->e
cond(no)->sub1(right)->cond

分割线
∧_∧
(。·ω·。)つ━☆·
⊂   ノ    ·゜+.
 しーJ   °。+
´¨)
      .· ´¸.·´¨) ¸.·¨)
         (¸.·´ (¸.·’*

1
2
3
4
5
6
7
st=>start: Start:>http://www.google.com[blank]
e=>end:>http://www.google.com
op1=>operation: 从P(t-1)中选择P(t);%选择;
op2=>operation: 重组P(t);%交叉和变异;
op3=>operation: 计算P(t)的适应值;
st->op1->op2->op3->e

参数规则

  1. 种群规模 0~100
  2. 变异概率 0.0001~0.2
  3. 交配概率 0.4~0.99
  4. 进化概率 100~500
  5. 种群初始化

GA Toolbox

唔~我下的matlab貌似好多toolbox都没有啊
有人有资源吗??!
所以下面对我来说没用~
额。。。

1
2
options = gaoptimset('PropertyName1','PropertyValue1'...)
[x,fval,reason,output,final_pop] = ga(@fitnessfun,nvars,options)

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。
然而macrename命令都没有。
所以先装命令喽!

1
2
3
4
>>brew install rename
>>cd gatex
>>rename -x *.M
>>rename -a .m **

但是不可以改子目录的,而且会把每一个都改了,那个替换不会用啊,看了help,但英语渣渣表示头疼。。。。所以就这样子分步做吧……至于文件夹那两个手动改回来。毕竟很快么( ̄▽ ̄)
try try try!!!

  1. 收集数据
  2. 归一化数据(按占比来重新规划数据)
    归一化后某数据如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    A = [0.317
    0.461
    0.649
    1.000
    0.256
    0.156
    0.576
    0.077
    0.000
    0.271];
    B = [0.600
    0.100
    0.000
    0.000
    0.100
    1.000
    0.099
    0.999
    0.800
    0.400];
    C = [0.489
    1.000
    0.000
    0.529
    0.460
    0.632
    0.305
    0.529
    0.138
    0.408];
    D = [0.060
    0.141
    0.467
    1.000
    0.085
    0.060
    0.430
    0.029
    0.000
    0.140];
  3. 组建模型
    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\)
    求出目标函数如下

    1
    2
    3
    4
    5
    6
    7
    syms a b c
    E = 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已经被淘汰了,应该是一样的意思
    %看起来和书上的输出结果不一样,也许数据敲错了

编写目标函数文件,将上结果作为目标函数文件的内容:
主要把乘除次方运算前加上.即可

1
2
3
4
function z = corr_zi(a,b,c)
z = -(8.*10.^(1./2).*(261172397746748915712.*b - 280926593087279464448.*a +...
36245884594752061440.*c))./(2634403689662140625.*(8192121.*a.^2 - ...
17636608.*a.*b - 24820.*a.*c + 15084416.*b.^2 + 1273280.*b.*c + 6723500.*c.^2).^(1./2));

  1. 求解模型
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    clc;
    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++代码了,据说适应多种代码)
当初小黄鸡推荐的时候说
你以后会要用到的
拭目以待喽

转载请注明出处,谢谢。

愿 我是你的小太阳



买糖果去喽