Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- Created on Sat Dec 1 19:35:25 2018
- @author: Dinopc
- """
- import time
- import numpy as np
- import matplotlib.pyplot as plt
- import pandas as pd
- from bitstring import BitArray
- # Para 11 gerações usar o seed 83312
- np.random.seed()
- def muda(x):
- if x == 0:
- x = 1
- else:
- x=0
- return x
- def gera_pop(pop1 = 30,cromossomo = 36):
- pop_ = np.random.randint(2,size = [pop1,cromossomo])
- pop_ = np.c_[pop_,np.zeros([pop1,4])]
- return pop_
- def mutacao(bebe,taxa_mutacao = 0.3):
- for i in range(len(bebe)):
- r =np.random.random()
- if r < taxa_mutacao:
- bit = np.random.randint(35,dtype=int)
- for ii in range(bit,bit+1):
- bebe[i,ii]= muda(bebe[i,ii])
- return bebe
- def fitnes(a):
- for i in range(len(a)):
- a[i][36]= ((9 + a[i,2-1]*a[i,5-1] - a[i,23-1]*a[i,14-1] +
- a[i,24-1]*a[i,4-1] - a[i,21-1]*a[i,10-1] +
- a[i,36-1]*a[i,15-1] - a[i,11-1]*a[i,26-1] +
- a[i,16-1]*a[i,17-1] + a[i,3-1]*a[i,33-1] +
- a[i,28-1]*a[i,19-1] + a[i,12-1]*a[i,34-1] -
- a[i,31-1]*a[i,32-1] - a[i,22-1]*a[i,25-1] +
- a[i,35-1]*a[i,27-1] - a[i,29-1]*a[i,7-1] +
- a[i,8-1]*a[i,13-1] - a[i,6-1]*a[i,9-1] +
- a[i,18-1]*a[i,20-1] - a[i,1-1]*a[i,30-1] +
- a[i,23-1]*a[i,4-1] + a[i,21-1]*a[i,15-1] +
- a[i,26-1]*a[i,16-1] +a[i,31-1]*a[i,12-1] +
- a[i,25-1]*a[i,19-1] + a[i,7-1]*a[i,8-1] +
- a[i,9-1]*a[i,18-1] + a[i,1-1]*a[i,33-1])/27)
- hordenado = a[a[:,36].argsort(),]
- return(hordenado)
- def cruzamento(pai,taxa_cruzamento = 0.8):
- filhos = []
- for i in range(len(pai)-1):
- if i != len(pai):
- if i%2 == 0:
- r =np.random.random()
- if r < taxa_cruzamento:
- corte = np.random.randint(36,dtype=int)
- b = np.copy(pai[i,:]).reshape(1,40)
- c = np.copy(pai[i+1,:]).reshape(1,40)
- b[:,corte:] = np.copy(pai[i+1,corte:])
- c[:,corte:] = np.copy(pai[i,corte:])
- c[:,36] = 0
- b[:,36] = 0
- c = c.T
- b = b.T
- b = np.c_[b,c]
- b = b.T
- filhos.append(b)
- filhos = np.array(filhos).reshape([len(filhos)*2,40])
- filhos = mutacao(filhos)
- filhos = fitnes(filhos)
- return filhos
- def mescle (pais):
- pais_ = fitnes(pais)
- filhos = cruzamento(pais)
- filhos = pd.DataFrame(filhos)
- pais = pd.DataFrame(pais_)
- pop_ = pd.concat([pais,filhos])
- pop_[37] = ((pop_[36])/pop_[36].sum())*100
- pop_ = np.array(pop_)
- pop_ = pop_[pop_[:,36].argsort(),]
- return pop_
- def Range_roleta(pop__):
- i=0
- soma = 0
- for i in range(len(pop__)):
- if i == 0:
- soma = soma + pop__[i,37]
- pop__[i,38] = 0
- pop__[i,39] = soma
- elif i == len(pop__)-1:
- pop[i,38] = soma
- pop[i,39] = 100
- else:
- pop__[i,38] = soma
- pop__[i,39] = soma + pop__[i,37]
- soma = soma + pop__[i,37]
- return pop
- def roleta (pop___,elitismo = False):
- global pop_size
- ind = []
- if elitismo == False:
- for i in range(pop_size):
- r =np.random.random()*100
- for ii in range(len(pop___)):
- if (r >= pop___[ii,38]) & (r <= pop___[ii,39]):
- ind.append(pop___[ii,:])
- else:
- for i in range(len(pop___)-1,len(pop___)-6,-1):
- ind.append(pop___[i,:])
- for j in range(pop_size-5):
- r =np.random.random()*100
- for ii in range(len(pop___)):
- if (r >= pop___[ii,38]) & (r <= pop___[ii,39]):
- ind.append(pop___[ii,:])
- return np.array(ind)
- def selecao(pop____,elitismo = False):
- pop____ = Range_roleta(pop____)
- nextgen_ = roleta(pop____,elitismo)
- return nextgen_
- def melhor (popu):
- melhor = -1
- for i in range(len(popu)):
- if np.all(popu[i,36].max() >= melhor):
- melhor = popu[i,:]
- melhor = melhor.reshape(1,40)
- return melhor,melhor[0,36].max()
- geracoes = 1000
- inicio = time.time()
- pop_size = 100
- best = []
- mediaglobal =[]
- besti = 0
- newpop = gera_pop(pop_size)
- bad=[]
- for i in range(geracoes):
- if besti >= 1:
- break
- pop = mescle(newpop)
- best.append(pop[:,36].max())
- bad.append(pop[:,36].min())
- mediapop = pop[:,36].mean()
- mediaglobal.append(mediapop)
- print("Geracoes: " +str(i))
- print("Media Global: "+ str(mediapop))
- newpop = selecao(pop,1)
- indm,besti = melhor(newpop)
- bad = np.array(bad).T
- best = np.array(best).T
- media = np.array(mediaglobal).T
- x = np.arange(media.size)
- fig1,ax1 = plt.subplots()
- ax1.grid(True)
- plt.title('AG')
- plt.xlabel('Geração')
- plt.ylabel('Media')
- ax1.plot(x,media,"r",x,best,"b",x,bad,"k")
- ax1.legend(('Media Global', 'Melhor Individuo',"Pior Individuo"), shadow=True)
- plt.show()
- final=indm.reshape(10,4)
- botoes=[BitArray(final[0,:]).uint,BitArray(final[1,:]).uint,BitArray(final[2,:]).uint,
- BitArray(final[3,:]).uint,BitArray(final[4,:]).uint,BitArray(final[5,:]).uint,
- BitArray(final[6,:]).uint,BitArray(final[7,:]).uint,BitArray(final[8,:]).uint]
- fim = time.time()
- print("Tempo final: " +str(fim - inicio))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement