Você está na página 1de 5

08/07/2019 Trabalho_final.

ipynb - Colaboratory

Trabalho Final: Programação Inteira e AG


Dado o circuito elétrico, minimizar o custo operacional das chaves utilizando:
Programação Inteira
Algoritmo Genético

minimizar 100B1 + 50B2 + 500B3 + 20B4 + 100B5 + 60B6


x

sujeito a: 57B1 − 15B2 + 60B4 − 30B5 − 6(VA − VB ) − 4VA = 0

15B2 + 39B3 + 30B5 + 40B6 + 6(VA − VB ) − 8VB = 0

8.6 ≤ VA ≤ 8.8V

7.5 ≤ VB ≤ 7.7V

B1 , B2 , B3 , B4 , B5 , B6 [0, 1]

Programação Inteira
minimizar 100B1 + 50B2 + 500B3 + 20B4 + 100B5 + 60B6
x

sujeito a: 57B1 − 15B2 + 60B4 − 30B5 − 6(VA − VB ) − 4VA ≤ 0

− 57B1 + 15B2 − 60B4 + 30B5 + 6(VA − VB ) + 4VA ≤ 0

15B2 + 39B3 + 30B5 + 40B6 + 6(VA − VB ) − 8VB ≤ 0

− 15B2 − 39B3 − 30B5 − 40B6 − 6(VA − VB ) + 8VB ≤ 0

− VA ≤ −8.6V

VA ≤ 8.8V

VB ≤ 7.7V

− VB ≤ −7.5V

B1 , B2 , B3 , B4 , B5 , B6 [0, 1]

from cvxopt.glpk import ilp


import numpy as np
from cvxopt import matrix

# Utilizando o CVXOPT toolbox ilp declarando a fob:

c = np.array([[100.,50.,500.,20.,100.,60.]])
G = np.array([[57.,-15.,0.,60.,-30.,0.,-10.,6.],[-57.,15.,0.,-60.,30.,0.,10.,-6.],
[0.,15.,39.,0.,30.,40.,6.,-14.],[0.,-15.,-39.,0.,-30.,-40.,-6.,14.],
[0.,0.,0.,0.,0.,0.,-1.,0.],[0.,0.,0.,0.,0.,0.,1.,0.],[0.,0.,0.,0.,0.,0.,0.,1.],
[0.,0.,0.,0.,0.,0.,0.,-1.],[-1.,0.,0.,0.,0.,0.,0.,0.],[0.,-1.,0.,0.,0.,0.,0.,0.],
[0.,0.,-1.,0.,0.,0.,0.,0.],[0.,0.,0.,-1.,0.,0.,0.,0.],[0.,0.,0.,0.,-1.,0.,0.,0.],
[0.,0.,0.,0.,0.,-1.,0.,0.],[0.,0.,0.,0.,0.,-1.,0.,0.]])
h = np.array([[0.],[0.],[0.],[0.],[-8.6],[8.8],[7.7],[-7.5],[0.],[0.],[0.],[0.],[0.],[0.],[0.]])

# Declarando as matrizes do CVXOPT

c = matrix(c,tc='d')
G = matrix(G,tc='d')
h = matrix(h,tc='d')

# Achando a solução da FOB

(status,x) = ilp(c,G,h,B = set([0,1,2,3,4,5]))

print('Status:',status)
https://colab.research.google.com/drive/1qWY1v-WmAsoxK34x4ltXs6Ewp819xZ02#scrollTo=zfnSTv9-bQFe&uniqifier=2&printMode=true 1/5
08/07/2019 Trabalho_final.ipynb - Colaboratory

fob = c[0]*x[0]+c[1]*x[1]+c[2]*x[2]+c[3]*x[3]+c[4]*x[4]+c[5]*x[5]

print('FOB:',fob)

n = 0
indice = np.shape(x)
atual = indice[0] - 2

print('Posição das Chaves:')

# Imprimindo as posições das chaves

while n < atual:


if x[n] == 0:
print('Chave',n+1,'aberta')
n = n + 1
else:
print('Chave',n+1,'fechada')
n = n + 1

print('Tensão Va =',x[6])
print('Tensão Vb =',x[7])

Status: optimal
FOB: 650.0
Posição das Chaves:
Chave 1 fechada
Chave 2 fechada
Chave 3 fechada
Chave 4 aberta
Chave 5 aberta
Chave 6 aberta
Tensão Va = 8.769230769230768
Tensão Vb = 7.615384615384614

Algoritmo Genético
minimizar 100B1 + 50B2 + 500B3 + 20B4 + 100B5 + 60B6
x

sujeito a: 57B1 − 15B2 + 60B4 − 30B5 − 6(VA − VB ) − 4VA = 0

15B2 + 39B3 + 30B5 + 40B6 + 6(VA − VB ) − 8VB = 0

8.6 ≤ VA ≤ 8.8V

7.5 ≤ VB ≤ 7.7V

B1 , B2 , B3 , B4 , B5 , B6 [0, 1]

# Função Crossover

def Crossover(Pop,taxa_crossover):
N = np.size(Pop,0)
Dim = np.size(Pop,1)
Pais = np.round(np.random.rand(N, 2))
Filhos = Pop
for i in range(np.size(Pais,0)):
if np.random.rand(1) < taxa_crossover:
Pai_1 = Pop[int(Pais[i][0])]
Pai_2 = Pop[int(Pais[i][1])]
if len(Filhos) ==0:
Filhos = np.concatenate((Pai_1[:3],Pai_2[3:6]),axis=None)
else:
Filho = np.concatenate((Pai_1[:3],Pai_2[3:6]),axis=None)
i (( i [ ] i [ ]) i )
https://colab.research.google.com/drive/1qWY1v-WmAsoxK34x4ltXs6Ewp819xZ02#scrollTo=zfnSTv9-bQFe&uniqifier=2&printMode=true 2/5
08/07/2019 Trabalho_final.ipynb - Colaboratory
Filho_1 = np.concatenate((Pai_1[:3],Pai_2[3:6]),axis=None)
Filho_2 = np.concatenate((Pai_1[3:6],Pai_2[:3]),axis = None)
Filhos[i,0] = Filho_1[0]
Filhos[i,1] = Filho_2[1]

return Filhos

# Função Mutação

def Mutacao(Pop,taxa_mutacao,):
N = np.size(Pop, 0)
Mutantes = Pop
for i in range(np.size(Mutantes,0)):
if np.random.rand(1)< taxa_mutacao:
mutacao = Mutantes[i][1]

if mutacao == 0:
Mutantes[i][1] = 1
Mutantes[i,0]= Mutantes[i,0]
Mutantes[i,1]= Mutantes[i,1]
else:
Mutantes[i][1] = 0
Mutantes[i,0] = Mutantes[i,0]
Mutantes[i,1] = Mutantes[i,1]

return Mutantes

# Função Fitness

def Fitness(Pop):
Fitness = []
for i in range(len(Pop)):
B1 = Pop[i][0]
B2 = Pop[i][1]
B3 = Pop[i][2]
B4 = Pop[i][3]
B5 = Pop[i][4]
B6 = Pop[i][5]

if ((B1!=0) or (B1!=1)) or ((B2!=0) or (B2!=1)) or ((B3!=0) or (B3!=1))


or ((B4!=0) or (B4!=1)) or ((B5!=0) or (B5!=1)) or ((B6!=0) or (B6!=1)) :
Fitness.append(0)
else:
Fitness.append(1/(100*B1+50*B2+500*B3+20*B4+100*B5+60*B6+0.4*np.random.rand(1)))

return Fitness

# função Seleção:

def Selecao(Pop,Num_selecao,Num_torneio):
N = np.size(Pop, 0)
Torneio = np.round(-0.5 + N * np.random.rand(Num_selecao, Num_torneio))
Torneio = Torneio.astype(int)
Campeoes = -100*np.ones((Num_selecao,6))
Fitness_Pop = np.array(Fitness(Pop))

for i in range(len(Torneio)):
Fitness_Candidatos = Fitness_Pop[Torneio[i]]
Aux = np.where(Fitness_Candidatos == np.max(Fitness_Candidatos))
Campeao = Pop[Torneio[i,Aux[0][0]]]
Campeoes[i,0] = Campeao[0]
Campeoes[i,1] = Campeao[1]
Campeoes[i,2] = Campeao[2]
Campeoes[i,3] = Campeao[3]
Campeoes[i,4] = Campeao[4]
Campeoes[i,5] = Campeao[5]

return Campeoes

# Caracteristicas do genetico

https://colab.research.google.com/drive/1qWY1v-WmAsoxK34x4ltXs6Ewp819xZ02#scrollTo=zfnSTv9-bQFe&uniqifier=2&printMode=true 3/5
08/07/2019 Trabalho_final.ipynb - Colaboratory

Num_populacao = 1000
taxa_crossover = 0.5
taxa_mutacao = 0.1
Num_geracao = 10
Dim = 6

Pop= np.round(np.random.rand(Num_populacao,Dim))

for i in range(Num_geracao):
print('Geração:',i+1)
solucao = Pop

Filhos = Crossover(Pop,taxa_crossover)
Pop_PaiseFilhos = np.concatenate([Pop,Filhos])
Pop_mutacao = Mutacao(Pop,taxa_mutacao)
Pop = Selecao(Pop_mutacao,Num_populacao,round(Num_populacao/10))

print('Solução',solucao)
FOB = (100*solucao[i,0] + 50*solucao[i,1] + 500*solucao[i,2] + 20*solucao[i,3]
+ 100*solucao[i,4] + 60*solucao[i,5])

print('FOB = ',FOB)
n = 0
indice = np.shape(solucao)
atual = indice[1]

print('Posição das Chaves:')

# Imprimindo as posições das chaves

while n < atual:


if solucao[i,n] == 0:
print('Chave',n+1,'aberta')
n = n + 1
else:
print('Chave',n+1,'fechada')
n = n + 1

Vb = (15*solucao[i,1] + 39*solucao[i,2] + 30*solucao[i,4] + 40*solucao[i,5]


+ 0.6*(57*solucao[i,0] - 15*solucao[i,1] + 60*solucao[i,3] - 30*solucao[i,4]))/(14-3.6)
Va = (57*solucao[i,0] - 15*solucao[i,1] + 60*solucao[i,3] - 30*solucao[i,4] + 6*Vb)/10

print('Tensão Va =',Va)
print('Tensão Vb =',Vb)

https://colab.research.google.com/drive/1qWY1v-WmAsoxK34x4ltXs6Ewp819xZ02#scrollTo=zfnSTv9-bQFe&uniqifier=2&printMode=true 4/5
08/07/2019 Trabalho_final.ipynb - Colaboratory

Geração: 1
Geração: 2
Geração: 3
Geração: 4
Geração: 5
Geração: 6
Geração: 7
Geração: 8
Geração: 9
Geração: 10
Solução [[1. 1. 1. 1. 1. 0.]
[1. 0. 0. 0. 0. 0.]
[1. 1. 1. 0. 0. 0.]
...
[1. 1. 1. 1. 1. 1.]
[1. 1. 0. 1. 1. 1.]
[1. 1. 0. 0. 0. 1.]]
FOB = 650.0
Posição das Chaves:
Chave 1 fechada
Chave 2 fechada
Chave 3 fechada
Chave 4 aberta
Chave 5 aberta
Chave 6 aberta
Tensão Va = 8.76923076923077
Tensão Vb = 7.615384615384615

https://colab.research.google.com/drive/1qWY1v-WmAsoxK34x4ltXs6Ewp819xZ02#scrollTo=zfnSTv9-bQFe&uniqifier=2&printMode=true 5/5

Você também pode gostar