数理モデルシリーズ:遺伝的アルゴリズム

簡単な紹介

遺伝的アルゴリズム(遺伝的アルゴリズム、GA)は自然淘汰と人工システムと最適化における具体的な目標を達成するための人生進の進化のアナログ性質で検索(最適化)アルゴリズムの自然な遺伝的メカニズムの原理に基づいています。GAは、適者生存の原理は、より世代の進化で、最終的には最適または準最適解を得る、検索技術を通じて地域社会の本質です。無作為化クロスオーバー遺伝子染色体とランダム変異によってオフペア最高の個々が選択されているの適者生存選択の生存の原則に従って初期集団、最高の個々の個々のシークフィットネスの生成:それは、次の操作を行う必要があります進化終了条件が満たされるまで、これらの次世代の染色体遺伝子群は、このようにグループは、各世代で進化します。

バイオジェン・コンセプト アクションで遺伝的アルゴリズム
優勝劣敗 アルゴリズムが停止すると、最適なターゲットのための実現可能な解決策は、最大値を保持するかもしれません
個々 実現可能なソリューション
染色体 実現可能なソリューションをコーディング
遺伝子 実現可能な解前記各成分
適当 フィットネス機能
人口 適応度関数を選択した実現可能なソリューションのセット
交尾 交配によって新しいプロセス原理実現可能なソリューションのセットを生成します
バリエーション 成分符号化処理が変更され

- 「モデリングアルゴリズムと応用数学」(部門寿クイ)

モデルとアルゴリズム

解決するために遺伝的アルゴリズムを使用して、以前の記事の質問に記載された例を2

集団サイズM = 50、最大世代G = 1000。

交叉率\(P_C = 1 \) 交叉確率は人口の十分な発展を確保するために1です。

突然変異率\(P_M = 0.1 \) 一般的に、変異させる可能性が低いです。

  1. コーディング戦略

    小数点符号化、カラム乱数\(W_1、W_2、···、 W_ {21} \) 染色体として\(0 \ルw_i \ル 1(iは2,3、···、20)= = 0 W_1、w_21 1 = \)。 ;各ランダム系列及び個体の集団に一対一に対応

  2. 初期集団

    良好な初期集団を得るための改善襟アルゴリズム - 古典近似アルゴリズムの最初の使用。

    ランダムに生成された最初のリングのための
    \ [C = C_1···C_ { U-1} C_uC_ {U + 1}···C_ {V-1} C_vC_ {V + 1}···C_ {21}、2 \ルU <V \ル20,2
    \ルC_U <C_V \ル20 \] 交換UVの新たな経路との間の配列
    \ {U- [C_1···C_ C_vC_ {V + 1} 1} ···C_ {U + 1} C_uC_
    {V + 1}···C_ {21} \] と呼ば\(\デルタF =(D_ {C_ {U-1} C_V} + D_ {C_ {U} C_ V + 1} {}) - (U-D_ {C_ {C_U 1}。} + D_ {C_ {C_ {V} + V. 1}})\)、もしデルタの\(\ F <0 \)、場所新しいパスは、古いパスを変更日付を変更することはできませんまで、実現可能な解決策を得るために

    M、Mの実行可能解まで染色体にコード実行可能なソリューションにこれを変換し、

  3. 目的関数

    目的関数は、目的関数に適合関数としたすべてのターゲットパスの長さを検出します。要求
    \ [分F(C_1、··· 、C_ {21})= \ sum_ {I = 1} ^ {21} D_ {c_ic_ {I + 1}} \]

  4. クロスオーバー

    一点クロスオーバークロスオーバー。選択された2つの親個体のための\(F_1 = w_1w_2···W_ { 21}、F_2 = W_1 ^、W_2 ^、···W_ {21} ^、\) ランダムに第一選択のT遺伝子であります交差点、後代個体を得操作後の交点である\(S_1 \)\(S_2、S_1 \)による遺伝子\(F_1 \)の前のt遺伝子および\(F_2 \) 21後- Tの遺伝子構成、\(S_2 \)による遺伝子(F_2 \)\フロントTの遺伝子および\(F_1 \) 21の後には、 - Tの遺伝子構成。

  5. 突然変異

    所定のレートの変動に応じて、選択された個々のばらつきは、3つのランダムに満たす整数選ば。1 <U <V <<W 21でありU、Vの(を含む)との間の遺伝子セグメントが挿入さwが後ろ

  6. 選択

    あなたが保存されるように、両親からの優れた特性を確保することができるように決定論的選択ポリシーは、あること、目的関数の子孫の母集団の値と最小のMの人の人口は、次の世代へと進化します。

MATLABコード

clc,clear;
close all;

% 读取数据
data=load('data.txt');
x = data(:, 2);
y = data(:, 3);
start=[data(1,2),data(1,3)];
data = [data(:,[2 3]); start];

% 计算距离的邻接表
count = length(data(:, 1));
d = zeros(count);  %距离矩阵d初始化
for i = 1:count-1
    for j = i+1:count
        d(i,j)=( sum( ( data( i , : ) - data( j , : ) ) .^ 2 ) ) ^ 0.5 ;
    end
end
d =d + d';  % 对称  i到j==j到i
w=50;   % 种群个数
g=100;  % 进化代数
rand('state', sum(clock));  % 初始化随机数发生k器

% 通过改良图算法选取初始种群w
for k = 1:w
    c = randperm(count-2);  % 产生一个1-19的全排列
    c1 = [1,c+1,count]; % 生成初始解
for t = 1:count  % 修改圈
        flag = 0;  % 退出标志
        for m = 1:count-2
            for n = m+2:count-1
                if d(c1(m),c1(n))+d(c1(m+1),c1(n+1)) < d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
                    c1(m+1:n) = c1(n:-1:m+1);
                    flag = 1;
                end
            end
        end
        if flag == 0
            J(k,c1)=1:count;
            break     % 记录下较好的解并退出当前循环
        end
    end
end
J(:,1) = 0;
J = J/count;  % 把整数序列转换成[0,1]区间上的实数,即转换成染色体编码

% 遗传算法
for k = 1:g  
    A = J;  % 交配产生子代A的初始染色体
    c = randperm(w);  % 产生下面交叉操作的染色体对
    for i = 1:2:w
        F = 2+floor((count-2)*rand(1));  % 产生交叉操作的地址
        temp = A(c(i),[F:count]);  % 中间变量的保存值
        A(c(i+1), [F:count]) = A(c(i+1),[F:count]);  % 交叉操作
        A(c(i+1),F:count) =  temp;
    end
    by = [];  % 为了防止下面产生空地址,先初始化
    while isempty(by)
        by = find(rand(1,w)<0.1);  % 产生变异操作的地址
    end
    B=A(by,:);  % 产生变异操作的初始染色体
    
    for j=1:length(by)
        bw=sort(2+floor((count-2)*rand(1,3)));  % 产生变异操作的3个地址
        B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:count]);% 交换位置
    end
    G=[J;A;B];  % 父代和子代种群合在一起
    
    [SG,ind1] = sort(G,2); % 把染色体翻译成1···21的序列ind1
    num = size(G,1);
    long = zeros(1,num); %路径长度的初始值
    for j = 1:num
        for i = 1:count-1
            long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); % 计算每条路径长度
        end
    end
    [slong,ind2]=sort(long);  % 对路径长度从小打到排序

end
path = ind1(ind2(1),:);
flong=slong(1);

for i =1:count
   data1(:, i) = data(path(1,i), :)';
end


plot(x, y, '*', data1(1, :), data1(2, :), 'r');
title( [ '近似最短路径如下,路程为' , num2str( flong ) ] ) ;
disp(flong);

untitled.jpg

おすすめ

転載: www.cnblogs.com/CH42e/p/12286336.html