Pular para o conteúdo principal

Formulação Matemática da Função de Fitness 📐

No Algoritmo Genético do Monvix, o objetivo é minimizar uma função de perda quadrática ponderada com barreiras de penalidade estritas para violações de piso (Barrier Penalty Method).


🎯 Equação Geral da Função de Perda

A função de perda (Loss Function) de um indivíduo wΔ7w \in \Delta^7 é calculada por:

Loss(w)=i=18Wi(wiTi)2Penalidade de Desvio de Alvo+1500.0i=18max(0,Fiwi)2Barreira de Violac¸a˜o de Pisos Protegidos\text{Loss}(w) = \underbrace{\sum_{i=1}^8 W_i \cdot (w_i - T_i)^2}_{\text{Penalidade de Desvio de Alvo}} + \underbrace{1500.0 \cdot \sum_{i=1}^8 \max(0, F_i - w_i)^2}_{\text{Barreira de Violação de Pisos Protegidos}}

A aptidão (Fitness) evolucionária é definida como o inverso negativo da perda:

Fitness(w)=Loss(w)\text{Fitness}(w) = -\text{Loss}(w)

Indivíduos com menor perda possuem maior aptidão e, portanto, maior probabilidade de serem selecionados no torneio de reprodução.


⚖️ Vetor de Pesos de Importância (WW)

O vetor de pesos WiW_i determina a gravidade com que o algoritmo penaliza o desvio em relação ao alvo ideal TiT_i:

Balde (ii)Peso Base (WiW_i)Peso com Gasto DeclaradoJustificativa
Alimentação5.030.0Se o usuário declarou compras de supermercado, o algoritmo trata a meta com máxima rigidez.
Transporte2.520.0Alta rigidez quando custos de deslocamento são informados.
Saúde4.020.0Preservação de planos de saúde e medicamentos contínuos.
Quitação de Dívidas8.08.0Alta pressão para eliminar juros compostos negativos.
Reserva de Emergência3.53.5Proteção de liquidez conforme vínculo empregatício.
Apoio Familiar3.03.0Escalonado por dependentes residentes.
Investimentos & Futuro3.03.0Alavanca de longo prazo.
Lazer & Estilo de Vida1.51.5Balde de maior flexibilidade e absorção de choques orçamentários.

🛡️ A Barreira de Penalidade de Piso (K=1500.0K = 1500.0)

O termo:

Ppiso(w)=1500.0i=18max(0,Fiwi)2P_{\text{piso}}(w) = 1500.0 \cdot \sum_{i=1}^8 \max(0, F_i - w_i)^2

onde FiF_i é o piso mínimo admissível para o balde ii.

A constante 1500.01500.0 atua como uma barreira multiplicativa extremamente íngreme. Se qualquer mutação estocástica gerar um indivíduo cuja alocação de alimentos ou saúde fique abaixo do piso mínimo FiF_i, sua perda dispara em ordens de magnitude. No passo seguinte de seleção por torneio, esse indivíduo é sumariamente descartado da linhagem genética.


🔍 Implementação no Código-Fonte

O cálculo exato implementado em app/ga/optimizer.py aproveita operações vetorizadas do NumPy em C:

@staticmethod
def _evaluate_loss(
individual: np.ndarray,
targets: np.ndarray,
floors: np.ndarray,
weights: np.ndarray,
) -> float:
target_penalty = np.sum(weights * ((individual - targets) ** 2))
floor_violations = np.maximum(0.0, floors - individual)
return float(target_penalty + 1500.0 * np.sum(floor_violations**2))

👉 Veja os Pisos e Regras de Negócio Detalhados →