Penjelasan Listing
program algoritma genetik implementasi Matlab
(TOOLBOX MATLAB)
function [B,A]=GadposE0(gen,pop,Jenis); %mendeklarasikan
fungsi lokal GadposE0 dengan 3 variabel yaitu generasi,populasi, dan jenis
% Program Optimalisasi model kontrol PID
servomotor dengan GA
% Output
arguments berupa koefisien PID (KP, KI, KD) ,
A dan KTach
% Input
argument berupa kontrol ‘posisi’
global inpxOpts inpmOpts inpselectOps
inpbounds bounds; % input argumen global yaitu
koefisien ceossover, koefisien mutasi, dan koefesien seleksi
rand('seed',0); r
%random
switch lower(Jenis) %memeriksa
nilai ‘jenis’
case 'posisi', disp('Keofisien posisi') %jika
input adala ‘posisi’ maka akan muncul ‘Koefisien Posisi’
GadEvalposE0(0); % memanggil fungsi GadEvalposE0
function [sol,val] =
GadEvalposE0(sol,options) %membuat fungsi dengan nama
GadEvalposE0 dengan dua variabel yaitu sol dan options
global inpxOpts inpmOpts inpselectOps
inpbounds; %input fungsi global yaitu
koefisien crossover, koefisien mutasi, dan koefisien seleksi
inpxOpts = [2 0;2 3;2 0]; %nilai Koefisien Crossover
inpmOpts = [2 0 0;2 0 0]; %nilai Koefisien Mutasi
inpselesctOps = [0.04]; %nilai Koefisien Seleksi
if nargin==2
% Note:
1 oz-in = 7.0615e-3 N.m
Ebalik=0.0708; %nilai Ebalik motor
Torsi=10.02*7.0615e-3; %nilai torsi motor
B=9.55e-4*7.0615e-3; %nilai B motor
Resistan=1.64; %nilai resistansi
motor
ilitan=3.39e-3; %jumlah lilitan
motor
J=0.0108*7.0615e-3; %nilai J motor
jarak=1.57; %nilai jarak motor
k=0; %memisalkan varibel
k dengan nilai 0
for
t=0:0.001:0.1 %untuk t=0, 0.001, dan 0.1
k=k+1; %maka nilai k
sekarang sama dengan nilai k sebelumnya ditambah 1
if t>0.01 %jika t besar dari
0.1
G(k)=jarak; %maka nilai G(k) samadengan nilai jarak
GG(k)=G(k); %nilai GG(k) sama dengan G(k)
Else %jika
tidak
G(k)=jarak*(t/0.01);%maka nilai G(k)=jarak*(t/0.01)
GG(k)=G(k); %nilai GG(k) sama dengan G(k)
end %logika if berakhir
end; %logika for berakhir
c1=(jarak*sol(4)*Torsi*sol(3)); %-(0.01*ilitan);
c2=(jarak*sol(4)*Torsi*sol(1)); %-(0.01*Resistan);
c3=jarak*sol(4)*Torsi*sol(2);
u1=(ilitan*J);
u2=ilitan*B+Resistan*J;
u3=Resistan*B+(sol(4)*Torsi*sol(5))+(Ebalik*Torsi)+(sol(4)*Torsi*sol(3));
u4=sol(4)*Torsi*sol(1);
u5=sol(4)*Torsi*sol(2);
T=0:0.001:0.1;
%G
num={[c1 c2 c3]};
den={[u1 u2 u3 u4 u5]};
h=tf(num,den);
F=step(h,T);
FF=F';
HH=FF;
%HH
Er1=HH-G;
Er2=GG-HH;
Err1=Er1.^2;
Err2=Er2.^2;
Error1=Err1*ones(k,1);
Error2=Err2*ones(k,1);
val=10/(Error1+Error2);
end
bt1=[0 200];
bt2=[0 2
00];
bt3=[0 1];
bt4=[2 200];
bt5=[0.01 1];
inpbounds =
[bt1;bt2;bt3;bt4;bt5];
evalFn = 'GadEvalposE0'; %pemberian nilai variabel
jumpop=pop; %inisialisasi varibel jumlah
populasi=populasi
bounds
= inpbounds; %membuat variabel bounds = fungsi
global baounds
gaOpts=[1e-6
1 1]; %koefisien ga optimasi
startPop
= initializega(jumpop,bounds,'GadEvalposE0',[1e-6 1]); %membuat
variabel satrtpop = menginisialisasi beberapa variabel
otherwise, disp('Jenis tak diketahui') %jika
tidak sesuai maka akan ditampilkan ‘jenis tak diketahui’
end %logika swicth
berakhir
%flops(0);
%
Crossover Operators
xFns = 'arithXover heuristicXover
simpleXover'; %inisialisasi operator-operator
Crossover yaitu arith Crossover, Heuristic Crosover, dan Simple Crosover
function
[c1,c2] = arithXover(p1,p2,bounds,Ops) %membuat fungsi
arithXover dengan 4 variabel
%p1 – orangtua
pertama
%p2- orangtua kedua
% bounds - batas matriks untuk ruang solusi
% Ops - Pilihan matriks untuk arit crossover [gen
#ArithXovers]
% Pilih jumlah mix acak
a
= rand; %membuat variabel a dengan nilai =
random
% Buat anak-anak
c1
= p1*a + p2*(1-a); %nilai
anak pertama
c2
= p1*(1-a) + p2*a; %nilai anak kedua
function
[c1,c2] = heuristicXover(p1,p2,bounds,Ops)
% p1 - orang tua pertama ([nilai fungsi
string solusi])
% p2 - induk kedua ([nilai fungsi string
solusi])
% bounds - batas matriks untuk ruang
solusi
% Ops - Pilihan untuk
crossover heuristik, [gen #heurXovers number_of_retries]
retry=Ops(3);
% Number of retries
i=0;
good=0;
b1=bounds(:,1)';
b2=bounds(:,2)';
numVar
= size(p1,2)-1;
% Tentukan orang tua terbaik dan terburuk
if(p1(numVar+1)
> p2(numVar+1))
bt = p1;
wt = p2;
else
bt = p2;
wt = p1;
end
while
i<retry
% Pilih
jumlah mix acak
a =
rand;
%
Buat anak
c1 = a * (bt - wt) + bt;
% Periksa untuk melihat apakah anak dalam batas
if (c1(1:numVar) <= b2 & (c1(1:numVar)
>= b1))
i = retry;
good=1;
else
i = i + 1;
end
end
% Jika anak baru tidak layak kembalikan
anak baru
if(~good)
c1 = wt;
end
% FungsiCrossover mengembalikan dua anak sehingga
mengembalikan yang terbaik
% dan anak baru dibuat
c2
= bt;
function
[c1,c2] = simpleXover(p1,p2,bounds,Ops) %membuat fungsi
simpleXover
% p1 - orang tua pertama ([nilai fungsi string solusi])
% p2 - induk kedua ([nilai fungsi string solusi])
%bounds- batas matriks untuk ruang solusi
% Ops - Pilihan matriks untuk crossover
sederhana [gen #SimpXovers].
numVar
= size(p1,2)-1; % Dapatkan jumlah variabel
% Pilih titik potong secara acak dari
1-angka vars
cPoint
= round(rand * (numVar-2)) + 1;
a
c1
= [p1(1:cPoint) p2(cPoint+1:numVar+1)]; % Buat anak-anak
c2 = [p2(1:cPoint) p1(cPoint+1:numVar+1)];
xOpts = inpxOpts; %membuat
variabel xopts=koefisien Crossover
% Mutation
Operators
mFns = 'boundaryMutation unifMutation'; %inisialisasi
operator-operator mutasi yaitu boundary mutasi dan unif mutasi
function [parent] =
boundaryMutate(parent,bounds,Ops) %membuat fungsi
boundari mutasi
% parent - orang tua pertama ([nilai
fungsi string solusi])
%bounds- batas matriks untuk ruang solusi
% Ops -
Opsi untuk boundaryMutation [gen #BndMutations]
numVar = size(parent,2)-1; % Dapatkan jumlah variabel
% Pilih
variabel untuk bermutasi secara acak dari 1-angka vars
mPoint = round(rand * (numVar-1)) + 1;
b = round(rand)+1; % Pilih yang terikat untuk pindah
newValue = bounds(mPoint,b); % Sekarang bermutasi titik itu
parent(mPoint) = newValue; % Buat anak itu
function [parent] =
uniformMutate(parent,bounds,Ops) %membuat fungsi
uni mutasi
% parent - orangtua pertama ([nilai fungsi string
solusi])
%
bounds - matriks batas untuk ruang
solusi
% Ops - Opsi untuk uniformMutation [gen
#UnifMutations]
df = bounds(:,2) - bounds(:,1); % Rentang variabel
numVar = size(parent,2)-1; % Dapatkan jumlah variabel
% Pilih
variabel untuk bermutasi secara acak dari 1-angka vars
mPoint = round(rand * (numVar-1)) + 1;
newValue = bounds(mPoint,1)+rand * df(mPoint); % Sekarang bermutasi titik itu
parent(mPoint) =
newValue; % Buat anak itu
mOpts = inpmOpts; %membuat
variabel mopts=koefisien mutasi
%
Termination Operators
termFns = 'maxGenTerm'; %inisialisasi
operator terminasi yaitu maxgenterm
function [done] = maxGenTerm(ops,bPop,endPop)
% ops - vektor opsi [current_gen
maximum_generation]
%
bPop - matriks solusi terbaik
[generation_found solution_string]
% endPop -
generasi solusi saat ini
currentGen = ops(1);
maxGen
= ops(2);
done = currentGen >= maxGen;
termOps = gen; % Generations
%
Selection Function
selectFn = 'roulette'; %inisialisasi
operator seleksi yaitu roulette
function[newPop] = roulette(oldPop,options)
%newPop - populasi baru yang dipilih dari oldPop
%oldPop - populasi saat ini
%options -
options [gen]
% Dapatkan parameter populasi
numVars = size(oldPop,2);
numSols = size(oldPop,1);
% Hasilkan probabilitas seleksi relatif
totalFit = sum(oldPop(:,numVars));
prob=oldPop(:,numVars) / totalFit;
prob=cumsum(prob);
rNums=sort(rand(numSols,1)); % Hasilkan angka acak
% Pilih individu dari oldPop ke yang baru
fitIn=1;newIn=1;
while newIn<=numSols
if(rNums(newIn)<prob(fitIn))
newPop(newIn,:) = oldPop(fitIn,:);
newIn
= newIn+1;
else
fitIn
= fitIn + 1;
end
end
selectOps = inpselectOps; %
membuat variabel selectopts=koefisien seleksi
% Evaluation Function (option)
evalOps = []; %fungsi
evaluasi
% Lets run the GA
[x endPop bestPop
trace]=ga(bounds,evalFn,evalOps,startPop,gaOpts,...
termFns,termOps,selectFn,selectOps,xFns,xOpts,mFns,mOpts); %menjalankan
program GA.m
function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)
% x
- solusi terbaik yang ditemukan selama perjalanan
% endPop
- populasi terakhir
% bPop
- jejak populasi terbaik
% traceInfo
- matriks terbaik dan sarana ga untuk setiap generasi
%
% Input
Arguments:
% bounds
- matriks batas atas dan bawah pada variabel
% evalFN
- nama evaluasi .m function
% evalOps
- pilihan untuk lolos ke fungsi evaluasi ([NULL])
% startPop
- matriks solusi yang dapat diinisialisasi
%
from initialize.m
% opts
- [epsilon prob_ops display] perubahan diperlukan untuk
% mempertimbangkan dua
% solusi berbeda, prob_ops
0 jika Anda ingin menerapkan
% operator genetik secara
probabilistik untuk setiap solusi, 1 jika
% Anda menyediakan jumlah
operator deterministik
% aplikasi dan tampilan
adalah 1 untuk menghasilkan keluaran 0 untuk
% diam.
([1e-6 1 0])
% termFN
- nama dari .m termination function (['maxGenTerm'])
% termOps
- string opsi untuk diteruskan ke fungsi penghentian
% ([100]).
% selectFN
- name of the .m selection function (['normGeomSelect'])
% selectOpts
- string opsi yang akan dilewatkan untuk dipilih setelahnya
% select(pop,#,opts) ([0.08])
% xOverFNS
- string yang berisi nama kosong dipisahkan dari Xover.m
% files (['arithXover
heuristicXover simpleXover'])
%
xOverOps - Sebuah matriks opsi
untuk dilewatkan ke file Xover.m dengan
% kolom
pertama adalah jumlah yang akan dilakukan xOver
% serupa untuk
mutasi ([2 0;2 3;2 0])
% mutFNs
- string yang berisi nama kosong dipisahkan dari mutation.m
% files (['boundaryMutation
multiNonUnifMutation ...
% nonUnifMutation
unifMutation'])
%
mutOps - Sebuah matriks opsi
untuk dilewatkan ke file Xover.m dengan
% kolom
pertama adalah jumlah yang akan dilakukan xOver
% serupa untuk
mutasi ([4 0 0;6 100 3;4 100 3;4 0 0])
n=nargin;
if n<2 | n==6 | n==10 | n==12
disp('Insufficient arguements')
end
if n<3 % Pemilihan evalasi default.
evalOps=[];
end
if n<5
opts =
[1e-6 1 0];
end
if isempty(opts)
opts =
[1e-6 1 0];
end
if any(evalFN<48) % Tidak menggunakan a .m file
if
opts(2)==1 % Float ga
e1str=['x=c1; c1(xZomeLength)=', evalFN ';'];
e2str=['x=c2; c2(xZomeLength)=', evalFN ';'];
else % Biner ga
e1str=['x=b2f(endPop(j,:),bounds,bits); endPop(j,xZomeLength)=',...
evalFN
';'];
end
if
opts(2)==1 %Float ga
e1str=['[c1 c1(xZomeLength)]=' evalFN '(c1,[gen evalOps]);'];
e2str=['[c2 c2(xZomeLength)]=' evalFN '(c2,[gen evalOps]);'];
else % Biner ga
e1str=['x=b2f(endPop(j,:),bounds,bits);[x v]=' evalFN ...
'(x,[gen
evalOps]); endPop(j,:)=[f2b(x,bounds,bits) v];'];
end
end
if n<6 % Informasi penghentian default
termOps=[100];
termFN='maxGenTerm';
end
if n<12 % Informasi mutasi default
if
opts(2)==1 %Float GA
mutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation
unifMutation'];
mutOps=[4 0 0;6 termOps(1) 3;4 termOps(1) 3;4 0 0];
else % GA Biner
mutFNs=['binaryMutation'];
mutOps=[0.05];
end
end
if n<10 % Binary GA% Informasi crossover default
if
opts(2)==1 %Float GA
xOverFNs=['arithXover heuristicXover simpleXover'];
xOverOps=[2 0;2 3;2 0];
else
%Binary GA
xOverFNs=['simpleXover'];
xOverOps=[0.6];
end
end
if n<9 % Pilih Default hanya memilih i.e. roullete wheel.
selectOps=[];
end
if n<8 %Default select info
selectFN=['normGeomSelect'];
selectOps=[0.08];
end
if n<6 % Informasi penghentian default
termOps=[100];
termFN='maxGenTerm';
end
if n<4 % Tidak ada populasi awal yang diberikan
startPop=[];
end
if isempty(startPop) % Hasilkan suatu populasi secara acak
%startPop=zeros(80,size(bounds,1)+1);
startPop=initializega(80,bounds,evalFN,evalOps,opts(1:2));
end
if opts(2)==0 % biner
bits=calcbits(bounds,opts(1));
end
mutFNs=parse(mutFNs);
xZomeLength
= size(startPop,2); % Panjang dari xzome=numVars+fittness
numVar
= xZomeLength-1; % Jumlah variabel
popSize
= size(startPop,1); % Jumlah individu dalam pop
endPop
= zeros(popSize,xZomeLength); % Matriks populasi sekunder
c1
= zeros(1,xZomeLength); % Seorang individu
c2
= zeros(1,xZomeLength); % Seorang individu
numXOvers
= size(xOverFNs,1); % Jumlah operator Crossover
numMuts
= size(mutFNs,1); % Jumlah operator Mutasi
epsilon
= opts(1); % Threshold untuk dua kebugaran
berbeda
oval
= max(startPop(:,xZomeLength)); % Nilai terbaik di mulai pop
bFoundIn
= 1; % Jumlah waktu terbaik telah
berubah
done
= 0; % Selesai dengan evolusi simulasi
gen
= 1; % Nomor Generasi Saat Ini
collectTrace = (nargout>3); %
Haruskah kami mengumpulkan info setiap gen
floatGA
= opts(2)==1; % Aplikasi probabilistik ops
display
= opts(3); % Kemajuan tampilan
while(~done)
%Elitist
Model
[bval,bindx] = max(startPop(:,xZomeLength)); % Terbaik dari pop saat ini
best
= startPop(bindx,:);
if
collectTrace
traceInfo(gen,1)=gen; % generasi saat ini
traceInfo(gen,2)=startPop(bindx,xZomeLength); %fitnes terbaik
traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %Avg fittness
traceInfo(gen,4)=std(startPop(:,xZomeLength));
end
if (
(abs(bval - oval)>epsilon) | (gen==1)) % Jika kita memiliki sol terbaik baru
if
display
fprintf(1,'\n%d %f\n',gen,bval);
% Perbarui layar
end
if
floatGA
bPop(bFoundIn,:)=[gen startPop(bindx,:)]; % Perbarui bPop Matrix
else
bPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)...
startPop(bindx,xZomeLength)];
end
bFoundIn=bFoundIn+1;
% Perbarui jumlah
perubahan
oval=bval;
% Perbarui val
terbaik
else
if
display
fprintf(1,'%d ',gen); % Atau hanya memperbarui gen num
end
end
endPop
= feval(selectFN,startPop,[gen selectOps]); %Select
for i=1:numXOvers,
for j=1:xOverOps(i,1),
a = round(rand*(popSize-1)+1); % Pilih orang tua
b = round(rand*(popSize-1)+1); % Pilih orang tua lain
xN=deblank(xOverFNs(i,:)); % Dapatkan nama fungsi crossover
[c1 c2] =
feval(xN,endPop(a,:),endPop(b,:),bounds,[gen xOverOps(i,:)]);
if
c1(1:numVar)==endPop(a,(1:numVar)) % Pastikan kami membuat yang baru
c1(xZomeLength)=endPop(a,xZomeLength); %solusi sebelum mengevaluasi
elseif
c1(1:numVar)==endPop(b,(1:numVar))
c1(xZomeLength)=endPop(b,xZomeLength);
else
[c1(xZomeLength) c1] = feval(evalFN,c1,[gen evalOps]);
eval(e1str);
end
if
c2(1:numVar)==endPop(a,(1:numVar))
c2(xZomeLength)=endPop(a,xZomeLength);
elseif
c2(1:numVar)==endPop(b,(1:numVar))
c2(xZomeLength)=endPop(b,xZomeLength);
else
[c2(xZomeLength) c2] = feval(evalFN,c2,[gen evalOps]);
eval(e2str);
end
endPop(a,:)=c1;
endPop(b,:)=c2;
end
end
for i=1:numMuts,
for j=1:mutOps(i,1),
a = round(rand*(popSize-1)+1);
c1 = feval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen
mutOps(i,:)]);
if
c1(1:numVar)==endPop(a,(1:numVar))
c1(xZomeLength)=endPop(a,xZomeLength);
else
[c1(xZomeLength) c1] = feval(evalFN,c1,[gen evalOps]);
eval(e1str);
end
endPop(a,:)=c1;
end
end
else
%Kami menjalankan model
operator genetik probabilistik
for i=1:numXOvers,
xN=deblank(xOverFNs(i,:)); % Dapatkan nama fungsi crossover
cp=find(rand(popSize,1)<xOverOps(i,1)==1);
if rem(size(cp,1),2)
cp=cp(1:(size(cp,1)-1)); end
cp=reshape(cp,size(cp,1)/2,2);
for j=1:size(cp,1)
a=cp(j,1); b=cp(j,2);
[endPop(a,:) endPop(b,:)] =
feval(xN,endPop(a,:),endPop(b,:),...
bounds,[gen xOverOps(i,:)]);
end
end
mN=deblank(mutFNs(i,:));
for
j=1:popSize
endPop(j,:)
= feval(mN,endPop(j,:),bounds,[gen mutOps(i,:)]);
eval(e1str);
end
end
end
gen=gen+1;
done=feval(termFN,[gen termOps],bPop,endPop); % Lihat apakah ga selesai
startPop=endPop; % Tukar populasi
[bval,bindx] = min(startPop(:,xZomeLength)); % Simpan solusi terbaik
startPop(bindx,:) = best; % ganti dengan yang terburuk
end
[bval,bindx] = max(startPop(:,xZomeLength));
if display
fprintf(1,'\n%d %f\n',gen,bval);
end
x=startPop(bindx,:);
if opts(2)==0 %binary
x=b2f(x,bounds,bits);
bPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)...
startPop(bindx,xZomeLength)];
else
bPop(bFoundIn,:)=[gen startPop(bindx,:)];
end
if collectTrace
traceInfo(gen,1)=gen; % generasi saat ini
traceInfo(gen,2)=startPop(bindx,xZomeLength);
%fittnes terbaik
traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %Avg fittness
end
% x adalah solusi terbaik yang ditemukan
x;
% Tekan
kembali untuk melanjutkan
nn=max(size(x));
for j=1:nn-1
fprintf('\nNilai Variabel sol(%1.0f) =%8.8f\',j,x(j));
sol(j)=x(j);
end
% jejak adalah jejak nilai terbaik dan
nilai rata-rata dari generasi
jejak;
% Tekan kembali untuk melanjutkan
% jeda
% Plot yang terbaik dari waktu ke waktu
% clf
% plot (trace (:, 1), trace (:, 2));
% Tekan kembali untuk melanjutkan
%berhenti
sebentar
switch lower(Jenis)
case 'posisi'
% Note: 1 oz-in = 7.0615e-3 N.m
Ebalik=0.0708;
Torsi=10.02*7.0615e-3;
B=9.55e-4*7.0615e-3;
Resistan=1.64;
ilitan=3.39e-3;
J=0.0108*7.0615e-3;
jarak=1.57;
b1=(jarak*sol(4)*Torsi*sol(3)); %-(0.01*ilitan);
b2=(jarak*sol(4)*Torsi*sol(1)); %-(0.01*Resistan);
b3=jarak*sol(4)*Torsi*sol(2);
a1=ilitan*J;
a2=ilitan*B+Resistan*J;
a3=Resistan*B+sol(4)*Torsi*sol(5)+Ebalik*Torsi+sol(4)*Torsi*sol(3);
a4=sol(4)*Torsi*sol(1);
a5=sol(4)*Torsi*sol(2);
otherwise
end
num={[b1 b2 b3]};
den={[a1 a2 a3 a4 a5]};
h=tf(num,den);
[Y,T]=step(h,0.2);
plot(T,Y);
axis([0 0.1 0 1.8])
grid on;
2.
Initializega.m
function [pop] = initializega(num, bounds,
evalFN,evalOps,options)
% pop - populasi awal, dievaluasi, acak
%
populatoinSize - ukuran populasi, yaitu jumlah yang harus dibuat
%
variableBounds - matriks yang berisi batasan setiap variabel, yaitu.
% [var1_high var1_low;
var2_high var2_low; ....]
% evalFN - evaluasi fn, biasanya nama file .m
untuk Evaluasi
%
evalOps - opsi apa saja yang akan
diteruskan ke default fungsi eval []
%
options - pilihan untuk fungsi
inisialisasi, yaitu
% [type prec] di mana eps
adalah nilai epsilon
%
dan opsi kedua adalah 1 untuk float dan 0 untuk biner,
% prec adalah ketepatan default
variabel [1e-6 1]
if nargin<5
options=[1e-6 1];
end
if nargin<4
evalOps=[];
end
if any(evalFN<48) %Not a .m file
if
options(2)==1 %Float GA
estr=['x=pop(i,1); pop(i,xZomeLength)=', evalFN ';'];
else
%Binary GA
estr=['x=b2f(pop(i,:),bounds,bits); pop(i,xZomeLength)=', evalFN ';'];
end
else %A .m file
if
options(2)==1 %Float GA
estr=['[ pop(i,:) pop(i,xZomeLength)]=' evalFN '(pop(i,:),[0
evalOps]);'];
else
%Binary GA
estr=['x=b2f(pop(i,:),bounds,bits);[x v]=' evalFN ...
'(x,[0
evalOps]); pop(i,:)=[f2b(x,bounds,bits) v];'];
end
end
numVars
= size(bounds,1); %Number
of variables
rng
= (bounds(:,2)-bounds(:,1))'; %The variable ranges'
if options(2)==1 %Float GA
xZomeLength = numVars+1; %Length
of string is numVar + fit
pop =
zeros(num,xZomeLength); %Allocate the
new population
pop(:,1:numVars)=(ones(num,1)*rng).*(rand(num,numVars))+...
(ones(num,1)*bounds(:,1)');
else %Binary GA
bits=calcbits(bounds,options(1));
xZomeLength = sum(bits)+1; %Length
of string is numVar + fit
pop =
round(rand(num,sum(bits)+1));
end
for i=1:num
eval(estr);
end
3.
Parse.m
function [x] = parse(inStr)
% parse is a function which takes in a string
vector of blank separated text
% and parses out the individual string items
into a n item matrix, one row
% for each string.
%
% function [x] = parse(inStr)
% x - the return matrix of strings
% inStr - the blank separated string vector
sz=size(inStr);
strLen=sz(2);
x=blanks(strLen);
wordCount=1;
last=0;
for i=1:strLen,
if
inStr(i) == ' '
wordCount = wordCount + 1;
x(wordCount,:)=blanks(strLen);
last=i;
else
x(wordCount,i-last)=inStr(i);
end
end