?? geneticalgorithm.txt
字號:
f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2的
/***************************************************************/
* Simple Genetic Algorithm
* 2002/7/18
*
* 對于整體過程的說明
* main
* GenerateInitialPopulation //產生初始子代,本程序產生0,1 序列
* EvalutePopulation
* |
* |--------CalculateObjectValue //計算目標函數值
* |
* |--------CalculateFitnessValue //計算適應度
* |
* |--------FindBestAndWorstIndividual //計算最好與最差個體
*
* 以下循環到GENERATION代
* GenerateNextPopulation
* |
* |--------SelectOperator //選擇操作
* |
* |--------CalculateFitnessValue //單點交叉
* |
* |--------FindBestAndWorstIndividual //變異操作
*
* EvalutePopulation //該函數同上
* .......
* .......
* .......
* PerformEvolution //遺傳
* OutputTextReport //輸出報告
* 循環結束
****************************************************************
{$N+} //打開8087,因為使用double
program SGA_pascal; //Simple Genetic Algorithm
const
PopSize=160; //Simple Genetic Algorithm
MAXIMIZATION=1; //最大標志
MINIZATION=2; //最小標志
Cmax=100;
Cmin=0;
LENGTH1=10; //第一個變量的遺傳變量的長度
LENGTH2=10; //第二個變量的遺傳變量的長度
CHROMLENGTH=LENGTH1+LENGTH2; //變量總長度
MaxGeneration=400; //最大遺傳代數
Pc=0.6; //交叉概率
Pm=0.001; //變異概率
type
individual =record //個體結構
chrom:array[1..CHROMLENGTH] of char;
value:double;
fitness:double;
end;
var
generation :integer;
best_index :integer; //記錄最優秀個體
worst_index :integer; //記錄最劣質個體
bestindividual :individual; //當前代最優秀個體
worstindividual :individual; //當前代最差個體
currentbest :individual; //現在得到的最優秀個體
population :array[1..PopSize] of individual;
//種群空間
functionmode :integer; //最優化類型
procedure init; //初始化
procedure generateinitpopulation; //生成最先一代
var i,j:integer;
begin
randomize;
for i:=1 to PopSize do //種群大小
for j:=1 to CHROMLENGTH do //基因長度
if random(10)<5
then population[i].chrom[j]:='0' //以相同概率產生'0','1'
else population[i].chrom[j]:='1';
functionMode:=MAXIMIZATION; //最優化類型
end;
begin
generateinitpopulation;
end; {end of init}
procedure main;
procedure EvaluatePopulation;
function DecodeChromosome(s:string;strstart,strend:integer):longint;
//基因解碼過程,對于本程序,是將2進制基因轉化成10進制數值
var
decimal :longint;
temp :longint;
i :integer;
begin
decimal:=0;
temp:=1; //以左到右,權值升高
for i:=strstart to strend do
begin
if copy(s,i,1)='1' then decimal:=decimal+temp; //轉化到十進制
temp:=temp*2;
end;
decodechromosome:=decimal;
end;
procedure calculateobjectvalue;
//計算目標函數值,本程序目前計算為f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2
var
i:integer;
temp1,temp2:longint;
x1,x2:double;
begin
for i:=1 to PopSize do
begin
temp1:=DecodeChromosome(population[i].chrom,1,LENGTH1);
//分別對兩個基因解碼
temp2:=DecodeChromosome(population[i].chrom,LENGTH1+1,LENGTH1+LENGTH2);
x1:=4.096*temp1/1023.0-2.048;
//從這里可以看出,本程序是采用均勻量化
x2:=4.096*temp2/1023.0-2.048;
population[i].value:=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
end;
end;
procedure calculatefitnessvalue;
//計算適應度
var
i :integer;
temp:double;
begin
for i:=1 to PopSize do
begin
if functionmode=MAXIMIZATION
then
if population[i].value+Cmin>0.0
then
temp:=Cmin+population[i].value
else
temp:=0.0
else
if functionmode=MINIZATION
then
if population[i].value<Cmax
then
temp:=Cmax-population[i].value
else
temp:=0.0;
population[i].fitness:=temp;
end;
end;
procedure findbestandworstindividual;
//找到當前種群中最優秀個體
var
i :integer;
sum:double;
begin
sum:=0.0;
bestindividual:=population[1];
worstindividual:=population[1];
for i:=2 to PopSize do
begin
if population[i].fitness>bestindividual.fitness
then
begin
bestindividual:=population[i];
best_index:=i;
end;
if population[i].fitness<worstindividual.fitness
then
begin
worstindividual:=population[i];
worst_index:=i;
end;
sum:=sum+population[i].fitness;
end;
if generation=1
then
currentbest:=bestindividual
else
if bestindividual.fitness>currentbest.fitness
then
currentbest:=bestindividual;
end;
begin
calculateobjectvalue;
calculatefitnessvalue;
findbestandworstindividual;
end;
procedure generatenextpopulation;
procedure selectionoperator;
//通過比例選擇產生新的基因
var
i,index:integer;
p,sum:double;
cfitness:array[1..PopSize] of double;
newpopulation:array[1..popsize] of individual;
begin
sum:=0.0;
for i:=1 to PopSize do
sum:=sum+population[i].fitness;
for i:=1 to PopSize do
cfitness[i]:=population[i].fitness/sum;
for i:=2 to PopSize do
cfitness[i]:=cfitness[i-1]+cfitness[i];
for i:=1 to popsize do
begin
p:=random(1000) / 1000.0;
index:=0;
while p>cfitness[index] do
index:=index+1;
newpopulation[i]:=population[index];
end;
for i:=1 to popsize do
population[i]:=newpopulation[i];
end;
procedure crossoveroperator;
//單點交叉
var
i,j:integer;
index:array[1..PopSize] of integer;
point,temp:integer;
p:double;
ch:char;
begin
for i:=1 to PopSize do
index[i]:=i;
for i:=1 to PopSize do
begin
point:=random(PopSize-i+1);
temp:=index[i];
index[i]:=index[point+i];
index[point+i]:=temp;
end;
//隨機選擇一對個體
for i:=1 to PopSize do
begin
p:=random(1000) / 1000.0;
if p<Pc
then
begin
point:=random(CHROMLENGTH-1)+1;
for j:=point to CHROMLENGTH do
begin
ch:=population[index[i]].chrom[j];
population[index[i]].chrom[j]:=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]:=ch;
end;
end;
i:=i+1;
end;
//單點交叉
end;
procedure mutationoperator;
//基因變異
var
i,j:integer;
p:double;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -