O problema de otimização em sistemas de energia híbridos envolve minimizar o custo operacional total considerando geração fotovoltaica, armazenamento e diesel. A abordagem utiliza o algoritmo de otimização por enxame de partículas (PSO) em MATLAB, onde cada partícula representa uma solução candidata no espaço de busca.
A função objetivo é projetada para avaliar o custo com base nas potências dos componentes. As variáveis de decisão são normalizadas para o intervalo [0,1], facilitando a exploração pelo PSO. A seguir, uma versão revisada da função de adaptação:
function custo_total = calcular_custo(posicao)
% Mapeamento para valores reais de potência
geracao_solar = posicao(1) * 120; // kW, faixa 0-120
operacao_bateria = posicao(2) * 40 - 20; // kW, faixa -20 a 20
carga_diesel = posicao(3) * 180; // kW, faixa 0-180
% Cálculo dos custos individuais
custo_solar_fixo = 0.28 * geracao_solar;
custo_bateria_var = 0.12 * abs(operacao_bateria);
custo_diesel_nlinear = carga_diesel * (0.42 + 0.08 * (carga_diesel / 180)^2);
custo_soma = custo_solar_fixo + custo_bateria_var + custo_diesel_nlinear;
% Penalidade por restrições operacionais
violacao = (geracao_solar > 100) || (carga_diesel < 40);
penalidade = violacao * 9000;
custo_total = custo_soma + penalidade;
end
No loop principle do PSO, as partículas são atualizadas iterativamente. A implementação abaixo incorpora um mecanismo de reinício simples para escapar de ótimos locais:
% Configurações do PSO
num_individuos = 35;
limite_geracoes = 220;
peso_inercia = 0.65;
coef_cognitivo = 1.48;
coef_social = 1.48;
% Inicialização das populações
posicoes_correntes = rand(num_individuos, 3);
velocidades_correntes = zeros(num_individuos, 3);
melhores_posicoes_ind = posicoes_correntes;
melhores_custos_ind = inf(num_individuos, 1);
melhor_solucao_global = [];
melhor_custo_global = inf;
geracao = 1;
while geracao <= limite_geracoes
% Avaliação de todas as partículas
for idx = 1:num_individuos
custo_avaliado = calcular_custo(posicoes_correntes(idx,:));
if custo_avaliado < melhores_custos_ind(idx)
melhores_custos_ind(idx) = custo_avaliado;
melhores_posicoes_ind(idx,:) = posicoes_correntes(idx,:);
end
end
% Atualização da melhor solução global
[custo_minimo, indice_min] = min(melhores_custos_ind);
if custo_minimo < melhor_custo_global
melhor_custo_global = custo_minimo;
melhor_solucao_global = melhores_posicoes_ind(indice_min,:);
end
% Verificação de estagnação
if geracao > 15 && mod(geracao, 8) == 0 && melhor_custo_global == custo_anterior
indices_reiniciar = randperm(num_individuos, floor(num_individuos/2));
posicoes_correntes(indices_reiniciar,:) = rand(length(indices_reiniciar), 3);
end
custo_anterior = melhor_custo_global;
% Movimentação das partículas
for idx = 1:num_individuos
vetor_aleatorio1 = rand(1, 3);
vetor_aleatorio2 = rand(1, 3);
velocidades_correntes(idx,:) = peso_inercia * velocidades_correntes(idx,:) ...
+ coef_cognitivo * vetor_aleatorio1 .* (melhores_posicoes_ind(idx,:) - posicoes_correntes(idx,:)) ...
+ coef_social * vetor_aleatorio2 .* (melhor_solucao_global - posicoes_correntes(idx,:));
posicoes_correntes(idx,:) = posicoes_correntes(idx,:) + velocidades_correntes(idx,:);
posicoes_correntes(idx,:) = min(max(posicoes_correntes(idx,:), 0), 1);
end
geracao = geracao + 1;
end
Para gerenciar restrições acopladas, como a operação exclusiva da bateria em modo carga ou descarga, a decodificação das posições inclui lógica condicional. Quando a bateria está em modo de carga, o limite mínimo do gerador a diesel é elevado para garantir a estabilidade do sistema.
Experimentos numéricos sugerem que populações entre 30 e 50 partículas e um número de iterações superior a 200 oferecem um equilíbrio entre precisão e tempo de computação. A fixação do peso de inércia mostrou-se mais estável em comparação com estratégias de decaimento dinâmico em diversos cenários testados.