Algoritmi per l'assegnazione di palle N in scatole M

5

Ogni casella non ha almeno palle e al massimo N palle. Ovviamente il numero totale di palline nelle caselle M deve essere uguale a N.

Per ogni allocazione, ho calcolato un valore basato sull'allocazione: V=f(n_1,n_2,...n_m) . Voglio scoprire il massimo di V dato N, M e f. Ho bisogno di memorizzare il massimo V e i corrispondenti risultati di allocazione.

Utilizzando i cicli la complessità dovrebbe essere O (N ^ M), ma in questo caso il ciclo non è la strada da percorrere.

Ogni suggerimento o suggerimento è molto apprezzato. Avere pochi algoritmi DP classici a portata di mano ma senza fortuna.

Nota: f = f1 + f2 + ... f_m , dove f (i) 's sono polinomi. f (i) solo dipende da n (i).

    
posta Lovnlust 03.05.2015 - 15:18
fonte

2 risposte

2

Non so quali algoritmi DP hai provato, ma qui è uno che risolve il tuo problema in O (M * N²), che è sicuramente migliore di O (N ^ M).

L'algoritmo funziona induttivamente aumentando il numero di caselle. In ogni fase, memorizzi il massimo di f1 + ... + f_m, dove m è il numero di caselle nel particolare passo (0 < = m < = M). Per un dato m, risolvi il problema per ogni n tra 0 e N , e usi le soluzioni per le scatole m-1 per risolvere il problema per i box m (anche per ogni n tra 0 e N ).

Per m = 1, genera le soluzioni per 0 < = n < = N - > O (N)

Per m = 2 e ogni 0 < = n < = N, usa ancora "forza bruta" - > O (n²)

Per m = 3 e ogni 0 < = n < = N e 0 < = k < = n, calcola f3 (k) + max ((f1 (x1) + f2 (x2)), dove x1 + x2 = nk (il termine massimo è il risultato del passo m = 2. Per ogni n, mantieni il valore massimo su tutto k. - > ancora O (N²) , che è lo stesso di O ((m-1) * n²)

Ora continua così: ogni passo ha bisogno solo di N * (N + 1) / 2, quindi O (N²), nuovi calcoli, e hai passaggi M-1 in totale, quindi la complessità complessiva è O (M * n²).

    
risposta data 03.05.2015 - 17:33
fonte
3

Se non hai bisogno del massimo globale ma solo di una soluzione "abbastanza buona", puoi affrontare questo tipo di problema con una tecnica di approssimazione conosciuta come ricerca locale . L'idea è che inizi con una determinata soluzione e provi a migliorarla facendo "semplici piccoli passi".

Nel tuo caso, un tale passaggio potrebbe spostare una palla da una scatola all'altra. Ecco allora un semplicistico algoritmo di ricerca locale:

  • a max ← ⊥
  • f max ← -1
  • Ripeti k volte:
    • Genera un'allocazione casuale a ← ( n 1 , ..., n m )
    • Mentre puoi trovare i e j in modo che n i & gt ; 0, n j < N e spostando una pallina dalla casella i alla casella j aumenta f ( a ):
      • Imposta a ← ( n 1 , ..., n i - 1, ..., n j + 1, ... n < i> m )
    • Se f ( a ) > f max :
      • a max a
      • f max f ( a )
  • Emette la migliore allocazione a max trovata

Se ripeti il ciclo principale una sola volta ( k = 1), otterrai il massimo locale da un punto di partenza casuale. Questo spesso non sarà una soluzione valida a livello globale. Ripetendo la ricerca locale alcune volte da diversi punti di partenza casuali e infine prendendo il massimo locale, aumenti le possibilità di raggiungere qualcosa di più vicino al massimo globale.

Se sai di più sul tuo f , potresti essere in grado di progettare un "piccolo passo" migliore del semplice spostamento di una pallina in un'altra casella.

Il tipo di algoritmo come la ricerca locale con più riavvii casuali è noto come meta euristico poiché è applicabile a un gran numero di problemi senza conoscerne molto. (Questa particolare forma è anche a volte indicata come algoritmo di alpinismo .) Se cerchi la meta euristica, troverai una vasta gamma di approcci tra cui scegliere.

    
risposta data 03.05.2015 - 16:36
fonte

Leggi altre domande sui tag