from math import sin, cos, pi
from gaft import GAEngine
from gaft.components import BinaryIndividual,decimal_individual
from gaft.components import Population
from gaft.operators import TournamentSelection
from gaft.operators import UniformCrossover
from gaft.operators import FlipBitBigMutation
# Analysis plugin base class.
from gaft.plugin_interfaces.analysis import OnTheFlyAnalysis
# Built-in best fitness analysis.
from gaft.analysis.fitness_store import FitnessStore
from gaft.analysis.console_output import ConsoleOutput
# Define population.
indv_template = BinaryIndividual(ranges=[(0, 5), (0.1, 5),(-0.5, 2.5),(0, 25)], eps=0.001)
#indv_template = decimal_individual((0, 5), (0.1, 5),(-0.5, 2.5),(0, 25))
population = Population(indv_template=indv_template, size=50).init()
# Create genetic operators.
#selection = RouletteWheelSelection()
selection = TournamentSelection()
crossover = UniformCrossover(pc=0.95, pe=0.5)
mutation = FlipBitBigMutation(pm=0.01, pbm=0.55, alpha=0.6)
# Create genetic algorithm engine.
# Here we pass all built-in analysis to engine constructor.
engine = GAEngine(population=population, selection=selection,
crossover=crossover, mutation=mutation,
analysis=[ConsoleOutput, FitnessStore])
# Define fitness function.
def effort_applied(a,b,c,d, kloc, me):
return a * (kloc ** b) + c * me + d
import pandas as pd
dataset = pd.read_csv('anil18.csv')
kloc = dataset.iloc[:18, 0].values
me= dataset.iloc[:18, 1].values
target = dataset.iloc[:18, 2].values
rows=len(kloc[:18])
mmre=[]
vaf=[]
@engine.fitness_register
def fitness(indv):
a,b,c,d = indv.solution
Effort=[]
for k in range(rows):
E = effort_applied(a,b,c,d, kloc[k], me[k])
Effort.append(E)
dif = []
for i in range(rows):
dd = abs(target[i] - Effort[i]) / target[i]
dif.append(dd)
mmre.append(sum(dif) / 18)
return float(min(mmre))
from statistics import variance
d = []
for i in range(18):
a = (target[i] - Effort[i])
d.append(a)
vd=variance(d)
vy=variance(target[:18])
va=(1-vd/vy)*100
vaf.append(va)
# print(y[:18])
return float(max(vaf))
if '__main__' == __name__:
engine.run(ng=500)