Vendere blocchi di fasce orarie


27

Dati time slot che persone vogliono acquistare. La persona ha un valore per ciascuna fascia oraria . Ogni persona può acquistare solo un intervallo di fasce orarie consecutive, che potrebbe essere vuoto.k i h ( i , j ) 0 jnkih(i,j)0j

Esiste un algoritmo a tempo polinomiale per calcolare il valore massimo che il venditore può raggiungere?

Senza il vincolo consecutivo, possiamo assegnare ogni intervallo di tempo alla persona che lo apprezza di più. Inoltre, se fissiamo l'ordine delle fasce orarie delle persone, la programmazione dinamica può essere utilizzata per risolvere il valore massimo delle prime persone che acquistano la prima time slot.0 i k 0 j nk0ik0jn

Risposte:


9

Dato un 3CNF con clausole sulle variabili . Supponiamo che e visualizzati nella formula per un massimo di volte rispettivamente.x 1 , , x n x i ¯ x i k iϕ1,,ϕkx1,,xnxixi¯ki

Progettiamo un DAG colorato i cui vertici sono composti da tre parti:G

  • Vertici "Assegnazione" e , , . Colora con il "colore" e con .ˉ v i ( j ) 1 i n 1 j k i v i ( j ) x i ( j )vi(j)v¯i(j)1in1jkivi(j)xi(j)¯ x i (j)v¯i(j)xi¯(j)
  • Vertici "Clausola" , , . Colora con il colore (o ) se (o , resp.) È il -letterale della clausola , ed è la -esima clausola che contiene questo valore letterale.1 i k j = 1 , 2 , 3 w i ( j ) x i ( j ) ¯ x i ( j ) ¯ x i x i j ϕ i jwi(j)1ikj=1,2,3wi(j)xi(j)xi¯(j)xi¯xijϕij
  • "Taglia" vertici . Colorali con colori distinti diversi dall'alto.s=s0,s1,,sn,sn+1,sn+k=t

I bordi includono:

  • , v i ( j ) v i ( j + 1 ) , v i ( k i ) s i ;si1vi(1)vi(j)vi(j+1)vi(ki)si
  • , ˉ v i ( j ) ˉ v i ( j + 1 ) , ˉ v i ( k i ) s i ;si1v¯i(1)v¯i(j)v¯i(j+1)v¯i(ki)si
  • e , w i ( j ) s n + i .sn+i1wi(j)wi(j)sn+i

Ad esempio, dal 3CNF viene costruito il seguente grafico (Le direzioni del bordo sono da sinistra a destra). (x1x2x3¯)(x1x2¯x3)inserisci qui la descrizione dell'immagine

Ora non è difficile vedere che l'originale 3CNF è soddisfacibile se e solo se v'è una - t percorso con diversi colori al vertice in G .stG

(A proposito, è un sottoprodotto che l'esistenza del percorso - T con diversi colori di vertici nel DAG colorato è NP-difficile . Non ho trovato molte letterature su questo problema in prospettiva computazionale. Se lo sai, per favore commento!)stNP-hard

Quindi qual è la relazione tra e il problema OP? Intuitivamente quello che faremo è progettare una matrice h , in modo che ogni colore sia mappato su una riga (che è una persona) e i bordi siano mappati su colonne consecutive (fasce orarie). Pertanto una programmazione massima, che in pratica va da sinistra a destra nella matrice, corrisponde a un percorso s - t .Ghst

La nostra matrice ha 2 n + 1 + i 2 k i + k colonne, con indici che iniziano da 0 . Nella seguente constrcution X un Y sono due valori soddisfano 1 « X « Y . I rapporti X / 1 , Y / X possono essere grandi potenze di k e n . Sia K i = 2 i + 2 i jh2n+1+i2ki+k0XY1XYX/1,Y/Xkn.Ki=2i+2j=1iki

  • Per ogni , 0 i n , let h ( s i , K i ) = h ( s i , K i - k i - 1 ) = h ( s i , K i + k i + 1 + 1 ) = Y (se la coordinata esiste, la stessa sotto).si0inh(si,Ki)=h(si,Kiki1)=h(si,Ki+ki+1+1)=Y
  • Per ogni , let h ( x i ( j ) , K i - 1 + j ) = X ; Per ogni ¯ x i ( j ) , lasciate h ( ¯ x i ( j ) , K i - 1 + k i + 1 + j ) = X .xi(j)h(xi(j),Ki1+j)=Xxi¯(j)h(xi¯(j),Ki1+ki+1+j)=X
  • Per ogni , 1 i k e una letterale x nella clausola ϕ i , sia h ( x , K n + i ) = 1 .ϕi1ikxϕih(x,Kn+i)=1
  • Tutte le altre voci sono 0.

Ad esempio, per il grafico di esempio sopra è la matrice corrispondente inserisci qui la descrizione dell'immagine

Ora affermiamo: il 3CNF originale è soddisfacente se e solo se il valore massimo è .(2n+1)Y+ikiX+k

Considera che la pianificazione raggiunge il valore massimo. Dato che ci sono esattamente colonne in h contenenti Y , dovrebbero essere tutte coperte. Per la colonna K i + k i + 1 che ha due scelte di Y , supponiamo che la programmazione lo assegni a s i . Poiché la colonna K i deve essere assegnata a s i , per la consecutività dobbiamo perdere le colonne K i + 1 a K i + k(2n+1)hYKi+ki+1YsiKisiKi+1 . Stesse cose accadono se la programmazione assegna la colonna K i + k i + 1 a s i + 1 .Ki+kiKi+ki+1si+1

Pertanto, per avere il valore , dobbiamo selezionare tutti gli altri X disponibili nella matrice, che corrisponde a un'assegnazione sulle variabili. Quindi il valore residuo di k è ottenibile se e solo se l'assegnazione soddisfa ogni clausola.ikiXXk

In conclusione, decidere il valore massimo di una pianificazione legale è in . Forse è per questo che tutti i nostri precedenti tentativi di trovare un algoritmo fallirono.NP-hard


Ma, nella matrice di esempio, se seleziono ¯ x 2 e x 3 riesco comunque a raggiungere l'obiettivo. Cosa sto sbagliando? Anche la X in ¯ x 1 ( 1 ) dovrebbe essere una colonna a destra e la X in ¯ x 1 ( 2 ) dovrebbe essere una colonna a sinistrax1¯ x2¯x3Xx1¯(1)Xx1¯(2)
rotia

@rotia Sì, e che i mezzi a sinistra bisogna scegliere per avere 4 X . Quindi ciò corrisponde a un incarico soddisfacente x 1 = x 2 = 1 , x 3 = 0 . x1,x2,x3¯4Xx1=x2=1,x3=0
Willard Zhan,

Si può chiarire che cosa "Supponiamo che più grande nei due numeri di apparizioni di letterali x I e ¯ x i ." si intende? Qual è il numero di apparizione di un letterale? È qualcosa su dove appare nelle clausole / formula, o quante volte appare nella formula? È k ho un letterale o un numero? kixixi¯ki
DW

@DW è un numero. La mia espressione non era affatto chiara; L'ho modificato. ki
Willard Zhan,

@WillardZhan Sì. Ma se scelgo quelle variabili posso ottenere un valore maggiore di quello nella formula. Ad esempio, ho impostato e X = 7 , secondo la formula dovrei ottenere solo 450 punti (supponendo che k sia il numero di clausole). Ma, scegliendo x 1 , x 2 , ¯ x 3 posso arrivare a 452 punti raccogliendo i quattro a destraY=60X=7kx1,x2,x3¯
rotia

3

Questa soluzione ha problemi e verrà eliminata presto; vedi il commento di templatetypedef.

Puoi risolverlo in tempo polinomiale usando un flusso a costo minimo . Di seguito, tutti i bordi hanno una capacità unitaria.

  • Crea un vertice di origine e un vertice di destinazione t . Invieremo k unità di flusso da s a t .stkst
  • Crea vertici v 0 , , v n per rappresentare i punti temporali tra gli slot e un bordo diretto v j v j + 1 per ogni 0 j < n con costo 0.n+1v0,,vnvjvj+10j<n
  • Per ogni persona , creare quanto segue: i
    • Un vertice sub-source e un vertice sub-sink t i .siti
    • Per ogni , un bordo da s i a v j ha un costo Σ j k = 1 h ( i , k ) (che assumiamo essere 0 se j = 0 ).0j<nsivjΣk=1jh(i,k)j=0
    • Per ogni , un bordo da v j a t i avente costo - Σ j k = 1 h ( i , k ) .1jnvjtiΣk=1jh(i,k)
    • Un bordo con costo 0.ssi
    • Un bordo con costo 0.tit

Un flusso di costo minimo in questa rete avrà un costo totale pari al negativo del miglior profitto possibile. (Questo costo sarà negativo, ma che non è un problema.) C'è una soluzione integrale ottimale in cui ogni persona ha un singolo bordo lasciando s i con un flusso di 1 e un singolo bordo arrivo al t i con un flusso di 1 e tutti gli altri spigoli incidenti su s i o t ho flusso 0. Lasciate che questi flow-1 spigoli per persona i essere s i v j e v k t i : quindi k jisitisitiisivjvktikj, poiché i soli percorsi tra -vertices sono quelli che aumentano il pedice. Se k = j , alla persona i non viene assegnato alcun intervallo di tempo; in caso contrario, alla persona i viene assegnato il blocco di fasce orarie j + 1 , ... , k .vk=jiij+1,,k

Intuitivamente, ogni persona "ottiene" 1 unità di flusso da e sceglie un orario di inizio (bordo) e di fine (bordo); questi bordi di inizio e fine sono gli unici bordi con costo diverso da zero nella rete e possiamo rappresentare il valore di un blocco j + 1 , ... , k come differenza di due somme di prefisso. Le capacità dell'unità sui bordi tra i v -vertices agiscono per impedire a 2 persone di utilizzare la stessa fascia oraria.sj+1,,kv

È interessante notare che questa formulazione funzionerà anche se i valori potrebbero essere negativi.h(i,j)


3
Questo potrebbe fallire se una persona prende un percorso dalla sorgente al dissipatore di un'altra persona e viceversa? i
templatetypedef

@templatetypedef: credo che tu abbia ragione; Eliminerò questa risposta a breve. Che dire di questa costruzione, invece: Abbiamo gli stessi vertici e spigoli come prima, ma ora cerchiamo di "filo" di una singola unità di flusso attraverso una "pipeline" di persone (ordinata aumentando valori) cancellando tutti i bordi s s i eccetto per s s 1 e tutti i bordi t i t eccetto per t k t , e l'aggiunta di un bordo t i s i + 1 con un costo negativo enorme - M per ogni 1 i < kississ1tittkttisi+1M1i<k. Gli costringono la singola unità di flusso a visitare tutti i k - 1 di questi bordi della "pipeline" in qualsiasi soluzione ottimale. Mk1
j_random_hacker il

@j_random_hacker allora stai forzando un ordine di persone. k
Chao Xu,

@ChaoXu: Non la penso così: in qualsiasi assegnazione di blocchi alle persone, l'assegnazione può essere elencata in ordine crescente per persona. (Si noti che nulla vieta una persona essere assegnato un blocco termina a j ' < j , dove j è il primo blocco assegnato alla persona i ). Ma ho la sensazione che un parente stretto del problema che ha colpito il mio primo il tentativo influisce anche su questo ...i>ij<jji
j_random_hacker il

@j_random_hacker Il costo di richiederebbe che s io di essere il i ° persona nella soluzione ottimale. sivjsii
Chao Xu,
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.