Su misión es construir un algoritmo (programa o función) que pueda optimizar el empaque de la fruta de una cinta transportadora en bolsas para enviarlas a los minoristas, optimizando la mayor cantidad de bolsas.
Cada bolsa tiene que pesar al menos una cierta cantidad, pero cualquier exceso se pierde, ya que ese peso podría usarse para llenar otra bolsa. Su máquina de ensacado siempre tiene una anticipación de n
frutas de la cola y solo puede elegir agregar cualquiera de estas n
frutas a la (única) bolsa que se está procesando. No puede mirar más allá de los n
primeros elementos en la cola. El programa siempre sabe exactamente cuánto peso hay en la bolsa.
Otra forma de visualizar esto es tener una cinta transportadora con un área de carga de tamaño n
al final, desde donde se debe tomar una fruta antes de que llegue una nueva fruta. Cualquier fruta sobrante y una bolsa no llena al final se descartan.
Entradas
- Lista / matriz de pesos de frutas en cola (enteros positivos)
- Peso total mínimo para bolsas (entero positivo)
- Lookahead
n
(entero positivo)
Salida
Su algoritmo debe devolver para todas las bolsas el peso de las frutas en ellas, por cualquier medio que sea conveniente para usted y su idioma, ya sea un estándar o un valor de retorno u otra cosa. Debería poder ejecutar el programa y calcular su puntaje en un minuto en su computadora.
Ejemplo
Total weight 1000, lookahead of 3 and fruit queue:
[171,163,172,196,156,175,162,176,155,182,189,142,161,160,152,162,174,172,191,185]
One possible output (indented to show how the lookahead affects the bagging):
[171,163,172, 156,175, 176]
[162, 155,182,189, 161,160]
[152,162,174,172,191,185]
Tanteo
Su algoritmo se probará en seis ejecuciones en un lote de 10000 naranjas que he preparado para usted, en lookaheads que van de 2 a 7, inclusive en ambos extremos. Deberá empacarlos en bolsas de al menos 1000 unidades. Las naranjas se distribuyen normalmente con un peso medio de 170 y una desviación estándar de 13, si eso es de alguna ayuda.
Su puntaje será la suma de la cantidad de bolsas de las seis carreras. El puntaje más alto gana. Las lagunas estándar no están permitidas.
Implementación de ejemplo simple y paquete de pruebas en Haskell
Respuestas:
Python 3,
99649981 bolsasLa idea de esta solución es similar a las de Jonathan, JayCe y fortraan, pero con una función de puntuación =)
Esta solución agrega los mejores subconjuntos del área de búsqueda anticipada según el
score
.score
proporciona un orden sobre los subconjuntos utilizando el siguiente esquema:expected_mean
intenta predecir cómo debería verse el resto de los valores (suponiendo que su elección sea óptima).UPD :
Aquí hay otra observación: puede colocar las naranjas del mejor subconjunto en la bolsa sin dañar el rendimiento del algoritmo. Mover cualquier parte de él todavía permite mover el resto después, y el resto aún debería ser la mejor opción (sin nuevas naranjas) si la puntuación es correcta. Además, de esta manera, existe la posibilidad de mejorar dinámicamente el conjunto de candidatos para poner en la bolsa al ver más naranjas antes de llenar la bolsa. Y desea saber tanta información como sea posible, por lo que no tiene sentido mover más de una naranja a la bolsa en un momento dado.
¡Intentalo!
fuente
powerset
función es redundante en este caso porque es igual delen(list_)
todos modos)expected_mean(w)
que da buenos resultados:return (w+2) / max(1, round((w+2) / mean))
Python 3 , 9796 bolsas
Sobre la base de la respuesta de Jonathan:
Esto se basa en powerset del libro de cocina de itertool. Primero encuentra el subconjunto óptimo del búfer basándose en minimizar la diferencia del peso objetivo para todos los subconjuntos, y luego selecciona un elemento de este subconjunto según el mismo criterio. Si no se selecciona un subconjunto óptimo de todo el búfer.
fuente
C ++ 17, 9961.58 (promedio sobre algunas semillas aleatorias)
(Desplácese hacia abajo para obtener una explicación si no conoce C ++)
(si
<
se usa básicamente, el algoritmo intenta minimizar el número de bolsas)Inspirado por esta respuesta .
Enlace TIO para 250 repeticiones: ¡ Pruébelo en línea!
Define una función (en realidad solo se ve como una función, es una estructura)
pick_orange
que, dadovector<int> weights
el peso de las naranjas yint remain
el peso restante de la bolsa, devuelve el índice de la naranja que debe seleccionarse.Algoritmo:
repetir
500
tiempos{
genera naranjas aleatorias (falsas) (distribución normal con media 170 y stddev 13) hasta que haya
N_NEW_ORANGES=7
naranjas,elija cualquier subconjunto cuya suma sea menor y no menor que
remain
(la función lobacktrack
hace)marca todas las naranjas en ese subconjunto como buenas
}
promediar el número de veces que las naranjas que se marcan como buenas de las naranjas (reales) con el mismo peso
devuelven la mejor naranja
Hay 3 constantes codificadas en el programa que no pueden deducirse del problema:
N_NEW_ORANGES
(la duración de la predicción). Aumentar esto hace que el programa se ejecute exponencialmente más largo (porque retrocede)fuente
invalid use of template-name ‘std::normal_distribution’
. No hay problemas con gcc 7.1.0.Python 2 , 9756 bolsas
Hagamos rodar la naranja ...
Pruébalo en línea!
Siempre recoge la fruta del tampón, lo que minimiza la diferencia absoluta del nuevo peso y el peso objetivo.
fuente
Python 3, 9806 bolsas
Sobre la base de las respuestas de Jonathan y JayCe:
Pruébalo en línea!
Cómo funciona
Digamos que la bolsa tiene 900 unidades, y hay 2 frutas disponibles: una fruta de 99 unidades y una fruta de 101 unidades. Si la fruta de 99 unidades está más cerca del comienzo de la lista anticipada, entonces la
min
seleccionará en lugar de 101. Si esto sucede, ahora necesitaríamos otra fruta para completar la 1 unidad restante necesaria. Cambié el programa para favorecer la fruta de mayor valor en estos casos.Para ello, ordena y luego invierte la lista anticipada antes de la configuración de potencia.
fuente
PHP, 9975 bolsas
el más largo de todos los envíos pero debe ser legible
Intentalo
fuente
Python 3,
98559928994799569964 bolsasBasado en el código de inicio de Jonathan Allan, pero sin golf para ser legible.
Idea: desde 1000/170 = 5.88, tratamos de seleccionar frutas cercanas a 1000/6 (jugueteé con las constantes mágicas). Sin embargo, si la última fruta en la bolsa puede minimizar el desperdicio, la usamos en su lugar.
Esta solución tiene objetivos de suma de bolsas para cada fruta agregada. Probablemente me detendré aquí. Usé Nelder-Mead para encontrar mi
targets
matriz:9956 bolsos
El programa de bolsas 9947 es particularmente simple:
fuente
targets
? ¿Entrenamiento en datos aleatorios?Rubí , 9967 bolsas
Pruébalo en línea!
Si tiene suficiente peso para llenar la bolsa, encuentre el subconjunto más ligero que pueda llenar la bolsa y use la naranja más clara de ese subconjunto. De lo contrario, coloque el peso restante lo más cerca posible de un múltiplo de 170.
fuente
Raqueta / Esquema, 9880 bolsas
Para decidir qué fruta agregar a la bolsa, compare el peso óptimo de la bolsa con el peso de la bolsa con la fruta adicional. Si es el peso óptimo, úsalo. Si tiene sobrepeso, minimice la cantidad en exceso. Si tiene bajo peso, minimice la cantidad en exceso después de intentar dejar un espacio óptimo.
fuente
Haskell , 9777 bolsos
Este fue mi primer intento:
Pruébalo en línea!
fuente
Haskell , 9981 bolsas
The Angs → Jonathan Allan → JayCe → fortraan → Alex → La pitón codegolf Roman Czyborra podría ciclar de regreso a Haskell para obtener una mayor pureza matemática a lo largo del mismo tren de pensamiento principal
(<miss)==False<True
)para ese entero invierta el
(m-n)/sqrt(n)==(n+1-m)/sqrt(n+1) <==> n=sqrt(m^2-1/4)-1/2
de un https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variablessazonado con algunas inútiles innecesarias
Pruébalo en línea!
sin producir un aumento numérico diferente en la cima de las 9981 redes de naranjas cosechadas antes, mientras que mi empacador de bolsas 10k011 que agarraba naranjas no aptas fuera de las bolsas no cerradas fue descalificado por el usuario 69850 en persona user202729 → Jo King → ovs, por lo tanto, la recompensa merecida fue para Alex
fuente