Tengo una solicitud de optimización de costos que no sé cómo si hay literatura. Es un poco difícil de explicar, así que me disculpo de antemano por la duración de la pregunta.Optimización de solicitudes cartesianas con costos afines
Hay un servidor accedo que funciona de esta manera:
- se realiza una solicitud de registros (R1, ... rn) y campos (F1, ... fp)
- se solo puede solicitar el producto cartesiano (r1, ..., rp) x (f1, ... fp)
- El costo (tiempo y dinero) asociado con una solicitud de este tipo es afín en el tamaño de la solicitud:
T((r1, ..., rn)x(f1, ..., fp) = a + b * n * p
Sin pérdida de generalidad (sólo normalización), podemos suponer que b=1
lo que el costo es:
T((r1, ...,rn)x(f1,...fp)) = a + n * p
- Sólo necesito para solicitar un subconjunto de pares
(r1, f(r1)), ... (rk, f(rk))
, una petición que proviene de Los usuarios. Mi programa actúa como un intermediario entre el usuario y el servidor (que es externo). Tengo muchas solicitudes como esta que entran (decenas de miles por día).
Gráficamente, podemos pensar en ella como una matriz dispersa NXP, por lo que quiero para cubrir los valores distintos de cero con una submatriz rectangular:
r1 r2 r3 ... rp ------ ___ f1 |x x| |x| f2 |x | --- ------ f3 .. ______ fn |x x| ------
Tener:
- el número de submatrices se mantienen razonables debido al costo constante
- toda la 'x' debe encontrarse dentro de una submatriz
- el área total cubierta no debe ser demasiado grande debido al costo lineal
voy a nombrar g del coeficiente de diseminación de mi problema (número de pares necesarios sobre el total de pares posibles, g = k/(n * p)
. Sé el coeficiente a
.
Hay algunas observaciones obvias:
- si a es pequeña, la mejor solución es solicitar cada uno (registro, campo) par de forma independiente, y el costo total es:
k * (a + 1) = g * n * p * (a + 1)
- si a es grande , la mejor solución es solicitar todo el producto cartesiano, y el costo total es:
a + n * p
- la segunda solución es mejor tan pronto como
g > g_min = 1/ (a+1) * (1 + 1/(n * p))
- , por supuesto, las órdenes en los productos cartesianos son unimporta nt, por lo que puede transponer las filas y las columnas de mi matriz para que sea más fácil que se puede cubrir, por ejemplo:
f1 f2 f3 r1 x x r2 x r3 x x
pueden reordenarse como
f1 f3 f2 r1 x x r3 x x r2 x
y no hay una solución óptima el cual es solicitar (f1,f3) x (r1,r3) + (f2) x (r2)
- Tratar todas las soluciones y buscando el menor coste no es una opción, debido a que los explotan combinatoria:
for each permutation on rows: (n!) for each permutation on columns: (p!) for each possible covering of the n x p matrix: (time unknown, but large...) compute cost of the covering
así que estoy buscando una solución aproximada. Ya tengo algún tipo de algoritmo codicioso que encuentra una cobertura dada una matriz (comienza con celdas unitarias, luego las combina si la proporción de celdas vacías en la fusión está por debajo de algún umbral).
Para poner algunos números en mi mente, mi n está en algún lugar entre 1 y 1000, y mi p en algún lugar entre 1 y 200. El patrón de cobertura es realmente 'blocky', porque los registros vienen en clases para las cuales los campos son similar. Lamentablemente no puedo acceder a la clase de un registro ...
Pregunta 1: ¿Alguien tiene una idea, una simplificación inteligente o una referencia para un documento que podría ser útil? Como tengo muchas solicitudes, un algoritmo que funciona bien en promedio es lo que estoy buscando (pero no puedo permitirme que funcione muy mal en algunos casos extremos, por ejemplo solicitando la matriz completa cuando nyp son grandes, y la solicitud es de hecho bastante escasa).
Pregunta 2: De hecho, el problema es aún más complicado: el costo es de hecho más como la forma: a + n * (p^b) + c * n' * p'
, donde b es una constante < 1 (una vez que se le pide un récord para un campo, es no es demasiado costoso para solicitar otros campos) y n' * p' = n * p * (1 - g)
es el número de células que no deseo solicitar (porque no son válidas, y existe un costo adicional al solicitar elementos no válidos). Ni siquiera puedo soñar con una solución rápida a este problema, pero aún así ... ¿una idea para alguien?
Tiene un oráculo que le dice que (row, col) están vacíos de forma gratuita? –
Puede nombrar explícitamente los conjuntos de filas y campos, es decir, no tiene que especificar un rectángulo contiguo en un sistema de coordenadas fijo (fila y colmutaciones col particulares)? –
Re: mi primera pregunta, la respuesta es sí, si entiendo correctamente las "solicitudes provenientes de los usuarios". –