Ir para o conteúdo

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:

"Mean Queue Section 123" - 50
- 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

  1. Faça login na plataforma OptFlow
  2. Navegue até a aba "Constraints" ou "Restrições"
  3. 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:

  1. Calcular valores: Cada fórmula de constraint é avaliada com os indicadores da simulação
  2. Verificar viabilidade: Se todos os valores ≤ 0, a solução é viável
  3. 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:

  1. Constraints de segurança (filas em áreas sensíveis)
  2. Constraints operacionais (tempos mínimos de verde)
  3. Constraints de desejabilidade (metas de desempenho)

4. Monitore a Viabilidade

Se muitas soluções são inviáveis, suas constraints podem estar muito restritivas:

Iterações 1-50:
- Viáveis: 8 (16%)
- Inviáveis: 42 (84%)  ⚠️ Constraints 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