Il problema
Supponiamo di avere un elenco di oggetti di lunghezza variabile contenente una lista a lunghezza fissa di numeri decimali positivi come attributi.
Esempio JSON
[
{a: 0.1, b: 0.6, c: 0.0},
{a: 1.0, b: 1.3, c: 0.2},
{a: 1.2, b: 0.1, c: 0.3},
{a: 0.2, b: 0.2, c: 0.5},
{a: 0.8, b: 0.2, c: 0.6}
]
Crea una distribuzione di quantità per moltiplicare ciascuno degli attributi degli oggetti per rendere il prodotto di somma di tutti gli oggetti moltiplicato per la distribuzione equivale a 1
. Voglio utilizzare il minor numero possibile di oggetti per creare il totale, piuttosto che usare piccole quantità di ogni oggetto.
Se la distribuzione era [1, 1, 1, 1, 1]
, il risultato sarebbe {a: 3.3, b: 2.4, c: 1.6}
perché dovremmo semplicemente sommare ciascuno degli attributi poiché sono tutti moltiplicati per 1
.
Una soluzione
Una distribuzione perfetta in questo caso sarebbe [0, 0.5, 0, 1.5, 0.25]
che produce {a: 1, b: 1, c: 1}
.
Creazione di un algoritmo
Voglio creare un algoritmo che risolva questo numero per insiemi di dati molto più grandi con più attributi.
Primo tentativo
Il mio primo tentativo era di iniziare con un valore arbitrario e aggiungere abbastanza per portare solo un attributo a 1
. Quindi trova la corrispondenza più vicina per gli attributi mancanti. A questo punto vorrei sottrarre dalle quantità per consentire che la nuova quantità venisse aggiunta senza superare il 1
in qualsiasi categoria. Scegliere le giuste quantità per abbassare era difficile.
Secondo tentativo (rimozione del limite)
Ho quindi pensato di rimuovere il limite di 1
e di fare in modo che l'algoritmo si fermasse quando tutti i prodotti di somma erano relativamente uguali. In questo modo aumentando la quantità di uno diminuisce la quantità relativa di tutti gli altri. Speriamo di eliminare i cattivi valori, facendo in modo che abbiano poco significato sul risultato finale. Probabilmente avrei bisogno di un valore di cutoff per assicurarmi di non finire con un po 'di tutto.
Nel nostro esempio, ho trovato che la distribuzione [0, 2, 0, 6, 1]
ha dato come risultato {a: 4, b: 4, c: 4}
. Dividendo la distribuzione per 4
, ho ottenuto una distribuzione perfetta di [0, 0.5, 0, 1.5, 0.25]
.
Altre soluzioni e amp; Miglioramenti
Sto cercando suggerimenti per miglioramenti, preoccupazioni o soluzioni alternative a questo problema. Ci sono problemi correlati in modo da poter fare più ricerche su potenziali soluzioni?