實數編碼遺傳演算法matlab
A. 你好,請問matlab中使用遺傳演算法編程,變數既有0-1整數,又有0~1之間的實數,該怎麼編碼處理啊謝謝
可以用二進制編碼,對於0-1整數,顯然可以解決;對於0~1之間的實數,可以用解碼的方式,將其映射到0~1范圍內。比如:二進制01101轉換成十進制是15,那麼你可以將其乘以0.01,變為0.15。其他類似。
B. MATLAB遺傳演算法DNA計算中如何把實數編碼引入到四進制編碼我郵箱[email protected]
matlab的de2bi函數可以實現十進制與n進制數的轉換。
比如de2bi(12,[],4,'left-msb')就把十進制數12轉為4進制數組。
C. 如何用matlab編寫遺傳演算法程序,求解這個問題實數編碼,求教!
看matlab幫助文檔,裡面有一個rosenbroke函數的遺傳演算法例子。照貓畫虎就可以了
D. MATLAB中遺傳演算法編程中,二進制編碼如何處理實數變數
假如你想要編碼為x,設x的范圍是【min,max】,二進制編碼長度為10,那二進解碼方式是:x*(max-min)/1023,這個不用開始編碼,開始你可以用rand(n,10)產生n個樣本的隨機數,然後優化即可。
不是能把「數學模型中的目標函數和每一條約束函數分別編程Matlab里的M文件」,是你用遺傳演算法就必須要編進去,電腦怎麼知道往哪個方向優化是好的,要不把你郵箱留下,我給你發個尋求最大值的遺傳演算法。
E. matlab2008遺傳演算法工具箱採用的是二進制編碼還是實數編碼
兩種編碼都有,可以自己選擇。
你在MATLAB2008里輸入 gaoptimset
會彈出遺傳演算法的所有的設置選項及默認項。其中,第一行就是個體的編碼方式,第一行如下
PopulationType: [ 'bitstring' | 'custom' | {'doubleVector'} ]
其中,bitstring就是二進制編碼,而'doubleVector'即實數編碼(MATLAB里實數是用double雙精度浮點數表示的,精度很高。大括弧{}表示是默認設置。
而中間的'custom'是表示用戶自己構造個體的編碼形式。(參加GA算例,在美國地圖中的TSP問題,很帥~
加油,MATLAB是個好軟體~~~
F. matlab的遺傳演算法 如何調用已經訓練好的神經網路輸出
遺傳演算法優化的BP神經網路建模借鑒別人的程序做出的模擬,最近才有時間整理。
目標:
對y=x1^2+x2^2非線性系統進行建模,用1500組數據對網路進行構建網路,500組數據測試網路。由於BP神經網路初始神經元之間的權值和閾值一般隨機選擇,因此容易陷入局部最小值。本方法使用遺傳演算法優化初始神經元之間的權值和閾值,並對比使用遺傳演算法前後的效果。
步驟:
未經遺傳演算法優化的BP神經網路建模
1、 隨機生成2000組兩維隨機數(x1,x2),並計算對應的輸出y=x1^2+x2^2,前1500組數據作為訓練數據input_train,後500組數據作為測試數據input_test。並將數據存儲在data中待遺傳演算法中使用相同的數據。
2、 數據預處理:歸一化處理。
3、 構建BP神經網路的隱層數,次數,步長,目標。
4、 使用訓練數據input_train訓練BP神經網路net。
5、 用測試數據input_test測試神經網路,並將預測的數據反歸一化處理。
6、 分析預測數據與期望數據之間的誤差。
遺傳演算法優化的BP神經網路建模
1、 讀取前面步驟中保存的數據data;
2、 對數據進行歸一化處理;
3、 設置隱層數目;
4、 初始化進化次數,種群規模,交叉概率,變異概率
5、 對種群進行實數編碼,並將預測數據與期望數據之間的誤差作為適應度函數;
6、 循環進行選擇、交叉、變異、計算適應度操作,直到達到進化次數,得到最優的初始權值和閾值;
7、 將得到最佳初始權值和閾值來構建BP神經網路;
8、 使用訓練數據input_train訓練BP神經網路net;
9、 用測試數據input_test測試神經網路,並將預測的數據反歸一化處理;
10、 分析預測數據與期望數據之間的誤差。
G. 求基於遺傳演算法的TPS的matlab程序,坐標手動輸入
1. 遺傳演算法實現過程
現實生活中很多問題都可以轉換為函數優化問題,所以本文將以函數優化問題作為背景,對GA的實現過程進行探討。大部分函數優化問題都可以寫成求最大值或者最小值的形式,為了不是一般性,我們可以將所有求最優值的情況都轉換成求最大值的形式,例如,求函數f(x)的最大值,
clip_image002
若是求函數f(x)的最小值,可以將其轉換成g(x)=-f(x),然後求g(x)的最大值,
clip_image004
這里x可以是一個變數,也可是是一個由k個變數組成的向量, x=(x1, x2, …, xk)。每個xi, i=1,2,…,k, 其定義域為Di,Di=[ai, bi]。
一般規定f(x)在其定義域內只取正值,若不滿足,可以將其轉換成以下形式,
clip_image006
其中C是一個正常數。
1.1 編碼與解碼
要實現遺傳演算法首先需要弄清楚如何對求解問題進行編碼和解碼。對於函數優化問題,一般來說,有兩種編碼方式,一是實數編碼,一是二進制編碼,兩者各有優缺點,二進制編碼具有穩定性高、種群多樣性大等優點,但是需要的存儲空間大,需要解碼過程並且難以理解;而實數編碼直接用實數表示基因,容易理解並且不要解碼過程,但是容易過早收斂,從而陷入局部最優。本文以最常用的二進制編碼為例,說明遺傳編碼的過程。
從遺傳演算法求解的過程來看,需要處理好兩個空間的問題,一個是編碼空間,另一個是解空間,如下圖所示
clip_image007
從解空間到編碼空間的映射過程成為編碼過程;從編碼空間到解空間的映射過程成為解碼過程。下面就以求解一個簡單的一維函數f(x) = -(x-1)^2+4, x的取值范圍為[-1,3]最大值為例,來說明編碼及解碼過程。
編碼:
在編碼之前需要確定求解的精度,在這里,我們設定求解的精度為小數點後四位,即1e-4。這樣可以將每個自變數xi的解空間劃分為clip_image011個等分。以上面這個函數為例,即可以將x的解空間劃分為(3-(-1))*1e+4=40000個等分。使ni滿足clip_image013,這里ni表示使上式成立的最小整數,即表示自變數xi的基因串的長度。因為215<40000<216 ,這里ni取16。例如0000110110000101就表示一個解空間中的基因串。表示所有自變數x=(x1, x2, …, xk)的二進制串的總長度稱為一個染色體(Chromosome)的長度或者一個個體(Indivial)的長度,clip_image015。編碼過程一般在實現遺傳演算法之前需要指定。
解碼:
解碼即將編碼空間中的基因串翻譯成解空間中的自變數的實際值的過程。對於二進制編碼而言,每個二進制基因串都可以這樣翻譯成一個十進制實數值,clip_image017。例如基因串0000110110000101,可以翻譯為clip_image019,這里二進制基因串轉變成十進制是從左至右進行的。
1.2 初始化種群
在開始遺傳演算法迭代過程之前,需要對種群進行初始化。設種群大小為pop_size,每個染色體或個體的長度為chromo_size,種群的大小決定了種群的多樣性,而染色體的長度則是由前述的編碼過程決定的。一般隨機生成初始種群,但是如果知道種群的實際分布,也可以按照此分布來生成初始種群。假設生成的初始種群為(v1, v2, …, vpop_size)。
1.3 選擇操作
選擇操作即從前代種群中選擇個體到下一代種群的過程。一般根據個體適應度的分布來選擇個體。以初始種群(v1, v2, …, vpop_size)為例,假設每個個體的適應度為(fitness(v1), fitness(v2),…, fitness(vpop_size)),一般適應度可以按照解碼的過程進行計算。以輪盤賭的方式選擇個體,如下圖
clip_image020
隨機轉動一下輪盤,當輪盤停止轉動時,若指針指向某個個體,則該個體被選中。很明顯,具有較高適應度的個體比具有較低適應度的個體更有機會被選中。但是這種選擇具有隨機性,在選擇的過程中可能會丟失掉比較好的個體,所以可以使用精英機制,將前代最優個體直接選到下一代中。
輪盤賭選擇具體演算法如下(這里假定種群中個體是按照適應度從小到大進行排列的,如果不是,可以按照某種排序演算法對種群個體進行重排):
Selection Algorithm
var pop, pop_new;/*pop為前代種群,pop_new為下一代種群*/
var fitness_value, fitness_table;/*fitness_value為種群的適應度,fitness_table為種群累積適應度*/
for i=1:pop_size
r = rand*fitness_table(pop_size);/*隨機生成一個隨機數,在0和總適應度之間,因為fitness_table(pop_size)為最後一個個體的累積適應度,即為總適應度*/
first = 1;
last = pop_size;
mid = round((last+first)/2);
idx = -1;
/*下面按照排中法選擇個體*/
while (first <= last) && (idx == -1)
if r > fitness_table(mid)
first = mid;
elseif r < fitness_table(mid)
last = mid;
else
idx = mid;
break;
end if
mid = round((last+first)/2);
if (last - first) == 1
idx = last;
break;
end if
end while
for j=1:chromo_size
pop_new(i,j)=pop(idx,j);
end for
end for
/*是否精英選擇*/
if elitism
p = pop_size-1;
else
p = pop_size;
end if
for i=1:p
for j=1:chromo_size
pop(i,j) = pop_new(i,j);/*若是精英選擇,則只將pop_new前pop_size-1個個體賦給pop,最後一個為前代最優個體保留*/
end for
end for
1.3 交叉操作
交叉操作是對任意兩個個體進行的(在這里我們實現的演算法是直接對相鄰的兩個個體進行的)。隨機選擇兩個個體,如下圖所示
clip_image001
然後隨機生成一個實數0<=r<=1, 如果r<cross_rate, 0<cross_rate<1為交叉概率,則對這兩個個體進行交叉,否則則不進行。如果需要進行交叉,再隨機選擇交叉位置(rand*chromo_size),如果等於0或者1,將不進行交叉。否則將交叉位置以後的二進制串進行對換(包括交叉位置)。(注意:有時候還可以進行多點交叉,但是這里只討論單點交叉的情況)
單點交叉具體演算法如下:
Crossover algorithm
for i=1:2:pop_size
if(rand < cross_rate)/*cross_rate為交叉概率*/
cross_pos = round(rand * chromo_size);/*交叉位置*/
if or (cross_pos == 0, cross_pos == 1)
continue;/*若交叉位置為0或1,則不進行交叉*/
end if
for j=cross_pos:chromo_size
pop(i,j)<->pop(i+1,j);/*交換*/
end for
end if
end for
1.4 變異操作
變異操作是對單個個體進行的。首先生成一個隨機實數0<=r<=1, 如果r<mutate_rate,則對此個體進行變異操作, 0<mutate_rate<1為變異概率,一般為一個比較小的實數。對每一個個體,進行變異操作,如下圖所示
clip_image001[4]
如個體需要進行變異操作,首先需要確定變異位置(rand*chromo_size),若為0則不進行變異,否則則對該位置的二進制數字進行變異:1變成0, 0變成1.(當然也可以選擇多點進行變異)
單點變異的具體演算法描述如下:
Mutation algorithm
for i=1:pop_size
if rand < mutate_rate/*mutate_rate為變異概率*/
mutate_pos = round(rand*chromo_size);/*變異位置*/
if mutate_pos == 0
continue;/*若變異位置為0,則不進行變異*/
end if
pop(i,mutate_pos) = 1 - pop(i, mutate_pos);/*將變異位置上的數字至反*/
end if
end for
1.5 遺傳演算法流程
遺傳演算法計算流程圖如下圖所示
clip_image001[6]
1.6 MATLAB程序實現
初始化:
%初始化種群
%pop_size: 種群大小
%chromo_size: 染色體長度
function initilize(pop_size, chromo_size)
global pop;
for i=1:pop_size
for j=1:chromo_size
pop(i,j) = round(rand);
end
end
clear i;
clear j;
計算適應度:(該函數應該根據具體問題進行修改,這里優化的函數是前述的一維函數)
%計算種群個體適應度,對不同的優化目標,此處需要改寫
%pop_size: 種群大小
%chromo_size: 染色體長度
function fitness(pop_size, chromo_size)
global fitness_value;
global pop;
global G;
for i=1:pop_size
fitness_value(i) = 0.;
end
for i=1:pop_size
for j=1:chromo_size
if pop(i,j) == 1
fitness_value(i) = fitness_value(i)+2^(j-1);
end
end
fitness_value(i) = -1+fitness_value(i)*(3.-(-1.))/(2^chromo_size-1);
fitness_value(i) = -(fitness_value(i)-1).^2+4;
end
clear i;
clear j;
對個體按照適應度大小進行排序:
%對個體按適應度大小進行排序,並且保存最佳個體
%pop_size: 種群大小
%chromo_size: 染色體長度
function rank(pop_size, chromo_size)
global fitness_value;
global fitness_table;
global fitness_avg;
global best_fitness;
global best_indivial;
global best_generation;
global pop;
global G;
for i=1:pop_size
fitness_table(i) = 0.;
end
min = 1;
temp = 1;
temp1(chromo_size)=0;
for i=1:pop_size
min = i;
for j = i+1:pop_size
if fitness_value(j)<fitness_value(min);
min = j;
end
end
if min~=i
temp = fitness_value(i);
fitness_value(i) = fitness_value(min);
fitness_value(min) = temp;
for k = 1:chromo_size
temp1(k) = pop(i,k);
pop(i,k) = pop(min,k);
pop(min,k) = temp1(k);
end
end
end
for i=1:pop_size
if i==1
fitness_table(i) = fitness_table(i) + fitness_value(i);
else
fitness_table(i) = fitness_table(i-1) + fitness_value(i);
end
end
fitness_table
fitness_avg(G) = fitness_table(pop_size)/pop_size;
if fitness_value(pop_size) > best_fitness
best_fitness = fitness_value(pop_size);
best_generation = G;
for j=1:chromo_size
best_indivial(j) = pop(pop_size,j);
end
end
clear i;
clear j;
clear k;
clear min;
clear temp;
clear temp1;
選擇操作:
%輪盤賭選擇操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 是否精英選擇
function selection(pop_size, chromo_size, elitism)
global pop;
global fitness_table;
for i=1:pop_size
r = rand * fitness_table(pop_size);
first = 1;
last = pop_size;
mid = round((last+first)/2);
idx = -1;
while (first <= last) && (idx == -1)
if r > fitness_table(mid)
first = mid;
elseif r < fitness_table(mid)
last = mid;
else
idx = mid;
break;
end
mid = round((last+first)/2);
if (last - first) == 1
idx = last;
break;
end
end
for j=1:chromo_size
pop_new(i,j)=pop(idx,j);
end
end
if elitism
p = pop_size-1;
else
p = pop_size;
end
for i=1:p
for j=1:chromo_size
pop(i,j) = pop_new(i,j);
end
end
clear i;
clear j;
clear pop_new;
clear first;
clear last;
clear idx;
clear mid;
交叉操作:
%單點交叉操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 交叉概率
function crossover(pop_size, chromo_size, cross_rate)
global pop;
for i=1:2:pop_size
if(rand < cross_rate)
cross_pos = round(rand * chromo_size);
if or (cross_pos == 0, cross_pos == 1)
continue;
end
for j=cross_pos:chromo_size
temp = pop(i,j);
pop(i,j) = pop(i+1,j);
pop(i+1,j) = temp;
end
end
end
clear i;
clear j;
clear temp;
clear cross_pos;
變異操作:
%單點變異操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 變異概率
function mutation(pop_size, chromo_size, mutate_rate)
global pop;
for i=1:pop_size
if rand < mutate_rate
mutate_pos = round(rand*chromo_size);
if mutate_pos == 0
continue;
end
pop(i,mutate_pos) = 1 - pop(i, mutate_pos);
end
end
clear i;
clear mutate_pos;
列印演算法迭代過程:
%列印演算法迭代過程
%generation_size: 迭代次數
function plotGA(generation_size)
global fitness_avg;
x = 1:1:generation_size;
y = fitness_avg;
plot(x,y)
演算法主函數:
%遺傳演算法主函數
%pop_size: 輸入種群大小
%chromo_size: 輸入染色體長度
%generation_size: 輸入迭代次數
%cross_rate: 輸入交叉概率
%cross_rate: 輸入變異概率
%elitism: 輸入是否精英選擇
%m: 輸出最佳個體
%n: 輸出最佳適應度
%p: 輸出最佳個體出現代
%q: 輸出最佳個體自變數值
function [m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate, elitism)
global G ; %當前代
global fitness_value;%當前代適應度矩陣
global best_fitness;%歷代最佳適應值
global fitness_avg;%歷代平均適應值矩陣
global best_indivial;%歷代最佳個體
global best_generation;%最佳個體出現代
fitness_avg = zeros(generation_size,1);
disp "hhee"
fitness_value(pop_size) = 0.;
best_fitness = 0.;
best_generation = 0;
initilize(pop_size, chromo_size);%初始化
for G=1:generation_size
fitness(pop_size, chromo_size); %計算適應度
rank(pop_size, chromo_size); %對個體按適應度大小進行排序
selection(pop_size, chromo_size, elitism);%選擇操作
crossover(pop_size, chromo_size, cross_rate);%交叉操作
mutation(pop_size, chromo_size, mutate_rate);%變異操作
end
plotGA(generation_size);%列印演算法迭代過程
m = best_indivial;%獲得最佳個體
n = best_fitness;%獲得最佳適應度
p = best_generation;%獲得最佳個體出現代
%獲得最佳個體變數值,對不同的優化目標,此處需要改寫
q = 0.;
for j=1:chromo_size
if best_indivial(j) == 1
q = q+2^(j-1);
end
end
q = -1+q*(3.-(-1.))/(2^chromo_size-1);
clear i;
clear j;
2. 案例研究
對上一節中的函數進行優化,設置遺傳演算法相關參數,程序如下
function run_ga()
elitism = true;%選擇精英操作
pop_size = 20;%種群大小
chromo_size = 16;%染色體大小
generation_size = 200;%迭代次數
cross_rate = 0.6;%交叉概率
mutate_rate = 0.01;%變異概率
[m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate,elitism);
disp "最優個體"
m
disp "最優適應度"
n
disp "最優個體對應自變數值"
q
disp "得到最優結果的代數"
p
clear;
結果如下:
"最優個體"
m =
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
"最優適應度"
n =
4.0000
"最優個體對應自變數值"
q =
1.0000
"得到最優結果的代數"
p =
74
此結果非常准確。
H. matlab遺傳演算法程序解讀誰能逐句給我解釋一下
高手解釋下,這個選擇、交叉、變異各是採用了什麼方法?????我也很想知道這段程序呀。這個是基於實數編碼的遺傳演算法優化PID參數。
I. 在matlab中如何用遺傳演算法求解函數和的最小值
該程序採用實數編碼的遺傳演算法編寫,附件1(real code ga.m)為matlab代碼。
附件2(實數編碼遺傳演算法參考資料):
http://www.math.zju.e.cn/cagd/resources/thesis/PhDthesis_ZhouMingHUa.pdf
優化結果需要修改mutate_P以及變異量的大小。因為只有一個優化變數因此編程較為簡單。
提供一個參考鏈接:http://..com/question/583959020.html?oldq=1