¿Qué algoritmos se pueden usar para resolver este problema de optimización?

Formulemos el problema como un problema de programación matemática.
Hay 4 tipos de piedras rosa, verde, claro y azul. Vamos a denotarlos por conjunto [math] \ mathcal {P}, \ mathcal {G}, \ mathcal {C}, \ mathcal {B} [/ math]. Para cada elemento en estos conjuntos, supongamos que podemos seleccionarlos o no. Denotemos la elección de la selección de un elemento [math] i [/ math] perteneciente a cada uno de estos conjuntos por –

[matemáticas] s_i ^ p, s_i ^ g, s_i ^ b, s_i ^ b [/ matemáticas]

variables respectivamente.

Del mismo modo, denotemos la calidad y el precio (o tasa) de estos elementos como:

[matemáticas] q_i ^ p, q_i ^ g, q_i ^ b, q_i ^ b [/ matemáticas]

y

[matemáticas] r_i ^ p, r_i ^ g, r_i ^ b, r_i ^ b [/ matemáticas].

Así que ahora el problema se puede formular de la siguiente manera:

maximizar [matemáticas] \ sum_i s_i ^ p * q_i ^ p + \ sum_j s_j ^ g * q_j ^ g + \ sum_k s_k ^ c * q_k ^ c + \ sum_l s_l ^ b * q_l ^ b [/ math]
sujeto a [matemáticas] \ sum_i s_i ^ p = 3 [/ matemáticas]
[matemáticas] \ sum_j s_j ^ g = 1 [/ matemáticas]
[matemáticas] 2 \ leq \ sum_k s_k ^ c \ leq 3 [/ matemáticas]
[matemáticas] 1 \ leq \ sum_l s_l ^ b \ leq 2 [/ matemáticas]
[matemáticas] \ sum_k s_k ^ c + \ sum_l s_l ^ b = 4 [/ matemáticas]
[matemáticas] \ sum_i s_i ^ p * r_i ^ p + \ sum_j s_j ^ g * r_j ^ g + [/ matemáticas]
[matemáticas] \ sum_k s_k ^ c * r_k ^ c + \ sum_l s_l ^ b * r_l ^ b \ leq 100000 [/ matemáticas]
[matemáticas] s_i ^ p, s_j ^ g, s_k ^ b, s_l ^ b [/ matemáticas] son ​​binarias

Este es un programa lineal entero que es un problema NP-completo. Sin embargo, existen muchos solucionadores comerciales eficientes para resolverlos (por ejemplo, http://www.gurobi.com). No sé exactamente cuánto tiempo llevará resolverlos, pero por mi experiencia supongo que es menos de un minuto.

Además, para acelerar el cálculo, puede eliminar las opciones obvias (por ejemplo, si hay más de 2 £ 50,000 piedras rosadas, puede eliminarlas con seguridad, etc.)

Creo que también puede formularlo como un problema de mochila, pero la piedra final puede ser azul o transparente, lo que no estoy seguro de cómo manejar. El problema de la mochila también es un problema NP-Complete.

Esto se puede reducir al problema de la mochila, que tiene un tiempo pseudopolinomial. Es decir, tiene tiempo de ejecución en términos de su presupuesto, y suponiendo que los precios sean enteros (o digamos como máximo 2 dígitos después del punto decimal). En particular, tiene tiempo de ejecución [matemática] O (BG) [/ matemática], donde [matemática] B [/ matemática] es el presupuesto y [matemática] G [/ matemática] es el número de gemas disponibles. No tiene ninguna suposición sobre cómo se correlacionan los precios con su calidad y ofrece una solución exacta.

Vamos a restringirnos a un diseño específico, digamos 3 piedras rosas, 1 piedra verde, 2 piedras claras y 2 piedras azules. Mantendremos una tabla [matemáticas] T [/ matemáticas] con tamaño [matemáticas] B \ veces 4 \ veces 2 \ veces 3 \ veces 3 = 72B [/ matemáticas]. Es decir, la entrada [math] (m, p, g, c, b) [/ math] -th de la tabla será la calidad máxima que podemos lograr hasta ahora usando la unidad [math] m [/ math] de dinero, [matemáticas] p [/ matemáticas] piedras rosas, [matemáticas] g [/ matemáticas] piedras verdes, [matemáticas] c [/ matemáticas] piedras claras y [matemáticas] b [/ matemáticas] piedras azules.

Al principio, la tabla debe llenarse con [math] – \ infty [/ math], excepto [math] (0, 0, 0, 0, 0) [/ math] debe ser [math] 0 [/ math]. Cuando agregamos una nueva piedra, digamos que es una piedra clara con precio [matemática] m_i [/ ​​matemática] y calidad [matemática] q_i [/ ​​matemática], tenemos

[matemáticas] T (m, p, g, c, b) = [/ matemáticas] max [matemáticas] (T (m, p, g, c, b), T (m – m_i, p, g, c – 1, b) + q_i) [/ matemáticas]

en el que podemos actualizar la tabla en tiempo lineal al tamaño de la tabla. Hay algunos detalles menores, como los índices negativos y el orden de actualización, pero esto concluye la idea principal.

Finalmente, elija el máximo [matemática] T (*, 3, 1, 2, 2) [/ matemática] (donde * debería ser como máximo el presupuesto). Si desea rastrear la solución, es posible: simplemente registre qué gema eligió cuando actualice la tabla.

Gracias por las respuestas, recientemente he resuelto este problema de optimización con tres algoritmos separados (en un esfuerzo por encontrar el más eficiente). En caso de que alguien siga interesado, estoy publicando una breve descripción de ellos aquí.

El primer paso fue reducir la cantidad de piedras (gracias Somdeb Sarkhel) encontrando piedras que estaban “dominadas” y por lo tanto nunca fueron útiles. Si, por ejemplo, cualquier piedra rosada tiene otras tres piedras rosadas que cuestan lo mismo o menos y que tienen mayor calidad, podemos tirar esa piedra.

Ahora ideé mi primer algoritmo, que es una versión del algoritmo codicioso. Comienza a llenar cada ranura con la piedra más cara hasta que comienza a quedarse sin dinero, luego llena el resto con las piedras más baratas. Luego, comenzando desde el final y trabajando hacia atrás, cambia una piedra costosa por una un poco más barata, luego actualiza las ranuras restantes. Esto continúa por la línea hasta que la primera piedra se degrada por completo. Este algoritmo es confiable y siempre produce la optimización correcta, pero es lento.

Mi siguiente esfuerzo se basó en parte en la entrada del usuario de Quora. Comienza llenando cada ranura con la piedra de la mejor relación calidad / precio. Si la solución resultante supera el presupuesto, elegimos rebajas de piedra con la menor relación calidad / pérdida de precio. Si estamos por debajo del presupuesto, hacemos lo contrario. Este es el algoritmo más rápido, pero a veces solo produce un resultado casi óptimo.

Mi algoritmo final es similar al segundo. Llena cada espacio con la piedra más cara, que generalmente excede en gran medida el presupuesto. A continuación, baja la calificación de cada ranura eligiendo rebajas con la mejor relación. Este algoritmo es rápido y confiable produce el resultado óptimo, como se verifica usando el primer algoritmo.

Lo sorprendente para mí con los algoritmos es la frecuencia con la que hay varias formas de lograr el mismo objetivo. Gracias de nuevo por las ideas, fueron muy útiles.

Usa un árbol con peso. Asigne a cada nodo un valor que sea la calidad / precio. Elija el número superior de joyas de calidad / precio para cada categoría, luego determine la diferencia de precio entre las joyas superiores y el presupuesto máximo permitido. Luego, elija el número superior de joyas que rompan ese rango de precios con la más alta calidad / precio. Has reducido el número de combinaciones posibles; Si el número es lo suficientemente pequeño, puede recorrer cada combinación posible.

Por supuesto, este algoritmo es una versión modificada del algoritmo codicioso.

Tiene razón en que este es, de hecho, el problema de la mochila. Se pueden encontrar soluciones de ejemplo en Wikipedia, por ejemplo.

Usaría un algoritmo estocástico de escalada. Básicamente soy lo suficientemente flojo como para conformarme con un óptimo local 🙂

More Interesting

¿Cómo los logaritmos convierten la multiplicación en suma?

¿Es importante entender cómo se derivan los teoremas específicos, o es suficiente entender solo cómo usarlos?

Cómo encontrar el número total de palíndromos diferentes de longitud k en una cadena dada usando una matriz de sufijos

¿Es posible crear un lenguaje completo de Turing con solo un puntero de instrucción modificable, una operación de intercambio y un incremento por una operación?

¿Cómo sabe la CPU que estamos usando el complemento de uno o el complemento de dos para representar números negativos?

¿Qué es la matemática profanada y dónde se usa?

¿Hay un sitio como el Proyecto Euler pero sobre matemáticas puras?

¿La orientación a objetos seguiría siendo el paradigma de programación dominante en un futuro en el que las computadoras personales suelen tener 10 o 100 núcleos?

¿Cuál es la vida útil de una variable?

¿Cuáles son algunos de los divertidos libros de matemáticas que puede leer una persona de nivel secundario?

¿Cuál es la mejor herramienta para encontrar la representación matemática del sonido de guitarra?

¿Por qué SAS es mucho más rápido que R? Utilicé el código para encontrar los primeros k números primos en SAS y R para comparar su eficiencia, y los códigos son esencialmente los mismos, pero los resultados están fuera de mi mente.

¿Se pueden programar las computadoras con 0,1 y 2? ¿Qué tal 0,1,2 y 3? ¿O son todos los programas manipulaciones de 0 y 1? Nuevos detalles añadidos para explicar.

¿Cuáles son algunos de los documentos que debe leer sobre STOC, FOCS y SODA en los últimos 10 años sobre algoritmos de aproximación, algoritmos aleatorios y algoritmos en línea que introdujeron nuevas técnicas útiles?

¿Cuál es el significado de los idiomas [math] \ omega [/ math] en informática?