當前位置:首頁 » 操作系統 » 自適應遺傳演算法代碼

自適應遺傳演算法代碼

發布時間: 2022-05-14 19:34:03

1. 關於自適應遺傳演算法的交叉操作

不是隨機選擇的,是有規律的選,一般是等間隔選擇,例如兩個相鄰的個體。

如圖紅色是一種選擇方式:1&2, 3&4, 5&6, 7&8, 9&10

藍色也是一種選擇方式:1&6, 2&7, 3&8, 4&9, 5&10

當然,也要盡量避免相同個體交叉。

2. 染色體個數的多少對遺傳演算法優化的結果是否有影響

自適應遺傳演算法

上迴文說到基於誤差梯度下降的BP網路演算法容易陷入局部極小,通常的改進方法先使用遺傳演算法生成比較好的權重值,再交給神經網路訓練。

遺傳演算法隨著進化的進行,其選擇率、交叉運算元、變異率應該是動態改變的。

編碼方式

在使用BP網路進行文本分類時,大都是採用實數編碼,把權值設為[0,1]上的實數,這是因為要使用權值調整公式要求權值是實數。但是在使用遺傳演算法優化這些權值時,完全可以把它們編碼為整數。比如設為[1,64]上的整數,一個權值只有64種選擇,而[0,1]上的實數有無窮多個,這樣既可以縮小搜尋的范圍,同時也加大了搜尋的步長。畢竟BP網路中很多個極小點,使用遺傳的目的只是在全局找個一個比較優的解,進一步的精確尋優交給BP神經網路來做。

選擇運算元

在進化初期我們應該使用較小的選擇壓力,以鼓勵種群向著多樣化發展;在進化後期個體差異不大,適應度都很高,這時應增大選擇壓力以刺激進化速度。可以使用模擬退火(SA,simulated annealing)來決定選擇率,即我們以一定的概率來接收不好的個體:

這是模擬退火的原始表達式,意思是說在金屬退火的過程中,其能量在降低(<0),我們以的概率接收本次變化,顯然當溫度T越低時,接收概率越大,溫度T越高時,接收概率越小,k是常數。對應到遺傳演算法,就是當種群平均適應值越低時,接收劣等個體的概率越高,當種群平均適應值越高時,接收劣等個體的概率越小。

另外M.Srinivas提出當群體適應度比較集中時,使交叉概率增大;當群體適應度比較分散時,使交叉概率減小。種群適應度分散與否通過最大、最小和平均適應度來衡量。

選擇運算元是保證遺傳演算法能找到近優解的唯一手段,當染色體唯度很高時,遺傳演算法很難找到較好的解。這是因為最開始生成的初始種群適應度都極其的低,個體之間(適應度)差異不大,如果使用錦標賽選擇法則跟隨機選擇無異,即使使用賭輪法選擇到最優個體的概率會大增加,但是最優個體也不比最劣個體好到哪兒去,最優個體也不含有優良的基因片段。所以對於高維數據,在進化初期主要靠交叉進行全局搜索來搜尋較優的個體。

交叉運算元

交叉實際上就是在進行全局搜索,所以遺傳演算法不過是窮舉演算法的一個變種。在進化初期,種群多樣性高,採用單點交叉就可以獲得較廣的搜索空間;在進化後期,個體差異不大,需要採用多點交叉,或者有人採用變異交叉點的方法。

當發現種群的適應度操持不變時,可能已經進入了局部最優,應該變異交叉點,大步跨出當前的小山峰。

由於要保留精英個體,所以交叉要以一定的概率進行。隨著進化的進行,交叉率應逐漸降低趨於某個值,以避免演算法不收斂。

變異運算元

直觀上對好的個體應施以較小的變異率,對劣等個體應施以較大的變異率。

當發現種群的適應度在降低時應增大變異率。

另外M.Srinivas提出當群體適應度比較集中時,使變異概率增大;當群體適應度比較分散時,使變異概率減小。種群適應度分散與否通過最大、最小和平均適應度來衡量。

下面的代碼是用遺傳演算法來為BP網路尋找比較好的初始解。但是遺傳演算法根本就沒有起到作用,因為我的神經網路輸入層1000個節點,隱藏層20個節點,這就2萬個權值了,也就是說染色體的長度在2萬維以上,用遺傳演算法根本就找不到較優解,它始終是在隨機地遍歷,一點兒沒有想「進化」的意思。

3. 大家好,請問誰有基於matlab的遺傳演算法源代碼,很需要呀

function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
%--------------------------------------------------------------------------
% JSPGA.m
% 車間作業調度問題遺傳演算法
%--------------------------------------------------------------------------
% 輸入參數列表
% M 遺傳進化迭代次數
% N 種群規模(取偶數)
% Pm 變異概率
% T m×n的矩陣,存儲m個工件n個工序的加工時間
% P 1×n的向量,n個工序中,每一個工序所具有的機床數目
% 輸出參數列表
% Zp 最優的Makespan值
% Y1p 最優方案中,各工件各工序的開始時刻,可根據它繪出甘特圖
% Y2p 最優方案中,各工件各工序的結束時刻,可根據它繪出甘特圖
% Y3p 最優方案中,各工件各工序使用的機器編號
% Xp 最優決策變數的值,決策變數是一個實數編碼的m×n矩陣
% LC1 收斂曲線1,各代最優個體適應值的記錄
% LC2 收斂曲線2,各代群體平均適應值的記錄
% 最後,程序還將繪出三副圖片:兩條收斂曲線圖和甘特圖(各工件的調度時序圖)

%第一步:變數初始化
[m,n]=size(T);%m是總工件數,n是總工序數
Xp=zeros(m,n);%最優決策變數
LC1=zeros(1,M);%收斂曲線1
LC2=zeros(1,N);%收斂曲線2

%第二步:隨機產生初始種群
farm=cell(1,N);%採用細胞結構存儲種群
for k=1:N
X=zeros(m,n);
for j=1:n
for i=1:m
X(i,j)=1+(P(j)-eps)*rand;
end
end
farm=X;
end

counter=0;%設置迭代計數器
while counter

%第三步:交叉
newfarm=cell(1,N);%交叉產生的新種群存在其中
Ser=randperm(N);
for i=1:2:(N-1)
A=farm;%父代個體
B=farm;
Manner=unidrnd(2);%隨機選擇交叉方式
if Manner==1
cp=unidrnd(m-1);%隨機選擇交叉點
%雙親雙子單點交叉
a=[A(1:cp,:);B((cp+1):m,:)];%子代個體
b=[B(1:cp,:);A((cp+1):m,:)];
else
cp=unidrnd(n-1);%隨機選擇交叉點
a=[A(:,1:cp),B(:,(cp+1):n)];%雙親雙子單點交叉
b=[B(:,1:cp),A(:,(cp+1):n)];
end
newfarm=a;%交叉後的子代存入newfarm
newfarm=b;
end
%新舊種群合並
FARM=[farm,newfarm];

%第四步:選擇復制
FITNESS=zeros(1,2*N);
fitness=zeros(1,N);
plotif=0;
for i=1:(2*N)
X=FARM;
Z=COST(X,T,P,plotif);%調用計算費用的子函數
FITNESS(i)=Z;
end
%選擇復制採取兩兩隨機配對競爭的方式,具有保留最優個體的能力
Ser=randperm(2*N);
for i=1:N
f1=FITNESS(Ser(2*i-1));
f2=FITNESS(Ser(2*i));
if f1<=f2
farm=FARM;
fitness(i)=FITNESS(Ser(2*i-1));
else
farm=FARM;
fitness(i)=FITNESS(Ser(2*i));
end
end
%記錄最佳個體和收斂曲線
minfitness=min(fitness)
meanfitness=mean(fitness)
LC1(counter+1)=minfitness;%收斂曲線1,各代最優個體適應值的記錄
LC2(counter+1)=meanfitness;%收斂曲線2,各代群體平均適應值的記錄
pos=find(fitness==minfitness);
Xp=farm;

%第五步:變異
for i=1:N
if Pm>rand;%變異概率為Pm
X=farm;
I=unidrnd(m);
J=unidrnd(n);
X(I,J)=1+(P(J)-eps)*rand;
farm=X;
end
end
farm=Xp;

counter=counter+1
end

%輸出結果並繪圖
figure(1);
plotif=1;
X=Xp;
[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);
figure(2);
plot(LC1);
figure(3);
plot(LC2);

4. 求遺傳演算法(GA)C語言代碼

.----來個例子,大家好理解..--
基於遺傳演算法的人工生命模擬
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
#include<time.h>
#include<string.h>
#include "graph.c"
/* 宏定義 */
#define TL1 20 /* 植物性食物限制時間 */
#define TL2 5 /* 動物性食物限制時間 */
#define NEWFOODS 3 /* 植物性食物每代生成數目 */
#define MUTATION 0.05 /* 變異概率 */
#define G_LENGTH 32 /* 個體染色體長度 */
#define MAX_POP 100 /* 個體總數的最大值 */
#define MAX_FOOD 100 /* 食物總數的最大值 */
#define MAX_WX 60 /* 虛擬環境的長度最大值 */
#define MAX_WY 32 /* 虛擬環境的寬度最大值 */
#define SX1 330 /* 虛擬環境圖左上角點x坐標 */
#define SY1 40 /* 虛擬環境圖左上角點y坐標 */
#define GX 360 /* 個體數進化圖形窗口的左上角點X坐標 */
#define GY 257 /* 個體數進化圖形窗口的左上角點Y坐標 */
#define GXR 250 /* 個體數進化圖形窗口的長度 */
#define GYR 100 /* 個體數進化圖形窗口的寬度 */
#define GSTEP 2 /* 個體數進化圖形窗口的X方向步長 */
#define R_LIFE 0.05 /* 初期產生生物數的環境比率 */
#define R_FOOD 0.02 /* 初期產生食物數的環境比率 */
#define SL_MIN 10 /* 個體壽命最小值 */
/* 全局變數 */
unsigned char gene[MAX_POP][G_LENGTH]; /* 遺傳基因 */
unsigned char iflg[MAX_POP]; /* 個體死活狀態標志變數 */

5. TSP遺傳演算法的求問!!!!

知道每個城市間距離就可以了,先把40乘40的距離矩陣列到excel裡面,然後套入經典的遺傳演算法代碼中運行就可以了。 軟體中的Lingo有經典的tsp代碼,下載破解版的lingo,然後運行就可以了。那個經典代碼只能解決小規模的tsp,大規模的tsp需要用智能演算法。100個城市只需要2分鍾。40個只要幾秒。 你可以到網上搜代碼。

6. 自適應遺傳演算法優化svr的代碼怎麼寫

都是有兩種調用方法,一種圖形界面的,這個從開始菜單

7. 遺傳演算法具體應用

1、函數優化

函數優化是遺傳演算法的經典應用領域,也是遺傳演算法進行性能評價的常用算例,許多人構造出了各種各樣復雜形式的測試函數:連續函數和離散函數、凸函數和凹函數、低維函數和高維函數、單峰函數和多峰函數等。

2、組合優化

隨著問題規模的增大,組合優化問題的搜索空間也急劇增大,有時在目前的計算上用枚舉法很難求出最優解。對這類復雜的問題,人們已經意識到應把主要精力放在尋求滿意解上,而遺傳演算法是尋求這種滿意解的最佳工具之一。

此外,GA也在生產調度問題、自動控制、機器人學、圖象處理、人工生命、遺傳編碼和機器學習等方面獲得了廣泛的運用。

3、車間調度

車間調度問題是一個典型的NP-Hard問題,遺傳演算法作為一種經典的智能演算法廣泛用於車間調度中,很多學者都致力於用遺傳演算法解決車間調度問題,現今也取得了十分豐碩的成果。

從最初的傳統車間調度(JSP)問題到柔性作業車間調度問題(FJSP),遺傳演算法都有優異的表現,在很多算例中都得到了最優或近優解。


(7)自適應遺傳演算法代碼擴展閱讀:

遺傳演算法的缺點

1、編碼不規范及編碼存在表示的不準確性。

2、單一的遺傳演算法編碼不能全面地將優化問題的約束表示出來。考慮約束的一個方法就是對不可行解採用閾值,這樣,計算的時間必然增加。

3、遺傳演算法通常的效率比其他傳統的優化方法低。

4、遺傳演算法容易過早收斂。

5、遺傳演算法對演算法的精度、可行度、計算復雜性等方面,還沒有有效的定量分析方法。

8. 求基於遺傳演算法的IEEE

遺傳演算法 ( GA , Genetic Algorithm ) ,也稱進化演算法 。 遺傳演算法是受達爾文的進化論的啟發,借鑒生物進化過程而提出的一種啟發式搜索演算法。因此在介紹遺傳演算法前有必要簡單的介紹生物進化知識。

一.進化論知識

作為遺傳演算法生物背景的介紹,下面內容了解即可:

種群(Population):生物的進化以群體的形式進行,這樣的一個群體稱為種群。

個體:組成種群的單個生物。

基因 ( Gene ) :一個遺傳因子。

染色體 ( Chromosome ) :包含一組的基因。

生存競爭,適者生存:對環境適應度高的、牛B的個體參與繁殖的機會比較多,後代就會越來越多。適應度低的個體參與繁殖的機會比較少,後代就會越來越少。

遺傳與變異:新個體會遺傳父母雙方各一部分的基因,同時有一定的概率發生基因變異。

簡單說來就是:繁殖過程,會發生基因交叉( Crossover ) ,基因突變 ( Mutation ) ,適應度( Fitness )低的個體會被逐步淘汰,而適應度高的個體會越來越多。那麼經過N代的自然選擇後,保存下來的個體都是適應度很高的,其中很可能包含史上產生的適應度最高的那個個體。

二.遺傳演算法思想

借鑒生物進化論,遺傳演算法將要解決的問題模擬成一個生物進化的過程,通過復制、交叉、突變等操作產生下一代的解,並逐步淘汰掉適應度函數值低的解,增加適應度函數值高的解。這樣進化N代後就很有可能會進化出適應度函數值很高的個體。

舉個例子,使用遺傳演算法解決「0-1背包問題」的思路:0-1背包的解可以編碼為一串0-1字元串(0:不取,1:取) ;首先,隨機產生M個0-1字元串,然後評價這些0-1字元串作為0-1背包問題的解的優劣;然後,隨機選擇一些字元串通過交叉、突變等操作產生下一代的M個字元串,而且較優的解被選中的概率要比較高。這樣經過G代的進化後就可能會產生出0-1背包問題的一個「近似最優解」。

編碼:需要將問題的解編碼成字元串的形式才能使用遺傳演算法。最簡單的一種編碼方式是二進制編碼,即將問題的解編碼成二進制位數組的形式。例如,問題的解是整數,那麼可以將其編碼成二進制位數組的形式。將0-1字元串作為0-1背包問題的解就屬於二進制編碼。

遺傳演算法有3個最基本的操作:選擇,交叉,變異。

選擇:選擇一些染色體來產生下一代。一種常用的選擇策略是 「比例選擇」,也就是個體被選中的概率與其適應度函數值成正比。假設群體的個體總數是M,那麼那麼一個體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例選擇實現演算法就是所謂的「輪盤賭演算法」( Roulette Wheel Selection ) ,輪盤賭演算法的一個簡單的實現如下:

輪盤賭演算法
/*
* 按設定的概率,隨機選中一個個體
* P[i]表示第i個個體被選中的概率
*/
int RWS()
{
m = 0;
r =Random(0,1); //r為0至1的隨機數
for(i=1;i<=N; i++)
{
/* 產生的隨機數在m~m+P[i]間則認為選中了i
* 因此i被選中的概率是P[i]
*/
m = m + P[i];
if(r<=m) return i;
}
}

交叉(Crossover):2條染色體交換部分基因,來構造下一代的2條新的染色體。例如:

交叉前:

00000|011100000000|10000

11100|000001111110|00101

交叉後:

00000|000001111110|10000

11100|011100000000|00101

染色體交叉是以一定的概率發生的,這個概率記為Pc 。

變異(Mutation):在繁殖過程,新產生的染色體中的基因會以一定的概率出錯,稱為變異。變異發生的概率記為Pm 。例如:

變異前:

000001110000000010000

變異後:

000001110000100010000

適應度函數 ( Fitness Function ):用於評價某個染色體的適應度,用f(x)表示。有時需要區分染色體的適應度函數與問題的目標函數。例如:0-1背包問題的目標函數是所取得物品價值,但將物品價值作為染色體的適應度函數可能並不一定適合。適應度函數與目標函數是正相關的,可對目標函數作一些變形來得到適應度函數。

三.基本遺傳演算法的偽代碼

基本遺傳演算法偽代碼
/*
* Pc:交叉發生的概率
* Pm:變異發生的概率
* M:種群規模
* G:終止進化的代數
* Tf:進化產生的任何一個個體的適應度函數超過Tf,則可以終止進化過程
*/
初始化Pm,Pc,M,G,Tf等參數。隨機產生第一代種群Pop

do
{
計算種群Pop中每一個體的適應度F(i)。
初始化空種群newPop
do
{
根據適應度以比例選擇演算法從種群Pop中選出2個個體
if ( random ( 0 , 1 ) < Pc )
{
對2個個體按交叉概率Pc執行交叉操作
}
if ( random ( 0 , 1 ) < Pm )
{
對2個個體按變異概率Pm執行變異操作
}
將2個新個體加入種群newPop中
} until ( M個子代被創建 )
用newPop取代Pop
}until ( 任何染色體得分超過Tf, 或繁殖代數超過G )

四.基本遺傳演算法優化

下面的方法可優化遺傳演算法的性能。

精英主義(Elitist Strategy)選擇:是基本遺傳演算法的一種優化。為了防止進化過程中產生的最優解被交叉和變異所破壞,可以將每一代中的最優解原封不動的復制到下一代中。

插入操作:可在3個基本操作的基礎上增加一個插入操作。插入操作將染色體中的某個隨機的片段移位到另一個隨機的位置。

五. 使用AForge.Genetic解決TSP問題

AForge.NET是一個C#實現的面向人工智慧、計算機視覺等領域的開源架構。AForge.NET中包含有一個遺傳演算法的類庫。

AForge.NET主頁:http://www.aforgenet.com/

AForge.NET代碼下載:http://code.google.com/p/aforge/

介紹一下AForge的遺傳演算法用法吧。AForge.Genetic的類結構如下:

圖1. AForge.Genetic的類圖

下面用AForge.Genetic寫個解決TSP問題的最簡單實例。測試數據集採用網上流傳的中國31個省會城市的坐標:

1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975

操作過程:

(1) 下載AForge.NET類庫,網址:http://code.google.com/p/aforge/downloads/list

(2) 創建C#空項目GenticTSP。然後在AForge目錄下找到AForge.dll和AForge.Genetic.dll,將其拷貝到TestTSP項目的bin/Debug目錄下。再通過「Add Reference...」將這兩個DLL添加到工程。

(3) 將31個城市坐標數據保存為bin/Debug/Data.txt 。

(4) 添加TSPFitnessFunction.cs,加入如下代碼:

TSPFitnessFunction類
using System;
using AForge.Genetic;

namespace GenticTSP
{
/// <summary>
/// Fitness function for TSP task (Travaling Salasman Problem)
/// </summary>
public class TSPFitnessFunction : IFitnessFunction
{
// map
private int[,] map = null;

// Constructor
public TSPFitnessFunction(int[,] map)
{
this.map = map;
}

/// <summary>
/// Evaluate chromosome - calculates its fitness value
/// </summary>
public double Evaluate(IChromosome chromosome)
{
return 1 / (PathLength(chromosome) + 1);
}

/// <summary>
/// Translate genotype to phenotype
/// </summary>
public object Translate(IChromosome chromosome)
{
return chromosome.ToString();
}

/// <summary>
/// Calculate path length represented by the specified chromosome
/// </summary>
public double PathLength(IChromosome chromosome)
{
// salesman path
ushort[] path = ((PermutationChromosome)chromosome).Value;

// check path size
if (path.Length != map.GetLength(0))
{
throw new ArgumentException("Invalid path specified - not all cities are visited");
}

// path length
int prev = path[0];
int curr = path[path.Length - 1];

// calculate distance between the last and the first city
double dx = map[curr, 0] - map[prev, 0];
double dy = map[curr, 1] - map[prev, 1];
double pathLength = Math.Sqrt(dx * dx + dy * dy);

// calculate the path length from the first city to the last
for (int i = 1, n = path.Length; i < n; i++)
{
// get current city
curr = path[i];

// calculate distance
dx = map[curr, 0] - map[prev, 0];
dy = map[curr, 1] - map[prev, 1];
pathLength += Math.Sqrt(dx * dx + dy * dy);

// put current city as previous
prev = curr;
}

return pathLength;
}
}
}

(5) 添加GenticTSP.cs,加入如下代碼:

GenticTSP類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

using AForge;
using AForge.Genetic;

namespace GenticTSP
{
class GenticTSP
{

static void Main()
{
StreamReader reader = new StreamReader("Data.txt");

int citiesCount = 31; //城市數

int[,] map = new int[citiesCount, 2];

for (int i = 0; i < citiesCount; i++)
{
string value = reader.ReadLine();
string[] temp = value.Split(' ');
map[i, 0] = int.Parse(temp[0]); //讀取城市坐標
map[i, 1] = int.Parse(temp[1]);
}

// create fitness function
TSPFitnessFunction fitnessFunction = new TSPFitnessFunction(map);

int populationSize = 1000; //種群最大規模

/*
* 0:EliteSelection演算法
* 1:RankSelection演算法
* 其他:RouletteWheelSelection 演算法
* */
int selectionMethod = 0;

// create population
Population population = new Population(populationSize,
new PermutationChromosome(citiesCount),
fitnessFunction,
(selectionMethod == 0) ? (ISelectionMethod)new EliteSelection() :
(selectionMethod == 1) ? (ISelectionMethod)new RankSelection() :
(ISelectionMethod)new RouletteWheelSelection()
);

// iterations
int iter = 1;
int iterations = 5000; //迭代最大周期

// loop
while (iter < iterations)
{
// run one epoch of genetic algorithm
population.RunEpoch();

// increase current iteration
iter++;
}

System.Console.WriteLine("遍歷路徑是: {0}", ((PermutationChromosome)population.BestChromosome).ToString());
System.Console.WriteLine("總路程是:{0}", fitnessFunction.PathLength(population.BestChromosome));
System.Console.Read();

}
}
}

網上據稱這組TSP數據的最好的結果是 15404 ,上面的程序我剛才試了幾次最好一次算出了15402.341,但是最差的時候也跑出了大於16000的結果。

我這還有一個版本,設置種群規模為1000,迭代5000次可以算出15408.508這個結果。源代碼在文章最後可以下載。

總結一下使用AForge.Genetic解決問題的一般步驟:

(1) 定義適應函數類,需要實現IFitnessFunction介面

(2) 選定種群規模、使用的選擇演算法、染色體種類等參數,創建種群population

(3)設定迭代的最大次數,使用RunEpoch開始計算

9. 求自適應遺傳演算法的MATLAB代碼 要謝菲爾德遺傳演算法工具箱的

都是有兩種調用方法,一種圖形界面的,這個從開始菜單,然後工具,然後從裡面找神經網路neuralnetwork,遺傳演算法工具是全局優化工具箱裡面的,globaloptimization。 另外一種通過命令行調用,這個需要你理解你都要做...

10. 遺傳演算法的matlab代碼實現是什麼

遺傳演算法我懂,我的論文就是用著這個演算法,具體到你要遺傳演算法是做什麼?優化什麼的。。。我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化BP神經網路函數極值尋優:
%% 該代碼為基於神經網路遺傳演算法的系統極值尋優
%% 清空環境變數
clc
clear

%% 初始化遺傳演算法參數
%初始化參數
maxgen=100; %進化代數,即迭代次數
sizepop=20; %種群規模
pcross=[0.4]; %交叉概率選擇,0和1之間
pmutation=[0.2]; %變異概率選擇,0和1之間

lenchrom=[1 1]; %每個變數的字串長度,如果是浮點變數,則長度都為1
bound=[-5 5;-5 5]; %數據范圍

indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個結構體
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體

%% 初始化種群計算適應度值
% 初始化種群
for i=1:sizepop
%隨機產生一個種群
indivials.chrom(i,:)=Code(lenchrom,bound);
x=indivials.chrom(i,:);
%計算適應度
indivials.fitness(i)=fun(x); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];

%% 迭代尋優
% 進化開始
for i=1:maxgen
i
% 選擇
indivials=Select(indivials,sizepop);
avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 變異
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,[i maxgen],bound);

% 計算適應度
for j=1:sizepop
x=indivials.chrom(j,:); %解碼
indivials.fitness(j)=fun(x);
end

%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次進化中最好的染色體
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;

avgfitness=sum(indivials.fitness)/sizepop;

trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%進化結束

%% 結果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('適應度曲線','fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);
axis([0,100,0,1])
disp('適應度 變數');
x=bestchrom;
% 窗口顯示
disp([bestfitness x]);

熱點內容
個人加密 發布:2024-04-26 03:01:23 瀏覽:519
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:303
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:867
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91
您的個人文件夾 發布:2024-04-26 00:03:12 瀏覽:68
睿雲伺服器功能介紹 發布:2024-04-25 23:59:51 瀏覽:571
標致5008怎麼連接安卓 發布:2024-04-25 23:25:08 瀏覽:794