Quali tecniche di programmazione ci sono per trovare la combinazione di input che produce il miglior risultato? [chiuso]

1

Sto lavorando con un grande insieme di dati in questo momento e ho scritto un programma che calcola un risultato basato su alcuni input. Ho 10 ingressi, ognuno di essi ha circa 20 diversi valori possibili. Non sono sicuro di quale tecnica utilizzare per trovare la combinazione di questi input che produrrà il risultato più grande.

Ecco un esempio inventato che equivale sostanzialmente alla realtà, ma più semplice da dimostrare:

Ci sono film, utenti e valutazioni degli utenti. Supponiamo di avere informazioni sull'età, il paese, il sesso, il segno zodiacale, il colore dei capelli, ecc. L'obiettivo in questo scenario sarebbe quello di trovare la combinazione di intervallo di età, paese, sesso ecc. Che porterebbe alla media più grande valutazione per un determinato film. Infine aggiungiamo una restrizione del numero minimo di voti, in modo che quando otteniamo una combinazione di input che ci restituisce un singolo utente che ha dato al film un punteggio perfetto, ignoriamo questa combinazione.

Cosa ho già provato:

  1. annidato per cicli. In questo modo verranno testate tutte le combinazioni possibili, ma verranno eseguite per un mese - troppo lungo.
  2. Una specie di algoritmo genetico. Lascio che il programma scelga valori casuali per gli input e salvi e riutilizzi i valori che hanno contribuito ai migliori risultati. Applica alcune modifiche quando il programma rimane bloccato sugli stessi valori troppo a lungo. Ho ottenuto dei buoni risultati usando questo metodo, ma non sono riuscito a riprodurli spesso su percorsi diversi, quindi suppongo che forse mi stia perdendo risultati ancora migliori usando questo approccio.
  3. Ho provato ad analizzare ciascun input separatamente, dando il resto dei valori predefiniti e quindi combinando i migliori singoli input insieme. Stesso risultato del metodo # 2.

Vorrei sapere se esistono algoritmi / tecniche conosciute per risolvere questo tipo di problemi.

    
posta Limbo Exile 27.10.2016 - 13:03
fonte

2 risposte

2

Questo è un piccolo aiuto concreto, ma forse un incoraggiamento.

  • Hai già calcolato che non puoi permetterti di controllare tutte le combinazioni di valori 20^10 . Va bene. Significa che potresti dover convivere con una soluzione approssimata, ma nella maggior parte dei problemi reali le soluzioni approssimative non sono così male rispetto all'ottimale teorico.
  • Ciò significa che devi variare i tuoi valori non -sistematicamente. Fare tutto in modo casuale equivale alla programmazione genetica, dove le mutazioni sono casuali e solo la sopravvivenza è diretta.
  • Variare sistematicamente i valori significa probabilmente mantenere i valori individuali che hanno portato un miglioramento e il cambiamento degli altri. Quella speranza sarebbe che un'impostazione che funziona bene in un contesto potrebbe anche funzionare bene in un altro contesto, in modo che tu possa approssimare le impostazioni combinate ottimali combinando impostazioni ottimali individuali.
  • Se questa ipotesi è giustificata o meno, di solito dipende dal dominio in questione. Un puzzle di sudoku sarebbe un incubo: ogni scelta in ogni cella dipende da tutti vicini di riga e colonna. Indovinare chiaramente i valori da soli e combinarli non ti porterà da nessuna parte. Ma un processo di fabbricazione complesso con molti input, output e flussi di materiale potrebbe essere approssimato abbastanza bene ottimizzando i sottocomponenti distinti uno alla volta.
risposta data 27.10.2016 - 13:22
fonte
0

Dai un'occhiata a Programmazione lineare Esistono alcuni strumenti commerciali che eseguono tali operazioni (ad es. IBM ILOG CPLEX, GAMS).

Puoi consultare la descrizione nella pagina di wikipedia per vedere quali sono gli algoritmi più importanti che possono essere utilizzati.

    
risposta data 27.10.2016 - 15:17
fonte