-
Notifications
You must be signed in to change notification settings - Fork 0
/
DNA.m
51 lines (48 loc) · 1.75 KB
/
DNA.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
%Autor Adrian Josue Guel Cortez 2021
%Please cite one of my works if you are using this algorithm.
%https://scholar.google.com.mx/citations?user=gZcBLuoAAAAJ&hl=es
classdef DNA
properties
genes {mustBeNumeric}
fitness {mustBeNumeric}
end
methods
function obj=DNA(val,fit,a,b)
if nargin==4
obj.genes=a+(b-a).*rand(val,1);
obj.fitness=fit;
end
end
function child=crossover(PartnerA,PartnerB)
alpha=0.01;
beta=0.015;
child=DNA(length(PartnerA.genes),0.0,1,1);
if PartnerA.fitness>PartnerB.fitness
a=PartnerB.genes-alpha*(abs(PartnerA.genes-PartnerB.genes));
b=PartnerA.genes+beta*(abs(PartnerA.genes-PartnerB.genes));
child.genes=a+(b-a).*rand(length(PartnerA.genes),1);
else
a=PartnerB.genes-beta*(abs(PartnerA.genes-PartnerB.genes));
b=PartnerA.genes+alpha*(abs(PartnerA.genes-PartnerB.genes));
child.genes=a+(b-a).*rand(length(PartnerA.genes),1);
end
end
function obj1=mutate(obj2,mutationRate,a,b)
if rand<mutationRate
obj2.genes=a+(b-a).*rand(length(obj2.genes),1);
end
obj1=obj2;
end
function obj=acceptReject(population)
index=1;
r=rand;
while r>0
r=r-population(index).fitness;
index=index+1;
end
index=index-1;
obj=population(index);
end
end
end
%N random numbers in the interval (a,b) with the formula r = a + (b-a).*rand(N,1).