遺傳演算法之二進位制編碼

2021-08-07 19:17:18 字數 3365 閱讀 8666

遺傳演算法 ga 的流程如圖所示:

把所需要選擇的特徵進行編號,每乙個特徵就是乙個基因,乙個解就是一串基因的組合。為了減少組合數量,在影象中進行分塊,然後把每一塊看成乙個基因進行組合優化的計算。每個解得基因數量是要通過實驗確定的。

遺傳演算法不能直接處理問題空間的引數,必須把它們轉換成遺傳空間的由基因按一定結構組成的染色體或個體。這一轉換操作就叫做編碼。評估編碼策略常採用以下 3 個規範。

(1) 完備性(completeness):問題空間中的所有點(候選解)都能作為 ga 空間中的點(染色體)表現。

(2) 健全性(soundness):ga 空間中的染色體能對應所有空間中的候選解。

(3) 非冗餘性(nonredundancy):染色體和候選解一一對應。

目前幾種常用的編碼技術有二進位制編碼、浮點數編碼、字元編碼、程式設計編碼等二進位制編碼是遺傳演算法中最常見的編碼方法,即由二進位制字符集 產生通常的 0, 1 字串來表示問題的候選解。它具有以下特點

(1) 簡單易行;

(2) 符合最小字符集編碼原則;

(3) 便於用模式定理進行分析。

染色體編碼最常用的是二進位制編碼,對於離散性變數直接進行編碼,對於連續性變數先離散化後再編碼。

人人都是資料咖:
科普2:連續特徵的離散化:在什麼情況下將連續的特徵離散化後可以獲得更好的效果?

已知一元函式:

f(x) = xsin(10pi*x)+2 x∈[-1, 2]

現在要求在既定的區間內找出函式的最大值。

首先我們可以先用 matlab 把該函式的影象畫出來:

clc, clear;

syms f(x); % 宣告函式

x = linspace(-1,2,3000); % 定義 x, x 屬於 [-1, 2]

f = x.*sin(10*pi.*x)+2; % 定義函式,因為 x 是向量,所以採用點乘

plot(f); % 畫圖

然後做出圖形如下:

我們可以看到,該圖形顯示說明該函式具有多個區域性最優解,所以適合用遺傳演算法進行求解。

由遺傳演算法的基本步驟可知我們第一步應該是編碼:

二進位制編碼

受到人類染色體結構的啟發,我們可以設想一下,假設目前只有 0 和 1 兩種鹼基,我們也用一條鏈把它們有序的串連在一起,因為每乙個單位都能表現出 1bit 的資訊量,所以一條足夠長的染色體就能為我們勾勒出乙個個體特徵的所有特徵。這就是二進位制編碼

下面將介紹如何建立二進位制編碼到乙個實數的對映。

明顯地,一定長度的二進位制編碼序列,只能表示一定精度的浮點數。譬如我們要求小數點後精確到六位小數,由於區間長度為

2 - (-1) = 3
為了保證精度的要求,至少把區間 [-1, 2] 分為 3*10^6 等份。又因為

2097152=2^21 < 3*10^6 < 2^22=4194304
所以編碼的二進位制串至少有 22 位。

把乙個二進位制串 (b1b2…bn) 轉換為區間裡面對應的實數值通過下面兩個步驟。

(1) 將乙個二進位制串代表的二進位制轉換為十進位制數:

(2) 對應區間的實數:

或許有人並不知道是如何把數值轉換到對應區間的實數的,為什麼要這麼做?我也是問了一下我的小夥伴才知曉的,下面我來簡單的說一下:

通常我們歸一化到 [0, 1],有時候我們需要歸一化到其它區間,這樣算一下就可以找到數列的最小值 m 及最大值 m,如果指定的區間是 [a, b],即:

m-->a, m-->b;
係數為:

k = (b-a)/(m-m)
對任意項xn:變成:

x = a+k(xn-m)
%% 將十進位制數轉換為二進位制數(二進位制編碼)

% @params dec_num 十進位制數

% @params n 需保留的二進位制小數字數

function bin_num = encode(dec_num, n)

split = '.';

if rem(dec_num, 1) == 0

bin_num = dec2bin(dec_num);

float_num = zeros(1, n);

bin_num = strcat(num2str(bin_num), split);

bin_num = strcat(bin_num, num2str(float_num));

else

remainder = rem(dec_num, 1); % 小數部分

integer = floor(dec_num); % 整數部分

bin_num_int = dec2bin(integer);

i = 1;

flag = true;

while(flag == true)

remainder = remainder*2;

if (i > n) % 是否滿足精度

return;

endif remainder > 1

record(i) = 1;

remainder = rem(remainder, 1);

else if remainder == 1

record(i) = 1;

remainder = rem(remainder, 1);

else

record(i) = 0;

endi = i+1;

endbin_num_flt = record;

bin_num = strcat(num2str(bin_num_int), split);

bin_num = strcat(bin_num, num2str(bin_num_flt));

endend

end

未完…(有機會再出第二章)

遺傳演算法 二進位制編碼方式

用遺傳演算法求y x sin 10 pi x 2的最大值 1 2 精確到6位小數 pow 2,21 3 1000000 2,22 編碼的二進位制長度為22 include include include include include define n 3000000 define pi 3.141...

遺傳演算法 matlab實現 多維變數 二進位制編碼

這些日子一直在學習遺傳演算法,在csdn上看了好多關於遺傳演算法的例子,但是找不到乙個符合自己的例子。自己的需求 有四個變數,尋求最優化的結果。跟那些用二元函式舉例的不同。首先介紹下,1.遺傳演算法的流程 假設有100個個體,計算每個個體的適應度 即效能 通過輪盤演算法,選擇100個個體,這100個...

遺傳演算法(二) 編碼

在實現遺傳演算法時,首要遇到的關鍵問題就是編碼 encode 編碼的方法直接影響到了遺傳演算法的交叉運算元 變異運算元等遺傳運算元的運算,因此很大程度上決定了遺傳進化的效率。編譯碼過程圖示 編碼原則 下面主要總結一下最主流的一些編碼方法 含義 個體基因型使用二值符號集來構成,整個基因型是乙個二進位制...