Label9: TLabel;

Label10: TLabel;

stxTarget: TStaticText;

stxX: TStaticText;

stxY: TStaticText;

Label11: TLabel;

Label12: TLabel;

edtMaxCount: TEdit;

Label13: TLabel;

btnStop: TButton;

procedure FormCreate(Sender: TObject);

function GA1GetSutability(

Chromosome: TChromosome): Double;

procedure btnStartClick(Sender: TObject);

procedure cbxFunctionChange(Sender: TObject);

procedure btnStopClick(Sender: TObject);

private

{ Private declarations }

fTarget : TTargetFunction;

fImage : TBitmap;

public

{ Public declarations }

StopFlag : boolean;

procedure CreateImage;

property Target : TTargetFunction read fTarget write fTarget;

procedure OneEpoch;

end;

var

frmMain: TfrmMain;

xBmp : array [0..99,0..99] of double;

implementation

var

fMinX, fMaxX, fMinY, fMaxY : double;

{$R *.DFM}

function De_Jong_2(X1,X2:double):double;

var

xF1,xF2 : double;

begin

fMinX := -1.28;

fMinY := -1.28;

fMaxX := 1.28;

fMaxY := 1.28;

// денормализуем параметры в нужный интервал

X1 := (X1*1.28*2)-1.28;

X2 := (X2*1.28*2)-1.28;

xF1 := sqr(X1-X2);

xF2 := sqr(1-X1);

Result := 100.0/(100.0*xF1+xF2+1.0);

end;

function De_Jong_5(X1,X2:double):double;

var

J : integer;

xS1,xS2 : double;

begin

fMinX := -65.536;

fMinY := -65.536;

fMaxX := 65.536;

fMaxY := 65.536;

X1 := (X1*65.536*2)-65.536;

X2 := (X2*65.536*2)-65.536;

xS1 := 0;

for J := 1 to 25 do

begin

xS2 := power(X1 - 16*((J mod 5)-2),6)+ power(X2 - 16*((J div 5)-2),6);

НЕ нашли? Не то? Что вы ищете?

xS1 := xS1 + 1/(J+xS2);

end;

Result := xS1 + 0.002;

end;

function Rasstrigin(X1,X2:double):double;

begin

fMinX := -5.12;

fMinY := -5.12;

fMaxX := 5.12;

fMaxY := 5.12;

X1 := (X1*5.12*2)-5.12;

X2 := (X2*5.12*2)-5.12;

Result := 20 + sqr(X1) + sqr(X2) - 10*cos(2*Pi*X1)-10*cos(2*Pi*X2);

end;

function Griewank(X1,X2:double):double;

begin

fMinX := -20;

fMinY := -20;

fMaxX := 20;

fMaxY := 20;

X1 := (X1*20*2)-20;

X2 := (X2*20*2)-20;

Result := 1/((sqr(X1)+sqr(X2))/200 - cos(X1)*cos(X2/sqrt(2))+2);

end;

procedure TfrmMain. CreateImage;

var

I, J : integer;

xMax, xMin : double;

xR, xG, xB : integer;

xVal : double;

begin

// рассчитываем образ на экране

for I:=0 to 99 do

for J:=0 to 99 do

begin

xBmp[I, J] := Target(I/100,J/100);

if (I=0) and (J=0) then

begin

xMax := xBmp[I, J];

xMin := xBmp[I, J];

end;

if xBmp[I, J] < xMin then

xMin := xBmp[I, J];

if xBmp[I, J] > xMax then

xMax := xBmp[I, J];

if xMax>1000 then

begin

xMax := xMax+1;

end;

end;

stxTarget. Caption := FloatToStr(xMax);

// а теперь рисуем картинку

for I := 0 to 99 do

for J := 0 to 99 do

begin

xB := 255-Round(255*(xBmp[I, J]-xMin)/(xMax-xMin));

xR := Round(255*(xBmp[I, J]-xMin)/(xMax-xMin));

if xB<128 then

xG := xB

else

xG := xB-128;

fImage. Canvas. Pixels[I, J] := RGB(xR, xG, xB);

end;

imgFunction. Picture. Assign(fImage);

end;

procedure TfrmMain. FormCreate(Sender: TObject);

begin

DecimalSeparator := '.';

// инициализируем интерфейс

cbxGeneDegree. ItemIndex := 1;

cbxOptimizeMethod. ItemIndex := 1;

cbxFunction. ItemIndex := 0;

// инициализируем внутренние переменные

fImage := TBitmap. Create;

fImage. Width := 100;

fImage. Height := 100;

frmMain. Target := De_Jong_5;

// рисуем первую картинку

CreateImage;

end;

function TfrmMain. GA1GetSutability( Chromosome: TChromosome): Double;

var

X1,X2 : double;

begin

// рассчитываем приспособленность

X2 := Chromosome. GeneAsFloat[0];

X1 := Chromosome. GeneAsFloat[1];

Result := Target(X1,X2);

// рисуем хромосому

imgFunction. Canvas. Pixels[round(X1*100),round(X2*100)] := RGB(255,255,255);

end;

procedure TfrmMain. btnStartClick(Sender: TObject);

var

I : integer;

xCnt : integer;

xOldS : double;

xMaxCnt : integer;

begin

// инициализируем все переменные

xMaxCnt := StrToInt(edtMaxCount. Text);

GA1.OptimizeMethod := TOptimizeMethod(cbxOptimizeMethod. ItemIndex);

GA1.UseElita := chbUseElitism. Checked;

GA1.Inversion_P := StrToFloat(edtInversionP. Text);

GA1.Mutation_P := StrToFloat(edtMutationP. Text);

GA1.Crossover_P := StrToFloat(edtCrossoverP. Text);

GA1.GeneDegree := TGeneDegree(cbxGeneDegree. ItemIndex);

GA1.ChromosomeCount := StrToInt(edtChromosomeCount. Text);

GA1.Init;

xOldS := 0;

xCnt := 0;

btnStart. Enabled := False;

btnStop. Enabled := True;

StopFlag := False;

for I := 0 to 1000000 do

begin

if xCnt >= xMaxCnt then

begin

Application. MessageBox(PChar(Format('Обучение остановлено'#10#13+

'Приспособленность не менялась в течении %d эпох',[xMaxCnt])),

'Завершение обучения',0);

break; end;

if StopFlag then break;

OneEpoch;

if (abs(xOldS - GA1.BestChromosome. Suitability) < 1.0E-8) then

inc(xCnt)

else

xCnt := 0;

xOldS := GA1.BestChromosome. Suitability;

stxTarget. Caption := FloatToStr(GA1.BestChromosome. Suitability);

stxX. Caption := FloatToStr(GA1.BestChromosome. GeneAsFloat[0]*(fMaxX-fMinX)+fMinX);

stxY. Caption := FloatToStr(GA1.BestChromosome. GeneAsFloat[1]*(fMaxY-fMinY)+fMinY);

Application. ProcessMessages;

end;

btnStart. Enabled := True;

btnStop. Enabled := False;

end;

procedure TfrmMain. OneEpoch;

begin

imgFunction. Picture. Assign(fImage);

GA1.OneEpoch;

end;

procedure TfrmMain. cbxFunctionChange(Sender: TObject);

begin

case cbxFunction. ItemIndex of

// 0: Target := De_Jong_2;

0: Target := De_Jong_5;

1: Target := Rasstrigin;

2: Target := Griewank;

end;

CreateImage;

end;

procedure TfrmMain. btnStopClick(Sender: TObject);

begin

StopFlag := True;

end;

end.

unit genetic;

interface

uses Classes,{NewBitMath,}SysUtils, Math;

const

// таблицы преобразования для кода Грея

GrayToDec : array[0..15] of byte = (0,1,3,2,7,6,4,5,15,14,12,13,8,9,11,10);

DecToGray : array[0..15] of byte = (0,1,3,2,6,7,5,4,12,13,15,14,10,11,9,8);

// параметры алгоритма по умолчанию

DEFAULT_GENE_DEGREE = 32;

DEFAULT_GENE_COUNT = 2;

MAX_GENE_COUNT = 1024;

MAX_CHROMOSOME_PER_POPULATION = 10000;

CROSSOVER_PROBABILITY = 0.98;

MUTATION_PROBABILITY = 0.1;

SHIFT_PROBABILITY = 0.2;

INVERSION_PROBABILITY = 0.1;

type

TGene = record

BegPos : integer; // положение первого элемента гена в хромосоме

Degree : integer; // длинна гена

end;

TGeneDegree = (Short_8,Midle_16,Long_32);

TOptimizeMethod = (omMinimize, omMaximize);

// основной класс - хромосома

TChromosome = class(TBits{Vector})

private

fDegree : integer; // длинна гена

fGeneCount : integer; //количество генов

fGene : array of TGene; //Массив описателей генов

procedure SetGeneCount(Value : integer);

function GetGeneSize:integer;

procedure SetGeneSize(Value:integer);

function GetGene(Index:integer):LongWord;

procedure SetGene(Index:integer;Value:LongWord);

function GetGeneAsInteger(Index:integer):LongInt;

procedure SetGeneAsInteger(Index:integer;Value:LongInt);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4