Sistema de Constraints (Restrições)
O sistema de constraints do OptFlow permite definir restrições que as soluções devem respeitar durante a otimização. As constraints são expressões que limitam valores de indicadores, garantindo que a solução otimizada atenda a critérios específicos de viabilidade.
Conceito de Constraints
Uma constraint é uma fórmula matemática que define uma restrição. O OptFlow segue a convenção onde:
- Constraint satisfeita: Valor ≤ 0 (a solução é viável)
- Constraint violada: Valor > 0 (a solução é inviável)
Exemplo
Se você quer que a fila máxima em uma seção não ultrapasse 50 veículos:
- Se a fila for 40: resultado = -10 (satisfeita, com folga) - Se a fila for 60: resultado = +10 (violada em 10 veículos)Configurando Constraints
1. Acessando a Configuração
- Faça login na plataforma OptFlow
- Navegue até a aba "Constraints" ou "Restrições"
- Adicione suas fórmulas de constraint
2. Sintaxe das Fórmulas
As fórmulas de constraint seguem a mesma sintaxe das fórmulas de desempenho:
# Limite máximo de atraso
"Delay Time" - 100
# Limite mínimo de fluxo (inverta o sinal para >= )
500 - "Flow"
# Limite de fila em seção específica
"Mean Queue Section 456" - 30
# Constraint combinada
("Delay Time" / 50) + ("Number of Stops" / 100) - 1
3. Estrutura JSON
{
"constraints_formulas": [
"\"Delay Time\" - 100",
"\"Mean Queue Section 456\" - 30",
"500 - \"Flow\""
]
}
Tipos Comuns de Constraints
Limites Máximos
Restringe indicadores para não ultrapassarem um valor:
# Atraso máximo de 120 segundos
"Delay Time" - 120
# Fila máxima de 40 veículos
"Max Queue" - 40
# Velocidade mínima de 20 km/h (inverte para <=)
20 - "Mean Speed"
Limites em Seções Específicas
Aplicar constraints a seções ou nós específicos:
# Fila máxima na seção 12345
"Mean Queue Section 12345" - 25
# Atraso máximo no nó 67890
"Node Delay 67890" - 60
Constraints Relativas
Comparar indicadores entre si ou com valores de referência:
# Atraso não pode ser mais que 50% maior que um valor base
"Delay Time" - 75 # onde 75 = 50 * 1.5
# Proporção entre indicadores
"Delay Time" / "Travel Time" - 0.3 # atraso < 30% do tempo de viagem
Avaliação de Viabilidade
Durante a Otimização
O OptFlow avalia as constraints após cada simulação:
- Calcular valores: Cada fórmula de constraint é avaliada com os indicadores da simulação
- Verificar viabilidade: Se todos os valores ≤ 0, a solução é viável
- Calcular violação total: Soma dos valores positivos (violações)
Resumo de Violação
Após cada trial, o OptFlow gera um resumo:
{
"feasible": false,
"constraints": [
{"index": 0, "formula": "\"Delay Time\" - 100", "value": -15.3, "violated": false},
{"index": 1, "formula": "\"Max Queue\" - 40", "value": 12.5, "violated": true}
],
"total_violation": 12.5
}
Integração com Samplers
Diferentes samplers tratam constraints de maneiras diferentes:
| Sampler | Tratamento de Constraints | Descrição |
|---|---|---|
| TPE | ✅ constraints_func |
Usa função de constraint nativa |
| NSGA-II | ✅ constraints_func |
Integração nativa para multi-objetivo com restrições |
| NSGA-III | ✅ constraints_func |
Similar ao NSGA-II |
| CMAES | ⚠️ Penalização | Converte violações em penalidade na função objetivo |
| Random | ⚠️ Filtro | Soluções inviáveis são marcadas |
c-TPE
O OptFlow usa automaticamente o c-TPE (Constrained TPE) quando constraints são definidas. Este é um algoritmo especializado que incorpora as restrições diretamente no modelo probabilístico.
Visualização de Constraints
Na interface de monitoramento, você pode acompanhar:
- Status de viabilidade de cada trial
- Valores de cada constraint em tempo real
- Evolução da violação total ao longo das iterações
┌────────────────────────────────────────────────────────────────┐
│ Status de Constraints │
├────────────────────────────────────────────────────────────────┤
│ Trial #42 Status: ✅ VIÁVEL │
├────────────────────────────────────────────────────────────────┤
│ Constraint │ Valor │ Limite │ Status │
├───────────────────────────────┼──────────┼─────────┼──────────┤
│ "Delay Time" - 100 │ -15.3 │ ≤ 0 │ ✅ OK │
│ "Max Queue" - 40 │ -8.2 │ ≤ 0 │ ✅ OK │
│ 500 - "Flow" │ -230 │ ≤ 0 │ ✅ OK │
└────────────────────────────────────────────────────────────────┘
Boas Práticas
1. Defina Constraints Realistas
# ❌ Muito restritivo - pode não haver solução viável
"Delay Time" - 10
# ✅ Razoável - permite alguma flexibilidade
"Delay Time" - 60
2. Use Margens de Segurança
# Se o limite real é 50, use um pouco menos para garantir
"Max Queue" - 45 # limite efetivo de 45, não 50
3. Priorize Constraints Críticas
Se você tem muitas constraints, comece com as mais importantes:
- Constraints de segurança (filas em áreas sensíveis)
- Constraints operacionais (tempos mínimos de verde)
- Constraints de desejabilidade (metas de desempenho)
4. Monitore a Viabilidade
Se muitas soluções são inviáveis, suas constraints podem estar muito restritivas:
5. Combine com Multi-Objetivo
Constraints funcionam bem com otimização multi-objetivo:
{
"objectives": [
{"name": "Minimizar Atraso", "formula": "\"Delay Time\"", "direction": "minimize"},
{"name": "Maximizar Fluxo", "formula": "\"Flow\"", "direction": "maximize"}
],
"constraints_formulas": [
"\"Max Queue\" - 40",
"20 - \"Mean Speed\""
]
}
Exemplos de Uso
Exemplo 1: Corredor com Limite de Fila
Otimizar tempos de verde mantendo filas curtas em aproximações críticas:
{
"performance_formula": "\"Delay Time\"",
"direction": "minimize",
"constraints_formulas": [
"\"Mean Queue Section 1001\" - 25",
"\"Mean Queue Section 1002\" - 30",
"\"Mean Queue Section 1003\" - 20"
]
}
Exemplo 2: Multi-Objetivo com Restrições
Otimizar atraso e fluxo com restrições de velocidade mínima:
{
"objectives": [
{"name": "Atraso", "formula": "\"Delay Time\"", "direction": "minimize"},
{"name": "Fluxo", "formula": "\"Flow\"", "direction": "maximize"}
],
"constraints_formulas": [
"15 - \"Mean Speed\"",
"\"Density\" - 50"
]
}
Próximos Passos
- Métricas Avançadas: Use métricas granulares nas constraints
- Configuração: Configure limites de variáveis
- Monitoramento: Acompanhe o status de viabilidade em tempo real