導航:首頁 > 源碼編譯 > 遺傳演算法流程圖

遺傳演算法流程圖

發布時間:2022-02-16 07:04:46

『壹』 遺傳演算法的主要步驟

為了使用遺傳演算法來解決優化問題,准備工作分為以下四步[56,57,61]

7.4.1 確定問題的潛在解的遺傳表示方案

在基本的遺傳演算法中,表示方案是把問題的搜索空間中每個可能的點表示為確定長度的特徵串(通常是二進制串)。表示方案的確定需要選擇串長l和字母表規模k。在染色體串和問題的搜索空間中的點之間選擇映射有時容易實現,有時又非常困難。選擇一個便於遺傳演算法求解問題的表示方案經常需要對問題有深入的了解。

7.4.2 確定適應值的度量

適應值度量為群體中每個可能的確定長度的特徵串指定一個適應值,它經常是問題本身所具有的。適應值度量必須有能力計算搜索空間中每個確定長度的特徵串的適應值。

7.4.3 確定控制該演算法的參數和變數

控制遺傳演算法的主要參數有群體規模Pop-Size、演算法執行的最大代數N-Gen、交叉概率Pc、變異概率Pm和選擇策略R等參數。

(1)群體規模Pop-Size。群體規模影響到遺傳演算法的最終性能和效率。當規模太小時,由於群體對大部分超平面只給出了不充分的樣本量,所以得到的結果一般不佳。大的群體更有希望包含出自大量超平面的代表,從而可以阻止過早收斂到局部最優解;然而群體越大,每一代需要的計算量也就越多,這有可能導致一個無法接受的慢收斂率。

(2)交叉率Pc。交叉率控制交叉運算元應用的頻率,在每代新的群體中,有Pc·Pop-Size個串實行交叉。交叉率越高,群體中串的更新就越快。如果交叉率過高,相對選擇能夠產生的改進而言,高性能的串被破壞得更快。如果交叉率過低,搜索會由於太小的探查率而可能停滯不前。

(3)變異率Pm。變異是增加群體多樣性的搜索運算元,每次選擇之後,新的群體中的每個串的每一位以相等的變異率進行隨機改變。對於M進制串,就是相應的位從1變為0或0變為1。從而每代大約發生Pm·Pop-Size·L次變異,其中L為串長。一個低水平的變異率足以防止整個群體中任一給定位保持永遠收斂到單一的值。高水平的變異率產生的實質是隨機搜索。

比起選擇和交叉,變異在遺傳演算法中是次要的,它在恢復群體中失去的多樣性方面具有潛在的作用。例如,在遺傳演算法執行的開始階段,串中一個特定位上的值1可能與好的性能緊密聯系,也就是說從搜索空間中某些初始隨機點開始,在那個位上的值1可能一致地產生適應性度量好的值。因為越好的適應值與串中那個位上的值1相聯系,復製作用就越會使群體的遺傳多樣性損失。當達到一定程度時,值0會從整個群體中的那個位上消失,然而全局最優解可能在串中那個位上是0。一旦搜索范圍縮小到實際包含全局最優解的那部分搜索空間,在那個位上的值0就可能正好是達到全局最優解所需的。這僅僅是一種說明搜索空間是非線性的方式,這種情形不是假定的,因為實際上所有我們感興趣的問題都是非線性的。變異作用提供了一個恢復遺傳多樣性的損失的方法。

(4)選擇策略R。有兩種選擇策略。一是利用純選擇,即當前群體中每個點復制的次數比與點的性能值成比例。二是利用最優選擇,即首先執行純選擇,且具有最好性能的點總是保留到下一代。在缺少最優選擇的情況下,由於采樣誤差、交叉和變異,最好性能的點可能會丟失。

通過指定各個參數Pop-Size、Pc、Pm和R的值,可以表示一個特定的遺傳演算法。

7.4.4 確定指定結果的方法和停止運行的准則

當遺傳的代數達到最大允許代數時,就可以停止演算法的執行,並指定執行中得到的最好結果作為演算法的結果。

基本的遺傳演算法

1)隨機產生一個由固定長度字元串組成的初始群體。

2)對於字元串群體,迭代地執行下述步驟,直到選擇標准被滿足為止。

①計算群體中的每個個體字元串的適應值;

②實施下列三種操作(至少前兩種)來產生新的群體,操作對象的選取基於與適應度成比例的概率。

選擇:把現有的個體串按適應值復制到新的群體中。

交叉:通過遺傳重組隨機選擇兩個現有的子串進行遺傳重組,產生兩個新的串。

變異:將現有串中某一位的字元隨機變異產生一個新串。

3)把在後代中出現的最好適應值的個體串指定為遺傳演算法運行的結果。這一結果可以是問題的解(或近似解)。

基本的遺傳演算法流程圖如圖7-1所示。

『貳』 遺傳演算法 簡單程序應用

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

class Best {
public int generations; //最佳適應值代號
public String str; //最佳染色體
public double fitness; //最佳適應值
}

public class SGAFrame extends JFrame {

private JTextArea textArea;
private String str = "";
private Best best = null; //最佳染色體
private String[] ipop = new String[10]; //染色體
private int gernation = 0; //染色體代號
public static final int GENE = 22; //基因數
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
SGAFrame frame = new SGAFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the frame
*/
public SGAFrame() {
super();

this.ipop = inialPops();

getContentPane().setLayout(null);
setBounds(100, 100, 461, 277);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel label = new JLabel();
label.setText("X的區間:");
label.setBounds(23, 10, 88, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("[-255,255]");
label_1.setBounds(92, 10, 84, 15);
getContentPane().add(label_1);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
SGAFrame s = new SGAFrame();
str = str + s.process() + "\n";
textArea.setText(str);
}
});
button.setText("求最小值");
button.setBounds(323, 27, 99, 23);
getContentPane().add(button);

final JLabel label_2 = new JLabel();
label_2.setText("利用標准遺傳演算法求解函數f(x)=(x-5)*(x-5)的最小值:");
label_2.setBounds(23, 31, 318, 15);
getContentPane().add(label_2);

final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(23, 65, 399, 164);
getContentPane().add(panel);

final JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);

textArea = new JTextArea();
scrollPane.setViewportView(textArea);
//
}

/**
* 初始化一條染色體(用二進制字元串表示)
* @return 一條染色體
*/
private String inialPop() {
String res = "";
for (int i = 0; i < GENE; i++) {
if (Math.random() > 0.5) {
res += "0";
} else {
res += "1";
}
}
return res;
}

/**
* 初始化一組染色體
* @return 染色體組
*/
private String[] inialPops() {
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
}
return ipop;
}

/**
* 將染色體轉換成x的值
* @param str 染色體
* @return 染色體的適應值
*/
private double calculatefitnessvalue(String str) {
int b = Integer.parseInt(str, 2);
//String str1 = "" + "/n";
double x = -255 + b * (255 - (-255)) / (Math.pow(2, GENE) - 1);
//System.out.println("X = " + x);
double fitness = -(x - 5) * (x - 5);
//System.out.println("f(x)=" + fitness);
//str1 = str1 + "X=" + x + "/n"
//+ "f(x)=" + "fitness" + "/n";
//textArea.setText(str1);

return fitness;
}

/**
* 計算群體上每個個體的適應度值;
* 按由個體適應度值所決定的某個規則選擇將進入下一代的個體;
*/
private void select() {
double evals[] = new double[10]; // 所有染色體適應值
double p[] = new double[10]; // 各染色體選擇概率
double q[] = new double[10]; // 累計概率
double F = 0; // 累計適應值總和
for (int i = 0; i < 10; i++) {
evals[i] = calculatefitnessvalue(ipop[i]);
if (best == null) {
best = new Best();
best.fitness = evals[i];
best.generations = 0;
best.str = ipop[i];
} else {
if (evals[i] > best.fitness) // 最好的記錄下來
{
best.fitness = evals[i];
best.generations = gernation;
best.str = ipop[i];
}
}
F = F + evals[i]; // 所有染色體適應值總和

}
for (int i = 0; i < 10; i++) {
p[i] = evals[i] / F;
if (i == 0)
q[i] = p[i];
else {
q[i] = q[i - 1] + p[i];
}
}
for (int i = 0; i < 10; i++) {

double r = Math.random();
if (r <= q[0]) {
ipop[i] = ipop[0];

} else {
for (int j = 1; j < 10; j++) {
if (r < q[j]) {
ipop[i] = ipop[j];
break;
}
}
}
}
}

/**
* 交叉操作
* 交叉率為25%,平均為25%的染色體進行交叉
*/
private void cross() {
String temp1, temp2;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.25) {
double r = Math.random();
int pos = (int) (Math.round(r * 1000)) % GENE;
if (pos == 0) {
pos = 1;
}
temp1 = ipop[i].substring(0, pos)
+ ipop[(i + 1) % 10].substring(pos);
temp2 = ipop[(i + 1) % 10].substring(0, pos)
+ ipop[i].substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / 10] = temp2;
}
}
}

/**
* 基因突變操作
* 1%基因變異m*pop_size 共180個基因,為了使每個基因都有相同機會發生變異,
* 需要產生[1--180]上均勻分布的
*/
private void mutation() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * GENE * 10 + 1);
int chromosomeNum = (int) (num / GENE) + 1; // 染色體號

int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因號
if (mutationNum == 0)
mutationNum = 1;
chromosomeNum = chromosomeNum - 1;
if (chromosomeNum >= 10)
chromosomeNum = 9;
//System.out.println("變異前" + ipop[chromosomeNum]);
String temp;
if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {
if (mutationNum == 1) {
temp = "1" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "1" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
} else {
if (mutationNum == 1) {
temp = "0" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "0" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
}
ipop[chromosomeNum] = temp;
//System.out.println("變異後" + ipop[chromosomeNum]);
}
}
/**
* 執行遺傳演算法
*/
public String process() {
String str = "";
for (int i = 0; i < 10000; i++) {
this.select();
this.cross();
this.mutation();
gernation = i;
}
str = "最小值" + best.fitness + ",第" + best.generations + "個染色體";
return str;
}

}

『叄』 求基於遺傳演算法的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

此結果非常准確。

『肆』 什麼是遺傳(要詳細的資料和圖片解說)

摘要
遺傳是指經由基因的傳遞,使後代獲得親代的特徵。遺傳學是研究此一現象的學科,目前已知地球上現存的生命主要是以DNA作為遺傳物質。除了遺傳之外,決定生物特徵的因素還有環境,以及環境與遺傳的交互作用。
[編輯本段]特點
遺傳演算法是一類可用於復雜系統優化的具有魯棒性的搜索演算法,與傳統的優化演算法相比,主要有以下特點:[1]
1、 遺傳演算法以決策變數的編碼作為運算對象。傳統的優化演算法往往直接決策變數的實際植本身,而遺傳演算法處理決策變數的某種編碼形式,使得我們可以借鑒生物學中的染色體和基因的概念,可以模仿自然界生物的遺傳和進化機理,也使得我們能夠方便的應用遺傳操作運算元。
2、 遺傳演算法直接以適應度作為搜索信息,無需導數等其它輔助信息。
3、 遺傳演算法使用多個點的搜索信息,具有隱含並行性。
4、 遺傳演算法使用概率搜索技術,而非確定性規則。
[編輯本段]應用
由於遺傳演算法的整體搜索策略和優化搜索方法在計算是不依賴於梯度信息或其它輔助知識,而只需要影響搜索方向的目標函數和相應的適應度函數,所以遺傳演算法提供了一種求解復雜系統問題的通用框架,它不依賴於問題的具體領域,對問題的種類有很強的魯棒性,所以廣泛應用於許多科學,下面我們將介紹遺傳演算法的一些主要應用領域:
1、 函數優化。
函數優化是遺傳演算法的經典應用領域,也是遺傳演算法進行性能評價的常用算例,許多人構造出了各種各樣復雜形式的測試函數:連續函數和離散函數、凸函數和凹函數、低維函數和高維函數、單峰函數和多峰函數等。對於一些非線性、多模型、多目標的函數優化問題,用其它優化方法較難求解,而遺傳演算法可以方便的得到較好的結果。遺傳與生育
2、 組合優化
隨著問題規模的增大,組合優化問題的搜索空間也急劇增大,有時在目前的計算上用枚舉法很難求出最優解。對這類復雜的問題,人們已經意識到應把主要精力放在尋求滿意解上,而遺傳演算法是尋求這種滿意解的最佳工具之一。實踐證明,遺傳演算法對於組合優化中的NP問題非常有效。例如遺傳演算法已經在求解旅行商問題、 背包問題、裝箱問題、圖形劃分問題等方面得到成功的應用。
此外,GA也在生產調度問題、自動控制、機器人學、圖象處理、人工生命、遺傳編碼和機器學習等方面獲得了廣泛的運用。
[編輯本段]現狀
進入90年代,遺傳演算法迎來了興盛發展時期,無論是理論研究還是應用研究都成了十分熱門的課題。尤其是遺傳演算法的應用研究顯得格外活躍,不但它的應用領域擴大,而且利用遺傳演算法進行優化和規則學習的能力也顯著提高,同時產業應用方面的研究也在摸索之中。此外一些新的理論和方法在應用研究中亦得到了迅速的發展,這些無疑均給遺傳演算法增添了新的活力。遺傳演算法的應用研究已從初期的組合優化求解擴展到了許多更新、更工程化的應用方面。兒童孤獨症可能來自遺傳
隨著應用領域的擴展,遺傳演算法的研究出現了幾個引人注目的新動向:一是基於遺傳演算法的機器學習,這一新的研究課題把遺傳演算法從歷來離散的搜索空間的優化搜索演算法擴展到具有獨特的規則生成功能的嶄新的機器學習演算法。這一新的學習機制對於解決人工智慧中知識獲取和知識優化精煉的瓶頸難題帶來了希望。二是遺傳演算法正日益和神經網路、模糊推理以及混沌理論等其它智能計算方法相互滲透和結合,這對開拓21世紀中新的智能計算技術將具有重要的意義。三是並行處理的遺傳演算法的研究十分活躍。這一研究不僅對遺傳演算法本身的發展,而且對於新一代智能計算機體系結構的研究都是十分重要的。四是遺傳演算法和另一個稱為人工生命的嶄新研究領域正不斷滲透。所謂人工生命即是用計算機模擬自然界豐富多彩的生命現象,其中生物的自適應、進化和免疫等現象是人工生命的重要研究對象,而遺傳演算法在這方面將會發揮一定的作用,五是遺傳演算法和進化規劃(Evolution Programming,EP)以及進化策略(Evolution Strategy,ES)等進化計算理論日益結合。EP和ES幾乎是和遺傳演算法同時獨立發展起來的,同遺傳演算法一樣,它們也是模擬自然界生物進化機制的只能計算方法,即同遺傳演算法具有相同之處,也有各自的特點。目前,這三者之間的比較研究和彼此結合的探討正形成熱點。
1991年D.Whitey在他的論文中提出了基於領域交叉的交叉運算元(Adjacency based crossover),這個運算元是特別針對用序號表示基因的個體的交叉,並將其應用到了TSP問題中,通過實驗對其進行了驗證。
D.H.Ackley等提出了隨即迭代遺傳爬山法(Stochastic Iterated Genetic Hill-climbing,SIGH)採用了一種復雜的概率選舉機制,此機制中由m個「投票者」來共同決定新個體的值(m表示群體的大小)。實驗結果表明,SIGH與單點交叉、均勻交叉的神經遺傳演算法相比,所測試的六個函數中有四個表現出更好的性能,而且總體來講,SIGH比現存的許多演算法在求解速度方面更有競爭力。
H.Bersini和G.Seront將遺傳演算法與單一方法(simplex method)結合起來,形成了一種叫單一操作的多親交叉運算元(simplex crossover),該運算元在根據兩個母體以及一個額外的個體產生新個體,事實上他的交叉結果與對三個個體用選舉交叉產生的結果一致。同時,文獻還將三者交叉運算元與點交叉、均勻交叉做了比較,結果表明,三者交叉運算元比其餘兩個有更好的性能。
國內也有不少的專家和學者對遺傳演算法的交叉運算元進行改進。2002年,戴曉明等應用多種群遺傳並行進化的思想,對不同種群基於不同的遺傳策略,如變異概率,不同的變異運算元等來搜索變數空間,並利用種群間遷移運算元來進行遺傳信息交流,以解決經典遺傳演算法的收斂到局部最優值問題
2004年,趙宏立等針對簡單遺傳演算法在較大規模組合優化問題上搜索效率不高的現象,提出了一種用基因塊編碼的並行遺傳演算法(Building-block Coded Parallel GA,BCPGA)。該方法以粗粒度並行遺傳演算法為基本框架,在染色體群體中識別出可能的基因塊,然後用基因塊作為新的基因單位對染色體重新編碼,產生長度較短的染色體,在用重新編碼的染色體群體作為下一輪以相同方式演化的初始群體。
2005年,江雷等針對並行遺傳演算法求解TSP問題,探討了使用彈性策略來維持群體的多樣性,使得演算法跨過局部收斂的障礙,向全局最優解方向進化。
[編輯本段]一般演算法
遺傳演算法是模擬達爾文的遺傳選擇和自然淘汰的生物進化過程的計算模型。它的思想源於生物遺傳學和適者生存的自然規律,是具有「生存+檢測」的迭代過程的搜索演算法。遺傳演算法以一種群體中的所有個體為對象,並利用隨機化技術指導對一個被編碼的參數空間進行高效搜索。其中,選擇、交叉和變異構成了遺傳演算法的遺傳操作;參數編碼、初始群體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳演算法的核心內容。 作為一種新的全局優化搜索演算法,遺傳演算法以其簡單通用、魯棒性強、適於並行處理以及高效、實用等顯著特點,在各個領域得到了廣泛應用,取得了良好效果,並逐漸成為重要的智能演算法之一。遺傳演算法是基於生物學的,理解或編程都不太難。下面是遺傳演算法的一般演算法:
��
[編輯本段]創建一個隨機的初始狀態
��初始種群是從解中隨機選擇出來的,將這些解比喻為染色體或基因,該種群被稱為第一代,這和符號人工智慧系統的情況不一樣,在那裡問題的初始狀態已經給定了。
��評估適應度
��對每一個解(染色體)指定一個適應度的值,根據問題求解的實際接近程度來指定(以便逼近求解問題的答案)。不要把這些「解」與問題的「答案」混為一談,可以把它理解成為要得到答案,系統可能需要利用的那些特性。
��繁殖(包括子代突變)
��帶有較高適應度值的那些染色體更可能產生後代(後代產生後也將發生突變)。後代是父母的產物,他們由來自父母的基因結合而成,這個過程被稱為「雜交」。
��下一代
��如果新的一代包含一個解,能產生一個充分接近或等於期望答案的輸出,那麼問題就已經解決了。如果情況並非如此,新的一代將重復他們父母所進行的繁衍過程,一代一代演化下去,直到達到期望的解為止。
��並行計算
��非常容易將遺傳演算法用到並行計算和群集環境中。一種方法是直接把每個節點當成一個並行的種群看待。然後有機體根據不同的繁殖方法從一個節點遷移到另一個節點。另一種方法是「農場主/勞工」體系結構,指定一個節點為「農場主」節點,負責選擇有機體和分派適應度的值,另外的節點作為「勞工」節點,負責重新組合、變異和適應度函數的評估。
[編輯本段]遺傳演算法-基本框架
1 GA的流程圖
GA的流程圖如下圖所示
2 編碼
遺傳演算法不能直接處理問題空間的參數,必須把它們轉換成遺傳空間的由基因按一定結構組成的染色體或個體。這一轉換操作就叫做編碼,也可以稱作(問題的)表示(representation)。
評估編碼策略常採用以下3個規范:
a)完備性(completeness):問題空間中的所有點(候選解)都能作為GA空間中的點(染色體)表現。
b)健全性(soundness): GA空間中的染色體能對應所有問題空間中的候選解。
c)非冗餘性(nonrendancy):染色體和候選解一一對應。
目前的幾種常用的編碼技術有二進制編碼,浮點數編碼,字元編碼,變成編碼等。
而二進值編碼是目前遺傳演算法中最常用的編碼方法。即是由二進值字元集{0, 1}產生通常的0, 1字元串來表示問題空間的候選解。它具有以下特點:
a)簡單易行;
b)符合最小字元集編碼原則;
c)便於用模式定理進行分析,因為模式定理就是以基礎的。
3 適應度函數
進化論中的適應度,是表示某一個體對環境的適應能力,也表示該個體繁殖後代的能力。遺傳演算法的適應度函數也叫評價函數,是用來判斷群體中的個體的優劣程度的指標,它是根據所求問題的目標函數來進行評估的。
遺傳演算法在搜索進化過程中一般不需要其他外部信息,僅用評估函數來評估個體或解的優劣,並作為以後遺傳操作的依據。由於遺傳演算法中,適應度函數要比較排序並在此基礎上計算選擇概率,所以適應度函數的值要取正值.由此可見,在不少場合,將目標函數映射成求最大值形式且函數值非負的適應度函數是必要的。
適應度函數的設計主要滿足以下條件:
a)單值、連續、非負、最大化;
b) 合理、一致性;
c)計算量小;
d)通用性強。
在具體應用中,適應度函數的設計要結合求解問題本身的要求而定。適應度函數設計直接影響到遺傳演算法的性能。
4 初始群體的選取
遺傳演算法中初始群體中的個體是隨機產生的。一般來講,初始群體的設定可採取如下的策略:
a)根據問題固有知識,設法把握最優解所佔空間在整個問題空間中的分布范圍,然後,在此分布范圍內設定初始群體。
b)先隨機生成一定數目的個體,然後從中挑出最好的個體加到初始群體中。這種過程不斷迭代,直到初始群體中個體數達到了預先確定的規模。
[編輯本段]遺傳演算法-遺傳操作
遺傳操作是模擬生物基因遺傳的做法。在遺傳演算法中,通過編碼組成初始群體後,遺傳操作的任務就是對群體的個體按照它們對環境適應度(適應度評估)施加一定的操作,從而實現優勝劣汰的進化過程。從優化搜索的角度而言,遺傳操作可使問題的解,一代又一代地優化,並逼進最優解。
遺傳操作包括以下三個基本遺傳運算元(genetic operator):選擇(selection);交叉(crossover);變異(mutation)。這三個遺傳運算元有如下特點:
個體遺傳運算元的操作都是在隨機擾動情況下進行的。因此,群體中個體向最優解遷移的規則是隨機的。需要強調的是,這種隨機化操作和傳統的隨機搜索方法是有區別的。遺傳操作進行的高效有向的搜索而不是如一般隨機搜索方法所進行的無向搜索。
遺傳操作的效果和上述三個遺傳運算元所取的操作概率,編碼方法,群體大小,初始群體以及適應度函數的設定密切相關。
1 選擇
從群體中選擇優勝的個體,淘汰劣質個體的操作叫選擇。選擇運算元有時又稱為再生運算元(reproction operator)。選擇的目的是把優化的個體(或解)直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的,目前常用的選擇運算元有以下幾種:適應度比例方法、隨機遍歷抽樣法、局部選擇法、局部選擇法。
其中輪盤賭選擇法 (roulette wheel selection)是最簡單也是最常用的選擇方法。在該方法中,各個個體的選擇概率和其適應度值成比例。設群體大小為n,其中個體i的適應度為,則i 被選擇的概率,為
顯然,概率反映了個體i的適應度在整個群體的個體適應度總和中所佔的比例.個體適應度越大。其被選擇的概率就越高、反之亦然。計算出群體中各個個體的選擇概率後,為了選擇交配個體,需要進行多輪選擇。每一輪產生一個[0,1]之間均勻隨機數,將該隨機數作為選擇指針來確定被選個體。個體被選後,可隨機地組成交配對,以供後面的交叉操作。
2 交叉
在自然界生物進化過程中起核心作用的是生物遺傳基因的重組(加上變異)。同樣,遺傳演算法中起核心作用的是遺傳操作的交叉運算元。所謂交叉是指把兩個父代個體的部分結構加以替換重組而生成新個體的操作。通過交叉,遺傳演算法的搜索能力得以飛躍提高。
交叉運算元根據交叉率將種群中的兩個個體隨機地交換某些基因,能夠產生新的基因組合,期望將有益基因組合在一起。根據編碼表示方法的不同,可以有以下的演算法:
a)實值重組(real valued recombination)
1)離散重組(discrete recombination);
2)中間重組(intermediate recombination);
3)線性重組(linear recombination);
4)擴展線性重組(extended linear recombination)。
b)二進制交叉(binary valued crossover)
1)單點交叉(single-point crossover);
2)多點交叉(multiple-point crossover);
3)均勻交叉(uniform crossover);
4)洗牌交叉(shuffle crossover);
5)縮小代理交叉(crossover with reced surrogate)。
最常用的交叉運算元為單點交叉(one-point crossover)。具體操作是:在個體串中隨機設定一個交叉點,實行交叉時,該點前或後的兩個個體的部分結構進行互換,並生成兩個新個體。下面給出了單點交叉的一個例子:
個體A:1 0 0 1 ↑1 1 1 → 1 0 0 1 0 0 0 新個體
個體B:0 0 1 1 ↑0 0 0 → 0 0 1 1 1 1 1 新個體
3 變異
變異運算元的基本內容是對群體中的個體串的某些基因座上的基因值作變動。依據個體編碼表示方法的不同,可以有以下的演算法:
a)實值變異;
b)二進制變異。
一般來說,變異運算元操作的基本步驟如下:
a)對群中所有個體以事先設定的編譯概率判斷是否進行變異;
b)對進行變異的個體隨機選擇變異位進行變異。
遺傳演算法導引入變異的目的有兩個:一是使遺傳演算法具有局部的隨機搜索能力。當遺傳演算法通過交叉運算元已接近最優解鄰域時,利用變異運算元的這種局部隨機搜索能力可以加速向最優解收斂。顯然,此種情況下的變異概率應取較小值,否則接近最優解的積木塊會因變異而遭到破壞。二是使遺傳演算法可維持群體多樣性,以防止出現未成熟收斂現象。此時收斂概率應取較大值。
遺傳演算法中,交叉運算元因其全局搜索能力而作為主要運算元,變異運算元因其局部搜索能力而作為輔助運算元。遺傳演算法通過交叉和變異這對相互配合又相互競爭的操作而使其具備兼顧全局和局部的均衡搜索能力。所謂相互配合.是指當群體在進化中陷於搜索空間中某個超平面而僅靠交叉不能擺脫時,通過變異操作可有助於這種擺脫。所謂相互競爭,是指當通過交叉已形成所期望的積木塊時,變異操作有可能破壞這些積木塊。如何有效地配合使用交叉和變異操作,是目前遺傳演算法的一個重要研究內容。
基本變異運算元是指對群體中的個體碼串隨機挑選一個或多個基因座並對這些基因座的基因值做變動(以變異概率P.做變動),(0,1)二值碼串中的基本變異操作如下:
基因位下方標有*號的基因發生變異。
變異率的選取一般受種群大小、染色體長度等因素的影響,通常選取很小的值,一般取0.001-0.1。
終止條件
當最優個體的適應度達到給定的閥值,或者最優個體的適應度和群體適應度不再上升時,或者迭代次數達到預設的代數時,演算法終止。預設的代數一般設置為100-500代。
[編輯本段]遺傳演算法-求解演算法的特點分析
遺傳演算法作為一種快捷、簡便、容錯性強的演算法,在各類結構對象的優化過程中顯示出明顯的優勢。與傳統的搜索方法相比,遺傳演算法具有如下特點:
a)搜索過程不直接作用在變數上,而是在參數集進行了編碼的個體。此編碼操作,使得遺傳演算法可直接對結構對象(集合、序列、矩陣、樹、圖、鏈和表)進行操作。
b)搜索過程是從一組解迭代到另一組解,採用同時處理群體中多個個體的方法,降低了陷入局部最優解的可能性,並易於並行化。
c)採用概率的變遷規則來指導搜索方向,而不採用確定性搜索規則。
d)對搜索空間沒有任何特殊要求(如連通性、凸性等),只利用適應性信息,不需要導數等其它輔助信息,適應范圍更廣。
[編輯本段]術語說明
由於遺傳演算法是由進化論和遺傳學機理而產生的搜索演算法,所以在這個演算法中會用到很多生物遺傳學知識,下面是我們將會用來的一些術語說明:
一、染色體(Chronmosome)
染色體又可以叫做基因型個體(indivials),一定數量的個體組成了群體(population),群體中個體的數量叫做群體大小。
二、基因(Gene)
基因是串中的元素,基因用於表示個體的特徵。例如有一個串S=1011,則其中的1,0,1,1這4個元素分別稱為基因。它們的值稱為等位基因(Alletes)。
三、基因地點(Locus)
基因地點在演算法中表示一個基因在串中的位置稱為基因位置(Gene Position),有時也簡稱基因位。基因位置由串的左向右計算,例如在串 S=1101 中,0的基因位置是3。
四、基因特徵值(Gene Feature)
在用串表示整數時,基因的特徵值與二進制數的權一致;例如在串 S=1011 中,基因位置3中的1,它的基因特徵值為2;基因位置1中的1,它的基因特徵值為8。
五、適應度(Fitness)
各個個體對環境的適應程度叫做適應度(fitness)。為了體現染色體的適應能力,引入了對問題中的每一個染色體都能進行度量的函數,叫適應度函數. 這個函數是計算個體在群體中被使用的概率。
[編輯本段]參考資料
1.《計算機教育》第10期 作者:王利
2.遺傳演算法——理論、應用與軟體實現 王小平、曹立明著
3.同濟大學計算機系 王小平編寫的程序代碼

參考資料
1. 中新網:英13歲少女患家族遺傳怪病 滿臉皺紋像老人,2010年01月27日

http://www.chinanews.com.cn/gj/gj-ywdd2/news/2010/01-27/2094204.shtml

『伍』 利用遺傳演算法求解區間[0, 31]上的二次函數y=x 2次方 的最大值

靠 你也太懶了

『陸』 遺傳演算法流程圖

首先你的這個問題沒有什麼意義,明顯x=31的時候y最大嘛。。。

%定義遺傳演算法參數
NIND=40; %個體數目(Number of indivials)
MAXGEN=25; %最大遺傳代數(Maximum number of generations)
PRECI=20; %變數的二進制位數(Precision of variables)
GGAP=0.9; %代溝(Generation gap)
trace=zeros(2, MAXGEN); %尋優結果的初始值
FieldD=[20;0;31;1;0;1;1]; %區域描述器(Build field descriptor)
Chrom=crtbp(NIND, PRECI); %初始種群
gen=0; %代計數器
variable=bs2rv(Chrom, FieldD); %計算初始種群的十進制轉換
ObjV=variable.*variable; %計算目標函數值
while gen<MAXGEN
FitnV=ranking(-ObjV); %分配適應度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %選擇
SelCh=recombin('xovsp', SelCh, 0.7); %重組
SelCh=mut(SelCh); %變異
variable=bs2rv(SelCh, FieldD); %子代個體的十進制轉換
ObjVSel=variable.*variable; %計運算元代的目標函數值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新種群
variable=bs2rv(Chrom, FieldD);
gen=gen+1; %代計數器增加
%輸出最優解及其序號,並在目標函數圖像中標出,Y為最優解,I為種群的序號
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, 'bo');
trace(1, gen)=max(ObjV); %遺傳演算法性能跟蹤
trace(2, gen)=sum(ObjV)/length(ObjV);
end
variable=bs2rv(Chrom, FieldD); %最優個體的十進制轉換
hold on, grid;
plot(variable,ObjV,'b*');
figure(2);
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid
legend('解的變化','種群均值的變化')

上面是這個問題的MATLAB程序,你自己研究一下吧
運行的時候需要MATLAB遺傳演算法工具箱

『柒』 如何利用遺傳演算法求解問題試舉例說明求解過程急急急!!!

遺傳演算法將目標函數轉換為適應度函數,評估,復制,交叉,變異種群中的個體,並從中選出適應性最強的個體,演算法的最優解就是這個個體。具體流程是:1.初始種群的產生。2.適應度函數的構造。3.選擇和繁殖。4.終止條件。

『捌』 關於遺傳演算法

遺傳演算法(Genetic Algorithm,簡稱GA)是美國 Michigan大學的 John Golland提出的一種建立在自然選擇和群體遺傳學機理基礎上的隨機、迭代、進化、具有廣泛適用性的搜索方法。現在已被廣泛用於學習、優化、自適應等問題中。圖4-1 給出了 GA搜索過程的直觀描述。圖中曲線對應一個具有復雜搜索空間(多峰空間)的問題。縱坐標表示適應度函數(目標函數),其值越大相應的解越優。橫坐標表示搜索點。顯然,用解析方法求解該目標函數是困難的。採用 GA時,首先隨機挑選若干個搜索點,然後分別從這些搜索點開始並行搜索。在搜索過程中,僅靠適應度來反復指導和執行 GA 搜索。在經過若干代的進化後,搜索點後都具有較高的適應度並接近最優解。

一個簡單GA由復制、雜交和變異三個遺傳運算元組成:

圖4-2 常規遺傳演算法流程圖

『玖』 螞蟻演算法的思想進化公式及遺傳演算法的演算法流程圖

遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法,它最初由美國Michigan大學J.Holland教授於1975年首先提出來的,並出版了頗有影響的專著《Adaptation in Natural and Artificial Systems》,GA這個名稱才逐漸為人所知,J.Holland教授所提出的GA通常為簡單遺傳演算法(SGA)。

『拾』 進化演算法的基本步驟

進化計算是基於自然選擇和自然遺傳等生物進化機制的一種搜索演算法。與普通的搜索方法一樣,進化計算也是一種迭代演算法,不同的是進化計算在最優解的搜索過程中,一般是從原問題的一組解出發改進到另一組較好的解,再從這組改進的解出發進一步改進。而且在進化問題中,要求當原問題的優化模型建立後,還必須對原問題的解進行編碼。進化計算在搜索過程中利用結構化和隨機性的信息,使最滿足目標的決策獲得最大的生存可能,是一種概率型的演算法。
一般來說,進化計算的求解包括以下幾個步驟:給定一組初始解;評價當前這組解的性能;從當前這組解中選擇一定數量的解作為迭代後的解的基礎;再對其進行操作,得到迭代後的解;若這些解滿足要求則停止,否則將這些迭代得到的解作為當前解重新操作。
以遺傳演算法為例,其工作步驟可概括為:
(1) 對工作對象——字元串用二進制的0/1或其它進制字元編碼 。
(2) 根據字元串的長度L,隨即產生L個字元組成初始個體。
(3) 計算適應度。適應度是衡量個體優劣的標志,通常是所研究問題的目標函數。
(4) 通過復制,將優良個體插入下一代新群體中,體現「優勝劣汰」的原則。
(5) 交換字元,產生新個體。交換點的位置是隨機決定的
(6) 對某個字元進行補運算,將字元1變為0,或將0變為1,這是產生新個體的另一種方法,突變字元的位置也是隨機決定的。
(7) 遺傳演算法是一個反復迭代的過程,每次迭代期間,要執行適應度計算、復制、交換、突變等操作,直至滿足終止條件。
將其用形式化語言表達,則為:假設α∈I記為個體,I記為個體空間。適應度函數記為Φ:I→R。在第t代,群體P(t)={a1(t),a2(t),…,an(t)}經過復制r(reproction)、交換c(crossover)及突變m(mutation)轉換成下一代群體。這里r、c、m均指宏運算元,把舊群體變換為新群體。L:I→{True, Flase}記為終止准則。利用上述符號,遺傳演算法可描述為:
t=0
initialize P(0):={ a1(0),a2(0),…,an(0)};
while(l(P(t))≠True) do
evaluate P(t):{ Φ(a1(t)), Φ(a2(t)),…,Φ(an(t))};
reproction: P′(t):=r(P(t));
crossover: P″(t):=c(P′(t));
mutation: P(t+1):= m(P″(t));
t=t+1;
end

閱讀全文

與遺傳演算法流程圖相關的資料

熱點內容
微贊微擎源碼最新版 瀏覽:851
有什麼下載軟體的app推薦 瀏覽:104
雲浮數據加密有哪些 瀏覽:166
工地招聘會都有什麼app 瀏覽:478
電信運營商的伺服器叫什麼 瀏覽:372
安卓騰訊收藏文件夾 瀏覽:921
讀取文件的行數python 瀏覽:751
非所稱加密方法的優點是 瀏覽:355
文件夾一般被什麼佔用 瀏覽:73
他們的命令英語 瀏覽:811
文件夾如何打開默認最大化 瀏覽:313
怎麼測試阿里雲伺服器網路 瀏覽:927
自己的點腦的伺服器地址 瀏覽:605
大二學演算法還有 瀏覽:231
linux解壓命令war 瀏覽:718
mov壓縮mac 瀏覽:239
怎麼做點歌伺服器 瀏覽:501
java混淆編譯 瀏覽:380
李剛瘋狂java講義 瀏覽:688
易語言記錄鍵盤的命令 瀏覽:787