Ho un interessante problema di ottimizzazione combinatoria del "mondo reale" che ho bisogno di risolvere a livello programmatico, tuttavia sono stato in grado di realizzare una buona strategia.
L'attività è simile al Problema di Knapsack tranne che ci sono ulteriori vincoli.
Le regole sono come segue:
- You must must fill a bag with weight
X
of sand.- You have
N
buckets of sand each with a random positive weight.- You may pour up to
L
buckets into the bag, whereL
is greater than one. All buckets poured must be poured in their entirety, except for the final one, in which the remainder will be left for future iterations of the problem.- You wish to empty completely as many buckets as possible, while maximizing negative skew of the remainder set.
- You may not over or under-fill the bag, but you may assume that there is sufficient sand in the heaviest
L
buckets to satisfy the request.
Considera questo esempio:
-
N = {1000,1000,250,250,1,1,1,0.5}
-
L = 4
-
X = 2000
La soluzione solo è {0.5,1,1000,1000}
che lascia N = {250,250,1,1.5}
. I commentatori hanno affermato che l'ordinamento dell'elenco rende banale il problema, ma non è così.
... considera questo:
-
N = {1000,1000,250,250,1.5,1,1,0.5}
-
L = 4
-
X = 2002
-
Risposta :
{0.5,1.5,1000,1000}, N → {250, 250, 1, 1}
- Tieni presente che la scelta del set contiguo più piccolo nell'elenco ordinato che soddisfi il peso (
{250,1000,1000}
) viola la regola 4 poichéN → {250,248,1.5,1,1,0.5}
ha un disallineamento più positivo.
Questo problema si presenta nell'e-commerce, specialmente quando si deve effettuare un pagamento con più forme di accesso prepagato ...
Qualcuno ha un buon approccio matematico o programmatico a questo problema?