Bob's Sale (riordino delle coppie con vincoli per ridurre al minimo la somma dei prodotti)


15

Ho fatto questa domanda su Stack Overflow qualche tempo fa: Problema: vendita di Bob . Qualcuno ha suggerito di pubblicare la domanda anche qui.

Qualcuno ha già posto una domanda relativa a questo problema qui - Peso minimo della sottoforeste della cardinalità data - ma per quanto ho capito non mi aiuta con il mio problema. Anche la risposta più votata su StackOverflow è degna di nota.

Ecco la copia integrale della mia domanda StackOverflow. Probabilmente è formulato in modo inadeguato per questo sito (diamine, mi sento inadeguatamente non istruito solo chiedendolo qui), quindi sentiti libero di modificarlo:


Nota: questa è una riformulazione astratta di un problema di vita reale riguardante l'ordinazione di record in un file SWF. Una soluzione mi aiuterà a migliorare un'applicazione open source.

Bob ha un negozio e vuole fare una vendita. Il suo negozio trasporta un numero di prodotti e ha un certo numero intero di unità di ciascun prodotto in magazzino. Ha anche un numero di etichette dei prezzi montate su scaffale (fino al numero di prodotti), con i prezzi già stampati su di esse. Può apporre un'etichetta di prezzo su qualsiasi prodotto (prezzo unitario per un articolo per l'intero magazzino di quel prodotto), tuttavia alcuni prodotti hanno una restrizione aggiuntiva: tali prodotti potrebbero non essere più economici di un determinato altro prodotto.

Devi trovare come organizzare le etichette dei prezzi, in modo tale che il costo totale di tutte le merci di Bob sia il più basso possibile. Il costo totale è la somma dell'etichetta del prezzo assegnato a ciascun prodotto moltiplicata per la quantità di quel prodotto in magazzino.


Dato:

  • N - il numero di prodotti e le etichette dei prezzi
  • S i , 0≤ i <N - la quantità disponibile del prodotto con indice i (numero intero)
  • P j , 0≤ j <N - il prezzo sull'etichetta del prezzo con indice j (intero)
  • K: il numero di coppie di vincoli aggiuntive
  • A k , B k , 0≤ k <K - indici di prodotto per il vincolo aggiuntivo
    • Qualsiasi indice di prodotto può apparire al massimo una volta in B. Pertanto, il grafico formato da questo elenco di adiacenza è in realtà un insieme di alberi diretti.

Il programma deve trovare:

  • M i , 0≤ i <N - mappatura dall'indice del prodotto all'indice dell'etichetta del prezzo (P M i è il prezzo del prodotto i )

Per soddisfare le condizioni:

  1. P M A k ≤ P M B k , per 0≤ k <K
  2. Σ (S i × P M i ) per 0≤ i <N è minimo

Nota che, se non fosse per la prima condizione, la soluzione sarebbe semplicemente quella di ordinare le etichette per prezzo e i prodotti per quantità, e di abbinarli entrambi direttamente.

I valori tipici per l'input saranno N, K <10000. Nel problema della vita reale, ci sono solo diversi prezzi distinti (1,2,3,4).


Ecco un esempio del perché la maggior parte delle soluzioni semplici (incluso l'ordinamento topologico) non funzionerà:

$$

La soluzione ottimale è:

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

$


Ehm, il blocco preformattato per l'esempio in basso è stato confuso, e non sono sicuro di come risolverlo (la sintassi Markdown di StackOverflow e i tag <pre> non sembrano funzionare qui).
Vladimir Panteleev,

Il markup per il blocco preformattato non è stato riconosciuto perché i segni del dollaro sono stati trattati come delimitatore TeX (anche se non so perché il markup TeX rovini il markup per il blocco preformattato). Poiché non sembra esserci un modo "corretto" per sfuggire ai simboli del dollaro , l'ho risolto in un modo ad hoc.
Tsuyoshi Ito,

qual'è la domanda? vuoi un algoritmo (efficiente) per trovare una soluzione ottimale? durezza? soluzione approssimativa?
Marcos Villagra,

1
@Ito, grazie. @Marcos - scusa, sto cercando un algoritmo per risolvere questo problema, si spera abbastanza veloce da poterlo implementare nel mio progetto. Ci sono molte idee per una soluzione approssimativa, quindi sarebbe preferibile una soluzione esatta.
Vladimir Panteleev,

1
Per quello che vale, penso che la domanda correlata ( cstheory.stackexchange.com/q/4904/751 ) consideri il caso in cui i prezzi sono costituiti da k e N zero.
mum

Risposte:


6

Ho anche pubblicato questo sulla tua domanda originale su Stack Overflow:


Il problema è NP-completo per il caso generale. Ciò può essere mostrato tramite una riduzione di 3 partizioni (che è una versione NP ancora completa di imballaggi per contenitori).

Sia w 1 , ..., w n i pesi degli oggetti dell'istanza di 3 partizioni, sia b la dimensione del cestino e k = n / 3 il numero di bin che possono essere riempiti. Quindi, c'è una 3 partizione se gli oggetti possono essere partizionati in modo tale che ci siano esattamente 3 oggetti per bin.

Per la riduzione, abbiamo impostato N = kb ed ogni scomparto è rappresentato da b etichette prezzo dello stesso prezzo (pensiamo a P i aumenta ogni b th etichetta). Sia t i , 1≤ ik , il prezzo delle etichette corrispondenti all'i bin. Per ogni w i abbiamo un prodotto S j di quantità w i + 1 (consente di chiamare questo il prodotto principale di w i ) e un altro w i - 1 prodotti di quantità 1 che sono tenuti ad essere più conveniente che S j (chiama questi prodotti congedo).

Per t i = (2b + 1) i , 1≤ ik , esiste una 3 partizione se e solo se Bob può vendere per 2b Σ 1≤ ik t i :

  • Se v'è una soluzione per 3 partizione, quindi tutti i b prodotti corrispondenti agli oggetti w i , w j , w l assegnati allo stesso scomparto possono essere etichettati con lo stesso prezzo senza violare le restrizioni. Pertanto, la soluzione ha un costo di 2b Σ 1≤ ik t i (poiché la quantità totale di prodotti con prezzo t i è 2b ).
  • Considera una soluzione ottimale della vendita di Bob. Per prima cosa osserva che in ogni soluzione c'erano più di 3 prodotti root che condividono la stessa etichetta di prezzo, per ogni prodotto root che è "troppo" c'è un prezzo più economico che si attacca su meno di 3 prodotti root. Questo è peggio di qualsiasi soluzione se ci sono esattamente 3 prodotti root per etichetta di prezzo (se esistente).
    Ora può esserci ancora una soluzione di vendita di Bob con 3 etichette di radice per prezzo, ma i loro prodotti congedo non indossano le stesse etichette di prezzo (i bidoni scorrono). Di 'la maggior parte dei prezzi costoso etichetta tag un prodotto radice di w i , che ha un prodotto congedo tag più conveniente. Ciò implica che le 3 etichette radice w i , w j , w ltaggato con il prezzo più costoso non aggiungere fino a b . Pertanto, il costo totale dei prodotti contrassegnati con questo prezzo è almeno 2b + 1 .
    Pertanto, tale soluzione ha un costo t k (2b + 1) + altri costi di assegnazione. Poiché il costo ottimale per una 3 partizione esistente è 2b Σ 1≤ ik t i , dobbiamo dimostrare che il caso appena considerato è peggiore. Questo è il caso se t k > 2b Σ 1≤ ik-1 t i (nota che ora è k-1 nella somma). Impostazione t i= (2b + 1) i , 1≤ ik , questo è il caso. Ciò vale anche se il prezzo più costoso è quello "cattivo", ma qualsiasi altro.

Quindi, questa è la parte distruttiva ;-) Tuttavia, se il numero di diversi prezzi è una costante, è possibile utilizzare la programmazione dinamica per risolverlo in tempo polinomiale.


7

Questo è un seguito alla risposta di Gero . L'idea è di modificare la sua costruzione per mostrare una forte durezza NP.

tio=(2B+1)iotio=ioP=2BΣ1ioKtio

wio-1PP

Pertanto, è possibile ottenere il premio richiesto solo se tutti i prodotti fogliari hanno lo stesso premio del loro prodotto radice, il che significa che esiste una 3 partizione.

Kf(K)nO(1)nO(K)


È stato inoltre inviato il post alla domanda originale di overflow dello stack.


Non posso accettare due risposte, quindi dovrò solo ringraziarti per le intuizioni :)
Vladimir Panteleev,

0

Sembra una domanda sulla teoria dei giochi. In tal caso, una soluzione molto semplice a forza bruta è:

Supponiamo che i vincoli rappresentino alcuni invarianti della forma

S-> AkSBk | AkBkS | SAkBk

La soluzione è continuare ad aggiungere prima i vincoli e poi gli elementi. Ad esempio: diciamo n = 10 e ci sono 2 vincoli, A1B1 e A2B2. Quindi, ci sono tre figli nel nodo radice (livello 2). Ognuno di questi 3 nodi avrà 7 figli di livello 3, ognuno di 21 ne avrà 6 a livello 4, ecc. Essenzialmente stai attraversando tutte le possibili combinazioni.

                A1B1 --- Livello 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- Livello 2

e far crescere l'albero. Anche se all'inizio sembra una soluzione orribile, penso che potresti abbandonare inseguendo foglie molto costose usando un po 'di euristica e potatura ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.