genetic algorithm
- To: mathgroup at smc.vnet.net
- Subject: [mg122018] genetic algorithm
- From: Amy Poole <amy.poole at psi.ch>
- Date: Sun, 9 Oct 2011 03:52:23 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
Hullo,
I wrote a routine that is supposed to be a bit like a genetic
algorithm that will minimise a function that requires testing
different integer combinations. It works nicely for simple test
functions but not for more complex ones and I cannot understand why,
I have attached the algorithm and the function that works. I would be
interested in your feedback.
Amy
p.s. The code is quite short, but not very short.
geneticAlgorithm[function_, energy_, variables__List,
fitControlInt___Integer, fitControlReal___Real] :=
Module[{lVar, varNames, conList, startList,
iterations, sampleSize,
mixingFactor, mutationFactor, diversityFactor,
sampleMixingFactor, sampleMutationFactor, sampleDiversityFactor,
ranList, numTable, pickList, ranPart,
sample, replaceList, best, random},
(**assign input values to internal variable names**)
(*assign length of variables list*)
lVar = Length[{variables}[[1]]];
(*assign input variables names*)
varNames = {variables}[[1]];
(*assign constraints*)
If[Length[{variables}] > 1,
conList = {variables}[[2]];
If[Length[{variables}] > 2,
startList = {variables}[[3]]
],
conList = Table[1, {n, lVar}]
];
(*assign fitControlInt*)
(*iterations of do loop*)
iterations = lVar^2 10;
(*number of values in sample table*)
sampleSize = lVar^2 10;
If[Length[{fitControlInt}] > 0,
iterations = {fitControlInt}[[1]];
If[Length[{fitControlInt}] > 1,
sampleSize = {fitControlInt}[[2]];
]
];
mixingFactor = 0.9;
mutationFactor = 0.01;
diversityFactor = 0.05;
If[Length[{fitControlReal}] > 0,
mixingFactor = {fitControlReal}[[1]];
If[Length[{fitControlReal}] > 1,
mutationFactor = {fitControlReal}[[2]];
If[Length[{fitControlReal}] > 2,
diversityFactor = {fitControlReal}[[3]]
]
]
];
(*amount of mixing that takes place - the lower the mixingFactor -
the less mixing - the factor runs from 0 to 1 and is on a log
scale*)
sampleMixingFactor := sampleSize^(1 - mixingFactor);
(*number of values replaced by random numbers - default is 1%,
0.01*)
sampleMutationFactor := sampleSize lVar mutationFactor;
(*number of random values added to the test sample -
default is 5% of the length of the sample*)
sampleDiversityFactor = sampleSize diversityFactor;
(**define internal functions**)
(*random number list generator*)
ranList := RandomInteger /@ conList;
(*random table generator*)
numTable[func_, numList_] :=
Reap[function /. Thread[varNames -> Sow[numList]]];
(*random mixing function*)
pickList :=
Table[
{IntegerPart[
0.1 sampleSize RandomReal[
ExponentialDistribution[sampleMixingFactor]] + 1], n}, {n,
lVar}];
(*random single position generator*)
ranPart := {RandomInteger[{1, sampleSize}],
RandomInteger[{1, lVar}]};
(**calculations**)
(*calculate initial random set of numbers*)
sample = Table[numTable[function, ranList], {n, sampleSize}];
(*if starting values are included add these to sample*)
If[Length[{variables}] > 2,
PrependTo[sample, numTable[function, startList]]];
sample = Sort[sample];
Clear[startList];
(**Make new sample using best values from old sample**)
Do[
(*Take the best five percent of the sample*)
best = sample[[1 ;; IntegerPart[sampleSize 0.05] + 1, 2, 1, 1]];
(*Make the mixed table -
nb larger table is made when the mixing factor is small*)
sample =
Table[Extract[sample[[All, 2, 1, 1]],
pickList], {n, (2 - mixingFactor) sampleSize}];
(*Make a table of random postitions (the number of positions is \
described by the mutation factor)*)
replaceList = Table[ranPart, {n, sampleMutationFactor}];
(*assign to these random positions random numbers that obey the \
constraints for that position*)
replaceList =
Table[replaceList[[n]] -> ranList[[replaceList[[n, 2]] ]], {n,
sampleMutationFactor} ];
(*insert mutations into the sample*)
sample = ReplacePart[sample, replaceList];
(*Make a random set of values to append to the sample (the size is
\
described by the diversity factor)*)
random = Table[ranList, {n, IntegerPart[sampleDiversityFactor]}];
sample = DeleteDuplicates[Join[best, random, sample]];
If[sampleSize > Length[sample], sampleSize = Length[sample]];
Clear[best, random];
sample = Table[numTable[function, sample[[n]]], {n, sampleSize}];
sample = Sort[sample],
{i, iterations}];
{sample[[1, 1]], sample[[1, 2, 1, 1]]}
]
input :
gA[function[variables], variables,
optional lists (constraints, starting values),
optional integers (number of iterations, size of initial sample ),
optional reals (mixing coefficient, mutation coefficient, diversity
coeffcient)]
Example that works:
func[x__] := Total[{x}];
a = b = c = 10
geneticAlgorithm[
func[a, b, c, v1, v2, v3, v4, v5], {v1, v2, v3, v4, v5}, {1, 0, 1, 1,
1}, {0, 1, 0, 1, 0}, 100, 1000, 0.95]