zoukankan      html  css  js  c++  java
  • 分布估计法+Matlab代码

    算法原理

    在遗传算法的基础上的改进

    Matlab代码

    clear;
    N = 4; %种群规模
    M= 2; %变量个数
    V0 = [-8,3;-2,9;0,-5;6,1]; %初始种群
    K = 2;
    alpha = 0.3;
    
    %%
    [mu,sigma] = canShu(V0); %求均值方差
    mark = [];
    
    for i = 1:50
        p = f(V0); %求适应值
        [mu,sigma] = update(V0,p,K,alpha,mu,sigma);
        V0 = sig2Mat(mu,sigma,N,M);
        mark = [mark,max(p)];
    end
    plot(mark);
    
    %%
    function [mu,sigma] = canShu(V)
    mu = mean(V);
    sigma = std(V,1); %按照N的个数求标准差
    end
    
    function y = f(x) %计算适应值,x为矩阵
    y = x(:,1).^2-2*x(:,2)+5;
    end
    
    function [mu,sigma] = update(V,p,K,alpha,miu0,sigma0) %更新
    [~,i] = sort(p,'descend');
    mu = (1-alpha).*miu0+alpha.*(sum(V(i(1:K),:))-V(i(end),:));
    sigma = (1-alpha)*sigma0+alpha*std(V(i(1:K),:),1);
    end
    
    function [V0] = sig2Mat(mu,sigma,N,M) %根据均值方差生成数据
    sigMat = diag(sigma);
    R = chol(sigMat);
    V0 = repmat(mu,N,1) + randn(N,M)*R; %to-do,2?
    id = sum(V0>=-10 & V0 <=10,2)==size(V0,2);
    V0 = V0(id,:);
    while size(V0,1) < N
        V1 = repmat(mu,N,1) + randn(N,M)*R;
        id = sum(V1>=-10 & V1 <=10,2)==size(V1,2);
        V0 = [V0;V1(id,:)];
    end
    V0 = V0(1:N,:);
    end
    
  • 相关阅读:
    SA(后缀数组)专题总结
    LCT总结
    多项式全家桶
    fft.ntt,生成函数,各种数和各种反演
    P3939 数颜色
    P1879 [USACO06NOV]玉米田Corn Fields
    主席树模板
    P2633 Count on a tree
    P1972 [SDOI2009]HH的项链
    数论
  • 原文地址:https://www.cnblogs.com/kexve/p/11766979.html
Copyright © 2011-2022 走看看