用Octave计算组合优化问题(遗传算法)
 
广告
{{v.name}}
遗传算法流程:
初始化种群:随机生成多个解(个体)
计算适应度:给每个解打分(越优分越高)
选择:按分数挑优秀个体当父母
交叉:父母交换基因,生下一代
变异:对下一代进行随机变异
更新种群:用新一代替换旧一代
重复上述步骤,直到满足停止条件
求解,代码如下:
>> % ========== 遗传算法 GA ==========
pkg load statistics;

% 参数
pop_size = 50;     % 种群大小
dim = 1;           % 变量维数
lb = -5;           % 下界
ub = 5;            % 上界
max_gen = 100;     % 最大迭代代数
pc = 0.8;          % 交叉概率
pm = 0.1;          % 变异概率

% 1. 初始化种群
pop = lb + (ub - lb) * rand(pop_size, dim);

for gen = 1:max_gen
    % 2. 计算适应度
    fitness = 1 ./ (1 + abs(pop).^2);  % 求 min x²,适应度越高越好

    % 3. 选择(轮盘赌)
    prob = fitness / sum(fitness);
    idx = randsample(1:pop_size, pop_size, true, prob);
    pop = pop(idx, :);

    % 4. 交叉
    for i = 1:2:pop_size
        if rand < pc
            alpha = rand;
            pop(i,:) = alpha*pop(i,:) + (1-alpha)*pop(i+1,:);
            pop(i+1,:) = (1-alpha)*pop(i,:) + alpha*pop(i+1,:);
        end
    end

    % 5. 变异
    for i = 1:pop_size
        if rand < pm
            pop(i,:) = lb + (ub-lb)*rand;
        end
    end

    % 当代最优
    [~, best_idx] = max(fitness);
    best_x = pop(best_idx);
    best_f = best_x^2;
    fprintf('第%d代 最优 x=%.4f, f(x)=%.4f\n', gen, best_x, best_f);
end
----------
第1代 最优 x=-1.0282, f(x)=1.0571
第2代 最优 x=0.2520, f(x)=0.0635
第3代 最优 x=0.0585, f(x)=0.0034
第4代 最优 x=0.2352, f(x)=0.0553
第5代 最优 x=4.0841, f(x)=16.6798
第6代 最优 x=-0.1330, f(x)=0.0177
第7代 最优 x=0.0657, f(x)=0.0043
第8代 最优 x=-0.1650, f(x)=0.0272
第9代 最优 x=0.0020, f(x)=0.0000
第10代 最优 x=-0.0386, f(x)=0.0015
第11代 最优 x=-0.1235, f(x)=0.0152
第12代 最优 x=0.2565, f(x)=0.0658
第13代 最优 x=-0.0038, f(x)=0.0000
第14代 最优 x=-0.0104, f(x)=0.0001
第15代 最优 x=0.1795, f(x)=0.0322
第16代 最优 x=-0.0374, f(x)=0.0014
第17代 最优 x=-0.0092, f(x)=0.0001
第18代 最优 x=0.0377, f(x)=0.0014
第19代 最优 x=0.0522, f(x)=0.0027
第20代 最优 x=0.0212, f(x)=0.0005
第21代 最优 x=-0.0920, f(x)=0.0085
第22代 最优 x=-0.0122, f(x)=0.0001
第23代 最优 x=0.0542, f(x)=0.0029
第24代 最优 x=0.0986, f(x)=0.0097
第25代 最优 x=0.0696, f(x)=0.0048
第26代 最优 x=0.0707, f(x)=0.0050
第27代 最优 x=0.0778, f(x)=0.0061
第28代 最优 x=0.0682, f(x)=0.0046
第29代 最优 x=0.1116, f(x)=0.0125
第30代 最优 x=0.2099, f(x)=0.0440
第31代 最优 x=3.5484, f(x)=12.5912
第32代 最优 x=0.1665, f(x)=0.0277
第33代 最优 x=0.0263, f(x)=0.0007
第34代 最优 x=3.4647, f(x)=12.0045
第35代 最优 x=0.1715, f(x)=0.0294
第36代 最优 x=0.1548, f(x)=0.0240
第37代 最优 x=0.0223, f(x)=0.0005
第38代 最优 x=-0.2741, f(x)=0.0752
第39代 最优 x=0.1184, f(x)=0.0140
第40代 最优 x=0.1179, f(x)=0.0139
第41代 最优 x=0.1197, f(x)=0.0143
第42代 最优 x=0.1669, f(x)=0.0279
第43代 最优 x=0.1569, f(x)=0.0246
第44代 最优 x=1.9590, f(x)=3.8379
第45代 最优 x=0.1092, f(x)=0.0119
第46代 最优 x=4.8483, f(x)=23.5064
第47代 最优 x=0.1067, f(x)=0.0114
第48代 最优 x=0.1477, f(x)=0.0218
第49代 最优 x=0.1436, f(x)=0.0206
第50代 最优 x=0.1601, f(x)=0.0256
第51代 最优 x=0.0053, f(x)=0.0000
第52代 最优 x=0.0298, f(x)=0.0009
第53代 最优 x=0.1283, f(x)=0.0165
第54代 最优 x=0.0901, f(x)=0.0081
第55代 最优 x=0.0897, f(x)=0.0080
第56代 最优 x=0.1182, f(x)=0.0140
第57代 最优 x=0.0370, f(x)=0.0014
第58代 最优 x=0.1686, f(x)=0.0284
第59代 最优 x=0.0865, f(x)=0.0075
第60代 最优 x=0.0967, f(x)=0.0093
第61代 最优 x=0.0923, f(x)=0.0085
第62代 最优 x=0.1011, f(x)=0.0102
第63代 最优 x=1.0139, f(x)=1.0280
第64代 最优 x=0.0971, f(x)=0.0094
第65代 最优 x=-1.8150, f(x)=3.2942
第66代 最优 x=2.0427, f(x)=4.1727
第67代 最优 x=0.0272, f(x)=0.0007
第68代 最优 x=0.0222, f(x)=0.0005
第69代 最优 x=0.0290, f(x)=0.0008
第70代 最优 x=0.0423, f(x)=0.0018
第71代 最优 x=0.0128, f(x)=0.0002
第72代 最优 x=0.8661, f(x)=0.7501
第73代 最优 x=-0.0414, f(x)=0.0017
第74代 最优 x=-0.0511, f(x)=0.0026
第75代 最优 x=-0.0128, f(x)=0.0002
第76代 最优 x=-0.0239, f(x)=0.0006
第77代 最优 x=-0.0320, f(x)=0.0010
第78代 最优 x=2.5526, f(x)=6.5158
第79代 最优 x=-0.3072, f(x)=0.0944
第80代 最优 x=-3.8700, f(x)=14.9765
第81代 最优 x=-0.1422, f(x)=0.0202
第82代 最优 x=-0.0391, f(x)=0.0015
第83代 最优 x=-0.0473, f(x)=0.0022
第84代 最优 x=-0.2230, f(x)=0.0497
第85代 最优 x=-2.6339, f(x)=6.9372
第86代 最优 x=-0.0967, f(x)=0.0093
第87代 最优 x=-0.0587, f(x)=0.0035
第88代 最优 x=-0.0011, f(x)=0.0000
第89代 最优 x=-0.0099, f(x)=0.0001
第90代 最优 x=-0.0236, f(x)=0.0006
第91代 最优 x=-0.0692, f(x)=0.0048
第92代 最优 x=-0.0386, f(x)=0.0015
第93代 最优 x=-0.0541, f(x)=0.0029
第94代 最优 x=-0.1457, f(x)=0.0212
第95代 最优 x=-0.0395, f(x)=0.0016
第96代 最优 x=-0.1126, f(x)=0.0127
第97代 最优 x=-0.0913, f(x)=0.0083
第98代 最优 x=-0.1921, f(x)=0.0369
第99代 最优 x=-0.1747, f(x)=0.0305
第100代 最优 x=-0.0783, f(x)=0.0061
友链