About This File
Refeito: vide informações na versão 11.3.3
Boa Sorte!
# BigMaxRedutor v11.3.3
Solver C++20 para Lottery Covering Designs C(v, k, t, m) com t ≤ m.
Encontra coberturas (k-sets) de tamanho mínimo b tais que todo m-set
do universo é coberto em pelo menos t elementos por algum k-set.
## Arquitetura
Pipeline em camadas, do mais leve ao mais agressivo:
1. **Smart-shrink / greedy-extend** — ajuste de b a partir de solução
inicial existente.
2. **PDO paralelo** (8 workers, Parallel Diversification by Operators)
— exploração estocástica com perturbação adaptativa.
3. **TLS-Dir** (Targeted Local Search Directed) — busca local dirigida
com:
- Random walk em platô com orçamento de movimentos laterais
adaptativo (`LATERAL_BUDGET_BASE = 500`, `MAX = 2000`)
- Tabu list de 512 estados para evitar ciclos
- **LAHC** (Late Acceptance Hill Climbing) com histórico de 500
e até 10.000 iterações por chamada
- Micro-greedy 1-swap e 2-swap exaustivos como último recurso
4. **Perturb-repair** acionado quando TLS-Dir estagna em platô profundo:
- 4 modos rotativos: `pool` (remoção de jogos menos úteis),
`ruin` (remoção uniforme), `force` (inclusão guiada de k-set
que cobre m-sets descobertos), `double` (duas inclusões
simultâneas para incompatibilidades combinatórias)
- Remoção de 8 a 16 jogos por tentativa
- Escolha de qual jogo remover é **guiada por overlap**:
minimiza `excl_outside` = m-sets exclusivos do jogo que não
seriam cobertos pelos k-sets sendo introduzidos
- Probe (30s) → extended (120s) → aggressive (300s) escalonado
por promissoridade
5. **SearchB** (binary search em b) para encontrar o menor b viável.
## Telemetria
Saída `.jsonl` por execução com campos por chamada do TLS-Dir:
`lat_ok`, `lat_tabu` (movimentos laterais aceitos vs rejeitados por
tabu), `lahc_inv`, `lahc_ok` (invocações vs escapes do LAHC),
`mg1_inv`, `mg1_ok`, `mg2_inv`, `mg2_ok` (micro-greedy 1-swap e
2-swap, invocações vs sucessos).
Cada sucesso do `perturb_repair` registra `mode=` e `sub=fase`
identificando qual estratégia destravou o problema.
O relatório final do `perturb_repair` mostra distribuição
percentual de invocações por modo e taxa de escalonamento para
extended/aggressive.
## Robustez
- Checkpoint salva via `write tmp → fsync → rename`. Atômico em
termos de visibilidade e durável em termos de disco.
No Windows usa `_commit()` do CRT (evita colisão de macros do
`<windows.h>`).
- `covered_t` é `uint16_t` saturado (suporta multiplicidade até
65.535), revertido de `uint8_t` em v10.1 após bug de saturação
em problemas com `b > 255`.
- `recalc_excl` com flag `excl_dirty` evita recálculos O(b·|ms_per|)
redundantes quando não há `apply_swap` desde o último recálculo.
## Sumário das mudanças v11.3.3
- `LATERAL_BUDGET_BASE` 50 → 500
- `LATERAL_BUDGET_MAX` 500 → 2000
- `TABU_LIST_SIZE` 128 → 512
- `LAHC_MAX_ITERS` 3000 → 10000
- `LAHC_TIMEOUT_S` 30 → 60
- `PR_REMOVE_MIN` 3 → 8, `PR_REMOVE_MAX` 12 → 16
- Substituição guiada por overlap em `_pr_force_include` e
`_pr_double_force_include`
- Telemetria de modo no `perturb_repair` (`mode=%s sub=%s`)
- `fsync` no checkpoint via `_commit()` portátil
- Flag `excl_dirty` em `run_tls_directed`
## Arquivos principais
| Arquivo | Responsabilidade |
|---|---|
| `bigmax_types.h` | Tipos, constantes, tabela binomial, sistema combinatório |
| `bigmax_cover.h` | rank/unrank, expansão combinatória, cache de cobertura |
| `bigmax_greedy.h` | Construção inicial e extensão direcionada |
| `bigmax_worker.h` | PDO worker e TLS-Dir |
| `bigmax_perturb_repair.h` | Kick estrutural com 4 modos |
| `bigmax_shrink_repair.h` | Pool de jogos menos úteis para shrink |
| `bigmax_checkpoint.h` | Persistência atômica + métricas JSONL |
| `bigmax_solver.h/.cpp` | Orquestração de rounds e Record Breaker |
| `main.cpp` | CLI |
## Requisitos
- C++20 (testado com MSVC 2022 e g++ 11+)
- Sem dependências externas; `<filesystem>`, `<thread>`, `<future>` da stdlib
## Limites conhecidos
- `BinomTable::MAX_N = 64`. Problemas com V > 64 não compilam.
- Cache `CoverCache::MAX_SIZE = 65536` (entradas LRU).
- Para problemas com cost ≤ 4 em platôs combinatorialmente fechados
(todos os jogos com `excl ≥ 1`), o solver tende a estagnar — é o
diagnóstico empírico de que b está próximo do mínimo prático.
What's New in Version 1.0.3 See changelog
Released
Arquivos essências para compilar Visual Studio e gerar executável.
Informações da versão atual no spoiler:
BigMaxRedutor v10.2 — Estado Atual
Linhagem do código
VersãoFasePrincipais característicasv10 → v10.1Estabilizaçãocovered_t voltou para uint16_t (uint8_t saturava em b>255)v10.1 → v10.2Esta entregaAnti-platô: orçamento adaptativo, tabu, LAHC, kick early, telemetria
Arquitetura em camadas
O solver opera em três camadas concêntricas, cada uma cobrindo o que a anterior não cobre:
1. PDO Workers (paralelo, 8 threads) — exploração ampla. Cada worker faz worker_pdo com adaptação de j_max via AdaptivePDOJ. Aceita Δ=0 desde sempre. Produz diversidade de configurações para alimentar a próxima camada.
2. TLS-Dir (single-thread, sequencial) — refinamento local. Recebe a melhor configuração dos workers, faz busca local dirigida com:
(novo v10.2) Orçamento adaptativo de movimentos laterais: max(50, custo×2), capado em 500. Em v10.1 era hardcoded em 5.
(novo v10.2) Tabu list (deque + hashset, 128 entradas) com hash incremental por XOR — previne ciclos durante random walk em platô
(novo v10.2) Fase LAHC (Late Acceptance Hill Climbing) entre platô e micro-greedy: buffer circular de 500 custos, aceita movimento se cost ≤ max(atual, hist[head]), sem schedule de temperatura
Micro-greedy 1-swap exaustivo + 2-swap dirigido (mantido de v10.1) como último recurso
3. RecordBreaker loop (top-level) — escape de bacias profundas. Quando TLS-Dir trava:
(novo v10.2) Kick adaptativo: dispara após 3 rounds se custo > 10; mantém 8 rounds se custo baixo (vale insistir na busca local)
Smart_shrink + greedy_extend como mecanismo de perturbação
Restart completo a cada 3 kicks (greedy_initial puro)
Telemetria (novo v10.2)
TLSTelemetry acumula 8 contadores por chamada de TLS-Dir, propagados para MetricsLog (.jsonl):
lateral_accepts — Δ=0 aceitos (random walk produtivo)
lateral_rejects_tabu — Δ=0 rejeitados por tabu (evidência de ciclos evitados)
lahc_invocations — quantas vezes LAHC entrou em ação
lahc_escapes — ... e quantas escapou do platô
micro_greedy_calls — 1-swap exaustivo invocado
micro_greedy_success — ... com sucesso
two_swap_calls — 2-swap dirigido invocado
two_swap_success — ... com sucesso
Impressos no fim de cada chamada e no JSON de métricas. Sem isso, era impossível auditar empiricamente o comportamento do solver — agora é direto.
Validação empírica observada
No log do cenário V=24, K=9, T=7, M=9, b=1242 (Round 7):
TLS-Dir produziu cascata de 90+ melhoras consecutivas (221 → 131) — comportamento que v10.1 não conseguia
lat_ok=426 significa 426 movimentos laterais produtivos numa única chamada — random walk em platô realmente funcionando
LAHC=3/34 — escapes raros mas reais; quando acontecem, destravam o solver
KICK adaptativo disparou em ~22 minutos em vez de ~60 minutos com config v10.1
Limitações conhecidas
Algumas observações honestas extraídas dos logs:
mg1_success = 0 em todos os logs vistos: o micro-greedy 1-swap nunca acerta. Sinaliza que problemas onde TLS-Dir trava genuinamente exigem encadeamento de múltiplas trocas com piora intermediária — terreno de SA com schedule, que não está em v10.2
A primeira chamada de TLS-Dir pós-shrink frequentemente fica improdutiva (configuração ainda não diversificada). É a chamada após o PDO workers passar que tipicamente produz progresso. Sugere que faz sentido considerar inverter ordem na fase imediata em versões futuras
Para records consagrados de longa data (como 1249 em V=24K9T7M9 desde 2021), v10.2 é estatisticamente improvável de melhorar em horas de execução. Para parâmetros onde o "Known design" é mais frágil ou inexistente, é solver competitivo
Arquivos do projeto
ArquivoStatusNotasbigmax_types.hModificadoVersão v10.2, struct TLSTelemetry, novas constantesbigmax_worker.hModificadoTabuList, kset_hash, LAHC, orçamento adaptativobigmax_solver.hModificadoAcumulador tls_telem_totalbigmax_solver.cppModificadoKick adaptativo, propagação de telemetriabigmax_checkpoint.hModificadoOverload record(...) com TLSTelemetrybigmax_cover.hInalteradoMotor de cobertura (LRU cache, radix sort)bigmax_greedy.hInalteradoGreedy initial/extend/shrink/replacemain.cppInalteradoSetup interativo, signal handlers
Para usar
Compilação: Visual Studio Release | x64 | C++20, sem dependências externas. Validado com g++ 13.3 -Wall -Wextra (sem warnings) e MSVC (compilação em ~7s, sem warnings).
Checkpoints e arquivos record_*.txt da v10.1 são lidos sem alteração — formato compatível.
Caminho futuro plausível (se quiser revisitar)
Sugestão:
v10.3 (SA controlado no TLS-Dir) — aceitação probabilística de Δ<0 com exp(Δ/T), T calibrado para ~30% de aceitação inicial. Ataca diretamente o sintoma mg1_success=0. ~30 linhas de código.
v10.4 (VNS estendido) — permitir expansão temporária acima de b durante busca local, depois shrink de volta. Explora vizinhança que kick simples não acessa.
Logs estruturados em pandas — análise post-mortem das jsonl para entender em que regime de custo cada técnica funciona melhor.
Esses são pontos para retomar quando/se fizer sentido. v10.2 é entrega completa por si só.
