Assegnazione di una somma intera in modo proporzionale a un insieme di real

3

Immagina di avere un importo intero (ad esempio centesimi interi) da allocare in un insieme ponderato di elementi in cui l'importo totale stanziato deve sommarsi all'importo originale. Ad esempio:

Amount: $1.00

Item      Weight     Allocated Amount
a         1          $0.33
b         1          $0.33
c         1          $0.33

Quale potrebbe essere portato alla soddisfazione regolando la voce c a $ 0,34.

Esiste un algoritmo che produce una distribuzione uniforme dell'errore di arrotondamento con solo i pesi precedenti e il peso totale noto?

    
posta Mitch 18.01.2017 - 02:25
fonte

3 risposte

1

La soluzione dipende molto da ciò che vuoi fare con questi dati, o da come lo usi.

Dopo aver diviso i numeri e mantenuto solo il risultato, ad esempio 0.33, alcune informazioni vengono perse. Un modo per risolvere questo problema è quello di conservare i numeri originali, ad esempio, anziché 0,33, mantenere 1 e 3 e 1 per il peso. In questo modo, nessuna informazione è persa.

So che non è la risposta alla tua domanda, ma il mio punto è che potrebbe essere necessario ripensare alla soluzione. Qualcosa che raggiunge l'obiettivo, anche se potrebbe essere diverso da quello che stai attualmente cercando.

    
risposta data 18.01.2017 - 17:47
fonte
0

Calcola ciascuna allocazione come somma parziale dei pesi con precisione arbitraria. Ad esempio:

Amount: $1.00

                     Running    New      Delta
                     Allocated  Running  From Prev.
Item      Weight     Amount     Rounded  Rounded
a         1          $0.0000    $0.33    $0.33
b         1          $0.3333    $0.67    $0.34
c         1          $0.6666    $1.00    $0.33

Running allocated := ((decimal)Total Amount) * Sum(preceeding weights) / Sum(total weight) 
New allocated     := ((decimal)Total Amount) 
                     * (Sum(preceeding weights) + current weight) 
                     / Sum(total weight)
New Rounded       := Round(New Allocated)
Allocation        := New Rounded - Prev Rounded

Ciò garantisce che l'errore di arrotondamento non si accumuli in quanto un numero non viene mai arrotondato dopo i passaggi successivi.

    
risposta data 18.01.2017 - 02:25
fonte
0

Ho riscontrato questo problema più volte e ho scoperto quanto segue che riduce al minimo gli arrotondamenti (ossia aumenta la precisione) con pesi variabili:

  1. Totalizza i pesi.
  2. Dividi il totale per il peso di ogni linea. Mantieni il quoziente e il resto su ogni riga.
  3. Mentre il totale dei quozienti non è uguale all'importo originale:
    1. Trova la riga con il miglior resto.
    2. Aumenta il suo quoziente di uno, diminuisci il resto del peso (ad esempio regola manualmente i risultati della divisione).
    3. Aumenta il totale calcolato di uno.

Quando questo è fatto, tutto si sommerà ei quozienti saranno il più precisi possibile.

    
risposta data 18.01.2017 - 20:27
fonte

Leggi altre domande sui tag