-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGeneticAlg_helpers.R
102 lines (73 loc) · 2.85 KB
/
GeneticAlg_helpers.R
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
ga.mutation <- function(genome, mutationChance, genomeLen = length(genome),
genomeMin, genomeMax, allowrepeat,
dempeningFactor = 1) {
mut_genomeLoc = runif(genomeLen) < mutationChance # do mutation for some of variables by chance
num_muts = sum(mut_genomeLoc)
# OPTION 1
# mutate to something random
#mutation = genomeMin[mut_genomeLoc] +
# runif(num_muts)*(genomeMax[mut_genomeLoc]-genomeMin[mut_genomeLoc]);
# OPTION 2
# mutate around solution
direction = runif(num_muts) - 0.5 # [-0.5 -> 0.5]
mutationRange = genomeMax[mut_genomeLoc]-genomeMin[mut_genomeLoc]
mutation = round(genome[mut_genomeLoc] + direction*mutationRange*dempeningFactor)
# check if it is in domain. if not, then take random
bad_mutations = which( (mutation < genomeMin[mut_genomeLoc]) | (mutation > genomeMax[mut_genomeLoc]) )
for (b in bad_mutations) {
mutation[bad_mutations] = ga.rand.int(n=1,
genomeMin[mut_genomeLoc][b],
genomeMax[mut_genomeLoc][b])
}
# apply mutation
genome[mut_genomeLoc] = mutation;
if (!allowrepeat) {
genome = ga.unique.maker(genome, genomeMin, genomeMax)
}
return (list(newGenome = genome, numMutations = num_muts))
}
###new mutation for migration optimization
### all elements of cromosome have same min and max value: codonmin, and codonmax
my_mutation<- function(genome, mutationChance, genomeLen = length(genome),
codonMin, codonMax, allowrepeat,
dempeningFactor = 1){
for(i in 1:genomeLen) {
if(runif(1) < mutationChance){
org_val <- genome[i]
mut_amount <- sample(c(1, -1),1)
mut_val <- org_val + mut_amount
if(mut_val < codonMin)### mut_amount was chosen negative
mut_val<- org_val + 1
else if(mut_val > codonMax)
mut_val<- org_val + (-1)
# apply mutation
genome[i] = mut_val;
}##end if
}#end for genomeLen
return (genome)
}
ga.new.chromosome <- function(genomeLen, genomeMin, genomeMax, allowrepeat) {
chromosome = round(runif(genomeLen) * (genomeMax - genomeMin) + genomeMin)
if (!allowrepeat) {
chromosome = ga.unique.maker(chromosome, genomeMin, genomeMax)
}
return (chromosome)
}
ga.rand.int <- function(n, mins, maxs) {
(mins - 1) + sample.int(maxs - mins + 1, n, replace=TRUE)
}
ga.unique.maker <-
function(x, genomeMin, genomeMax) {
while (TRUE) {
dup = duplicated(x)
if (!any(dup))
break
for (i in which(dup)) {
x[i] = x[i] + 1
if (x[i] > genomeMax[i]) {
x[i] = genomeMin[i]
}
}
}
return (x)
}