Implementación para calcular el máximo número de paneles rectangulares a×b que caben dentro de un techo rectangular x×y, permitiendo rotación 0°/90°, y dibujar el layout resultante.
- Lenguaje: Python 3.11
- Frontend: Streamlit
- Algoritmo: cortes guillotina con memoización (DP +
@lru_cache) para piezas idénticas. El enfoque evita depender del área disponible y respeta la rigidez de los paneles.
Easter‑egg opcional: escribir
ruufen el campo Unidad activa un modo de depuración que numera los paneles y habilita la descarga de un PNG del layout.
docker compose up --build
# Abrir: http://localhost:8501- Cuando no se monta el código como volumen, cualquier cambio en
.pyrequiere reconstruir:
docker compose up --build --force-recreate
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
streamlit run app.pypack_count_and_layout(x, y, a, b, precision=0.1) -> (count, placements, meta)- Escalado a enteros mediante
precisionpara decisiones exactas. - Llamado a
_pack_cached(W, H, w, h)que:- prueba ambas orientaciones del panel (0°/90°);
- coloca una grilla máxima de paneles completos;
- explora dos particiones guillotina (franja derecha o superior);
- selecciona la alternativa con mayor cantidad de paneles;
- memoiza subproblemas repetidos con
@lru_cache.
- Lectura de parámetros (
x, y, a, b, precision) en la barra lateral. - Llamado a
pack_count_and_layout. - Dibujo del techo y paneles con
matplotlib. - Modo debug opcional (
ruufen Unidad): numeración en celdas y botón para descargar PNG.
.
├── app.py
├── packing.py
├── requirements.txt
└── README.md
tests/test_packing.py:
from packing import pack_count_and_layout
def test_counter_example():
c, _, _ = pack_count_and_layout(20, 3, 2, 2, precision=1)
assert c == 10
def test_rotated():
c, _, _ = pack_count_and_layout(5, 3, 2, 1, precision=1)
assert c == 7
def test_edge():
c, _, _ = pack_count_and_layout(3, 3, 2, 2, precision=1)
assert c == 1Ejecución:
pip install pytest
pytest -q- El algoritmo modela piezas rígidas y no realiza cortes parciales.
- El parámetro
precisioncontrola el escalado a enteros cuando se ingresan decimales. - La disposición dibujada corresponde a una solución óptima dentro del esquema guillotina considerado.