Las capacidades máximas, las ocupaciones mínimas y las compatibilidades modifican el conteo de distribuciones posibles.
En una distribución básica podemos colocar objetos libremente. En situaciones reales, cada recipiente puede tener una capacidad, una cantidad mínima o condiciones de compatibilidad.
Las restricciones se incorporan al modelo antes de contar. A veces se resuelven transformando las variables; otras veces requieren complemento, inclusión y exclusión o enumeración controlada.
Si n objetos idénticos se distribuyen en m recipientes y ninguno puede quedar vacío, reservamos un objeto para cada recipiente:
Después de entregar un objeto a cada recipiente, se distribuyen los n-m restantes sin límite inferior.
Si cada recipiente puede recibir como máximo c objetos, las soluciones deben cumplir:
La fórmula simple de estrellas y barras ya no basta directamente porque debemos excluir las distribuciones que superan la capacidad.
Indica objetos idénticos, recipientes, una capacidad máxima y si cada recipiente debe recibir al menos uno.
Distribuyamos 5 objetos idénticos entre 3 recipientes, con capacidad máxima 3 y permitiendo recipientes vacíos. Las soluciones incluyen:
Se descartan casos como (5,0,0) porque superan la capacidad máxima.
Si cada recipiente debe recibir al menos l objetos, asignamos primero l a cada uno:
El problema se convierte en una distribución con variables no negativas sobre los objetos que quedan.
Para capacidades pequeñas, podemos contar todas las distribuciones sin límite y restar las que tienen al menos un recipiente sobrecargado.
Si varias distribuciones exceden la capacidad en recipientes diferentes, puede ser necesario aplicar inclusión y exclusión.
El siguiente algoritmo enumera cantidades y conserva las que suman n y respetan un límite.
function distribucionesValidas(n, recipientes, capacidad, actual = [], resultados = []) {
if (recipientes === 1) {
if (n <= capacidad) resultados.push([...actual, n]);
return resultados;
}
for (let cantidad = 0; cantidad <= Math.min(n, capacidad); cantidad += 1) {
distribucionesValidas(n - cantidad, recipientes - 1, capacidad, [...actual, cantidad], resultados);
}
return resultados;
}
console.log(distribucionesValidas(5, 3, 3));
Si los objetos son diferentes, una restricción puede indicar que cierto objeto solo puede ir a determinados recipientes.
En este caso, el principio del producto se aplica multiplicando las opciones compatibles de cada objeto, siempre que las decisiones sean independientes.
Combinar mínimo y máximo produce un rango para cada variable:
Si n es menor que m o mayor que mc, no existe ninguna distribución válida.
Distribuir con restricciones exige contar soluciones de una ecuación bajo límites y condiciones. Transformar mínimos, controlar máximos y filtrar casos permite construir modelos correctos para problemas de recursos y asignaciones.
En el próximo tema estudiaremos la introducción a la recurrencia en combinatoria, una herramienta para expresar conteos a partir de problemas más pequeños.