Projeto de Circuitos Eletrônicos com Algoritmo Genético

Acessado 2533 vezes.
Como citar esse artigo: VERTULO, Rodrigo Cesar. Projeto de Circuitos Eletrônicos com Algoritmo Genético. Disponível em: <http://labdeeletronica.com.br/noticias/projeto-de-circuitos-eletronicos-com-algoritmo-genetico/>. Acessado em: 14/10/2024.


O projeto de circuitos eletrônicos tradicionalmente envolve a aplicação de uma grande variedade de métodos analíticos e numéricos relacionados às leis da eletrônica e eletricidade, como por exemplo as Leis de Ohm e Kirchhoff entre outras. Para circuitos mais simples a utilização desses métodos pode ser feita de forma relativamente rápida e fácil, sem a necessidade de se recorrer a métodos computacionais mais poderosos. Contudo, quando se trata de circuitos mais complexos até mesmo o uso de computadores para a criação de modelos computacionais que resolvam esse tipo de problema pode representar um grande desafio. Essa dificuldade surge principalmente pela necessidade de se transpor toda a análise do circuito utilizando os métodos numéricos e analíticos já citados em um modelo computacional que possa ser utilizado pela máquina para a resolução do problema. Dependendo da complexidade do circuito em questão, essa pode não ser uma tarefa trivial.

Um cenário ideal seria aquele em que utilizando-se um único modelo computacional fosse possível resolver uma grande variedade de circuitos sem que fosse preciso recodificá-lo ou fazendo mudanças mínimas no mesmo. Uma alternativa para se atingir uma solução como essa é a utilização de Inteligência Artificial. Nesse artigo é apresentado um algoritmo capaz de tornar real o cenário ideal citado anteriormente. Em especial será apresentado um Algoritmo Genético capaz de identificar um ou mais valores de componentes eletrônicos presentes em um circuito eletrônico para que se obtenha uma resposta desejada no mesmo. É importante destacar que o Algoritmo Genético será capaz de realizar seu trabalho sem que ele possua qualquer conhecimento sobre os métodos analíticos e numéricos tradicionais, nem mesmo sobre as leis da eletrônica utilizadas para a análise e projeto de circuitos eletrônicos. Em outras palavras, o Algoritmo Genético “aprenderá” a melhor forma de resolver o problema e fornecerá um resultado que, quando não for ótimo, será muito próximo disso.

No artigo presente no endereço http://labdeeletronica.com.br/algoritmos-geneticos-e-raspberry-pi-parte-2-principios/ é possível encontrar informações sobre o princípio de funcionamento de um Algoritmo Genético. Nesse texto não será apresentado o funcionamento interno de um Algoritmo Genético, de modo que o foco será na aplicação dele no domínio do design e projeto de circuitos eletrônicos. Durante a demonstração serão utilizadas as seguintes tecnologias:

 

O princípio de funcionamento do Algoritmo Genético é bastante simples. Foi criado um circuito eletrônico na ferramenta LTSpice possuindo entre seus componentes eletrônicos um cujo valor deverá ser determinado pelo Algoritmo Genético a fim de se obter uma resposta desejada do circuito. Nesse artigo será apresentado um circuito bastante simples cuja resolução poderia ser feita tranquilamente de forma manual. Entretanto, o importante será notar que o Algoritmo Genético será capaz de resolver o problema sem possuir qualquer conhecimento sobre as leis da eletrônica ou eletricidade. O processo de resolução adotado pelo Algoritmo Genético pode ser aplicado a outros circuitos eletrônicos mais complexos realizando-se poucas ou nenhuma alteração no código base. A seguir é apresentado o circuito que será utilizado nesse artigo.

 

Fig. 1 – Circuito eletrônico que será resolvido pelo Algoritmo Genético.

 

No circuito eletrônico da Fig. 1 o objetivo será identificar o valor do resistor Rb de modo que a tensão sobre ele seja de 6 V. Esse problema poderia ser facilmente resolvido utilizando-se as leis da eletrônica e eletricidade já conhecidas. O desafio do Algoritmo Genético será resolver o problema sem possuir qualquer conhecimento sobre essas leis.

Para que o Algoritmo Genético seja capaz de reconhecer o circuito apresentado, o mesmo foi transformado em uma representação textual utilizando-se a sintaxe do LTSpice e gravado em um arquivo chamado “circuito.txt”. Essa representação pode ser vista a seguir.

 

Rc N003 0 2k
Ra N001 N002 5k
V1 N001 0 12
Rb N002 N003 {Rb}
.op
.param Rb=1
.backanno
.end

 

Na representação textual do circuito pode-se notar que ao resistor Rb foi atribuído um valor inicial de 1 Ohm, porém, poderia ter sido atribuído qualquer outro valor. De posse dessas informações o Algoritmo Genético procurará dentro de um espaço de possíveis soluções diversos valores para o resistor Rb, informando-os nessa representação textual do circuito e solicitando ao LTSpice que ele avalie cada uma das possíveis soluções até que uma se aproxime do resultado esperado, ou seja, aquela que fará com que a tensão sobre o resistor Rb seja de 6 V.

Para conseguir realizar essa tarefa o Algoritmo Genético faz uso de uma função objetivo que deve ser maximizada durante todo o processamento computacional. A função objetivo criada pode ser vista a seguir.

 

F(x) = A – ((VRbd – VRbc)**2)**0.5

 

Em que:

F(x) = Valor da função objetivo
A = Valor arbitrário para transformar um problema de minimização em um de maximização
VRbd = Valor desejado da tensão sobre o resistor Rb
VRbc = Valor da tensão sobre o resistor Rb obtida pelo LTSpice a cada simulação

No caso do algoritmo que foi criado, a função objetivo assumiu a seguinte forma:

 

F(x) = 100 – ((6 – VRbc)**2)**0.5

 

O valor 100 foi definido de forma empírica, de modo que a cada geração de soluções criada pelo Algoritmo Genético é esperado que o valor de F(x) se aproxime do valor 100, indicando que VRbc se aproxima de 6 V.

 

import ltspy3
import subprocess
from PyGARV import *
import matplotlib.pyplot as plt
 
class AGCircuito(PyGARV):
    def __init__(self):
        super().__init__(popSize = 15,
                         values = 16,
                         mutationRate = 0.2,
                         fullMutation = True,
                         symmetricCut = False,
                         crossoverRate = 1,
                         elitism = 0.1,
                         digits = 2)
 
        self.tensaoDesejada = 6
        self.tensoes = []
 
    def trocaResistencia(self, novoValor):
        arq = open('circuito.txt', 'r')
        dados = arq.readlines()
        arq.close()
        dados[6] = '.param Rb=' + str(novoValor) + '\n'
        arq = open('circuito.txt', 'w')
        arq.writelines(dados)
        arq.close()
 
 
    def avaliaCircuito(self):
        subprocess.call('XVIIx64.exe -b circuito.txt')
        sd = ltspy3.SimData('circuito.raw')
        dc_op = sd.values
        return dc_op
 
    def converteCromoToNumber(self, cromo):
        soma = 0
        for i in range(len(cromo)):
            if cromo[i] == 1:
                soma = soma + (2**i)  
        return soma
 
    def fitness(self, cromossomo):
        self.convertToBin(cromossomo)
        valorR = self.converteCromoToNumber(cromossomo)
        self.trocaResistencia(valorR)        
        vr = self.avaliaCircuito()[2]        
        nota = 100 - ((self.tensaoDesejada - vr)**2)**0.5
        print(nota, vr)
        return [cromossomo, nota]
 
    def finishedGeneration(self, melhorCromossomo):
        valorR = self.converteCromoToNumber(melhorCromossomo)
        self.trocaResistencia(valorR)
        self.tensoes.append(self.avaliaCircuito()[2])
        print(melhorCromossomo, valorR, self.avaliaCircuito()[2])
 
 
pygarv = AGCircuito()
pygarv.runGA(15)
plt.plot(pygarv.tensoes)
plt.show()

O princípio de funcionamento da biblioteca PyGARV utilizada para a criação do Algoritmo Genético é bastante simples e pode ser conferido no endereço https://github.com/rvertulo/PyGARV

A parte do código mais importante do algoritmo criado está localizada no método “fitness” que é reapresentado a seguir para facilitar a explicação.

def fitness(self, cromossomo):
        self.convertToBin(cromossomo)
        valorR = self.converteCromoToNumber(cromossomo)
        self.trocaResistencia(valorR)        
        vr = self.avaliaCircuito()[2]        
        nota = 100 - ((self.tensaoDesejada - vr)**2)**0.5
        print(nota, vr)
        return [cromossomo, nota]

Para cada cromossomo (solução) possível existente na geração atual o método “fitness” é executado e em sua essência ele realiza as seguintes atividades:

• Converte o cromossomo atual para um valor numérico inteiro representando o valor da resistência Rb
• Substitui o valor de Rb no circuito eletrônico
• Simula o circuito no LTSpice e obtém o valor da tensão sobre Rb
• Aplica a função objetivo o obtém a nota (F(x)) do cromossomo atual
• Repete as etapas acima para cada cromossomo da geração e para todas as gerações

No caso do algoritmo apresentado, ele é executado por 15 gerações e ao final obtém-se o melhor valor para o resistor Rb obtido por ele. Nem sempre um Algoritmo Genético consegue obter valores ótimos para a resolução dos problemas, contudo, ele costuma obter valores quase ótimos, suficientemente bons para serem utilizados ou para servirem como ponto de partida para a solução dos problemas.

Para a escrita desse artigo o Algoritmo Genético criado foi executado por três vezes e os resultados obtidos em cada execução podem ser observados a seguir. Em cada gráfico pode-se observar a queda de tensão sobre o resistor Rb a cada geração processada pelo Algoritmo Genético.

 


Fig. 2 – Primeira execução do Algoritmo Genético
Valor encontrado para Rb = 2527 Ohms
Valor da tensão sobre Rb = 5.7 V

 


Fig. 3 – Segunda execução do Algoritmo Genético
Valor encontrado para Rb = 4100 Ohms
Valor da tensão sobre Rb = 6.59 V

 


Fig. 4 – Terceira execução do Algoritmo Genético
Valor encontrado para Rb = 3329 Ohms
Valor da tensão sobre Rb = 6.19 V

 

As três execuções mostram que o Algoritmo Genético não foi capaz de encontrar o valor ótimo para o valor do resistor Rb que fosse capaz de gerar exatamente 6 V de tensão sobre ele. Contudo, os valores obtidos foram quase ótimos, sendo a terceira execução aquela que gerou o melhor resultado com Rb = 3329 Ohms com queda de tensão de 6.19 V. Se a média entre os três valores for considerada tem-se para Rb o valor de 3318 Ohms com queda de tensão de 6.18 V.

É importante destacar que o Algoritmo Genético chegou a esses valores sem possuir qualquer conhecimento prévio sobre os métodos numéricos e analíticos para a resolução de circuitos eletrônicos. Para um circuito simples como o apresentado pode-se argumentar que não existem vantagens na utilização de um Algoritmo Genético como esse, porém, o mesmo código poderia ser utilizado em situações mais complexas cuja resolução por outros meios se mostrariam demoradas ou até mesmo inviáveis.

O experimento apresentado confirma a viabilidade na utilização da Inteligência Artificial, em especial dos Algoritmos Genéticos, para o projeto de circuitos eletrônicos e os resultados obtidos mostram o grande potencial da utilização desse tipo de solução na Engenharia Eletrônica.

Eletrônica Simples Para Projetos Complexos
Deixe de ser alguém que fica copiando e colando circuitos da Internet e passe a ser um projetista capaz de criar soluções inovadoras com esse poderoso componente.

Comentários