176 lines
3.2 KiB
Python
176 lines
3.2 KiB
Python
from maxone import *
|
|
from math import exp
|
|
import unittest
|
|
|
|
|
|
class MyInit(eoInit):
|
|
def __call__(self, eo):
|
|
eo.genome = [rng().normal(), rng().normal(), rng().normal()];
|
|
|
|
class MyMutate(eoMonOp):
|
|
def __call__(self, eo):
|
|
|
|
std = 0.05
|
|
eo.genome = copy(eo.genome)
|
|
|
|
eo.genome[0] += rng().normal() * std
|
|
eo.genome[1] += rng().normal() * std
|
|
eo.genome[2] += rng().normal() * std
|
|
return 1
|
|
|
|
class AnEval(eoEvalFunc):
|
|
def __init__(self):
|
|
eoEvalFunc.__init__(self)
|
|
|
|
setObjectivesSize(2);
|
|
setObjectivesValue(0,1);
|
|
setObjectivesValue(1,1);
|
|
|
|
def __call__(self, eo):
|
|
x = abs(eo.genome[0])
|
|
y = abs(eo.genome[1])
|
|
z = abs(eo.genome[2])
|
|
|
|
eo.fitness = [ x / (x+y+z), y /(x+y+z) ]
|
|
|
|
import Gnuplot
|
|
|
|
g = Gnuplot.Gnuplot()
|
|
g.reset()
|
|
|
|
def do_plot(pop):
|
|
l1 = []
|
|
l2 = []
|
|
|
|
for indy in pop:
|
|
l1.append(indy.fitness[0])
|
|
l2.append(indy.fitness[1])
|
|
|
|
d = Gnuplot.Data(l1,l2, with = 'points')
|
|
|
|
d2 = Gnuplot.Data([0,1],[1,0], with='lines')
|
|
|
|
g.plot(d,d2)
|
|
|
|
|
|
|
|
class NSGA_II(eoAlgo):
|
|
def __init__(self, ngens):
|
|
|
|
self.cont = eoGenContinue(ngens);
|
|
|
|
self.selectOne = eoDetTournamentSelect(2);
|
|
self.evaluate = AnEval()
|
|
self.mutate = MyMutate()
|
|
self.init = MyInit()
|
|
|
|
self.seq = eoProportionalOp()
|
|
self.seq.add(self.mutate, 1.0)
|
|
|
|
self.perf2worth = eoNDSorting_II()
|
|
|
|
def __call__(self, pop):
|
|
|
|
sz = len(pop)
|
|
i = 0
|
|
while self.cont(pop):
|
|
newpop = eoPop()
|
|
populator = eoSelectivePopulator(pop, newpop, self.selectOne);
|
|
|
|
while len(newpop) < sz:
|
|
self.seq(populator)
|
|
|
|
for indy in newpop:
|
|
self.evaluate(indy)
|
|
pop.push_back(indy)
|
|
|
|
self.perf2worth(pop)
|
|
self.perf2worth.sort_pop(pop)
|
|
|
|
#print pop[0].fitness, pop[0].genome
|
|
pop.resize(sz)
|
|
|
|
#worth = self.perf2worth.getValue()
|
|
#print worth[0], worth[sz-1]
|
|
|
|
i += 1
|
|
if i%100 == 0:
|
|
pass
|
|
do_plot(pop)
|
|
|
|
worths = self.perf2worth.getValue()
|
|
|
|
w0 = int(worths[0]-0.001)
|
|
|
|
for i in range(len(pop)):
|
|
if worths[i] <= w0:
|
|
break;
|
|
|
|
print pop[i].genome
|
|
print pop[i].fitness
|
|
|
|
|
|
class TestNSGA_II(unittest.TestCase):
|
|
|
|
def testIndividuals(self):
|
|
setObjectivesSize(2);
|
|
setObjectivesValue(0,1);
|
|
setObjectivesValue(1,1);
|
|
|
|
eo1 = EO();
|
|
eo2 = EO();
|
|
|
|
eo1.fitness = [0,1];
|
|
eo2.fitness = [1,1];
|
|
|
|
self.failUnlessEqual(dominates(eo1, eo2), 0)
|
|
self.failUnlessEqual(dominates(eo2, eo1), 1)
|
|
self.failUnlessEqual(dominates(eo2, eo2), 0)
|
|
|
|
setObjectivesValue(0,-1)
|
|
setObjectivesValue(1,-1);
|
|
|
|
self.failUnlessEqual(dominates(eo1, eo2), 1)
|
|
self.failUnlessEqual(dominates(eo2, eo1), 0)
|
|
self.failUnlessEqual(dominates(eo2, eo2), 0)
|
|
|
|
def testNDSorting(self):
|
|
setObjectivesSize(2);
|
|
setObjectivesValue(0,-1)
|
|
setObjectivesValue(1,-1);
|
|
|
|
pop = eoPop()
|
|
pop.resize(6)
|
|
|
|
pop[5].fitness = [0.15,0.87]
|
|
pop[4].fitness = [0.1,0.9]
|
|
pop[3].fitness = [0,1];
|
|
pop[2].fitness = [1,0];
|
|
pop[1].fitness = [1,1];
|
|
pop[0].fitness = [2,1];
|
|
|
|
srt = eoNDSorting_II()
|
|
|
|
srt(pop)
|
|
srt.sort_pop(pop)
|
|
|
|
for indy in pop:
|
|
print indy.fitness
|
|
|
|
|
|
worths = srt.getValue()
|
|
print worths
|
|
print type(worths)
|
|
|
|
def testNSGA_II(self):
|
|
|
|
evaluate = AnEval();
|
|
pop = eoPop(25, MyInit())
|
|
for indy in pop: evaluate(indy)
|
|
|
|
nsga = NSGA_II(50)
|
|
|
|
nsga(pop)
|
|
|
|
if __name__=='__main__':
|
|
unittest.main()
|