Programmazione di un'equazione algebrica

voti
2

in un altro post, MSN mi ha dato una buona guida per risolvere il mio problema di algebra ( Calcolo prezzo offerto dal costo totale ). Ora, anche se posso calcolare a mano, io sono completamente bloccato su come scrivere questo pseudocodice o codice. Qualcuno mi potrebbe dare un rapido accenno? A proposito, voglio calcolare l'offerta dati i costi finali.

usage cost(bid) = PIN(bid*0.10, 10, 50)
seller cost(bid) = bid*.02
added cost(bid) = PIN(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10)
storing cost(bid) = 100
So the final cost is something like:

final cost(bid) = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 20) + PIN(ceiling((bid - 1000)/2000)*10, 0, 20) + bid*.02 + 100 + bid
Solve for a particular value and you're done.

For example, if you want the total cost to be $2000:

2000 = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10) + bid*.02 + 100 + bid.
Bid must be at least > 1500 and < 2000, which works out nicely since we can make those PIN sections constant:

2000 = 50 + 10 + 5 + 100 + bid*1.02
1835 = bid*1.02
bid = 1799.0196078431372549019607843137
È pubblicato 13/03/2009 alle 02:08
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Grazie all'uso di PINe ceiling, non vedo un modo semplice per invertire il calcolo. Supponendo che bidha una precisione fisso (direi due decimali dietro il punto) si può sempre usare una ricerca binaria (come le funzioni sono monotone).

Edit: Dopo averci pensato un po ', ho osservato che, tenuto x = bid*1.02 + 100, abbiamo che i costi finali sono comprese tra + 15 x (esclusiva) e x + 70 (compreso) (ie x+15 < final cost < x+70). Date le dimensioni di questa gamma ( 70-15=55) e il fatto che i valori speciali (vedi nota sotto) per bidsono tutti parte più di questo, si può prendere x+15 = final coste x+70 = final cost, ottenere la giusta casi / valori di utilizzo e costi aggiuntivi e semplicemente risolvere che l'equazione ( che non ha più né PINo ceilingin esso).

Per illustrare, lasciare che il costo finale sarà 222. Da x+15 = 222segue che bid = 107/1.02 = 104.90. Poi abbiamo che i costi di utilizzo sono dati da bid*0.1e che i costi aggiuntivi sono 5. In altre parole, si ottiene final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105e quindi bid = (222-105)/1.12 = 104.46. Poiché questo valore del bidmezzo sono state effettuate le giusti valori per l'utilizzo e costi aggiuntivi, sappiamo che questa è la soluzione.

Tuttavia, se avremmo guardato prima x+70 = 222, otterremmo quanto segue. In primo luogo si ottiene che per questo presupposto che bid = 52/1.02 = 50.98. Ciò significa che i costi di utilizzo sono 10ei costi aggiuntivi sono 5. Così otteniamo final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115e quindi bid = (222-115)/1.02 = 104.90. Ma se bidè 104.90poi i costi di utilizzo non sono 10, ma bid*0.1, quindi questo non è la soluzione giusta.

Spero ho spiegato con sufficiente chiarezza. In caso contrario, per favore fatemelo sapere.

NB: Con valori speciali intendo quelli per i quali la funzione di definizione dei valori di utilizzo e costi aggiuntivi cambiare. Ad esempio, per il costo di utilizzo di questi valori sono 100e 500: al di sotto 100di utilizzare 10, al di sopra 500di utilizzare 50e in mezzo si utilizza bid*0.1.

Risposto il 13/03/2009 a 02:47
fonte dall'utente

voti
3

La funzione semplifica a:

                  / 1.02 * bid + 115   bid <   100
                  | 1.12 * bid + 105   bid <=  500
final cost(bid) = | 1.02 * bid + 160   bid <= 1000
                  | 1.02 * bid + 165   bid <= 3000
                  \ 1.02 * bid + 170   otherwise

Se si considera ogni pezzo come una funzione separata, possono essere invertiti:

bid_a(cost) = (cost - 115) / 1.02
bid_b(cost) = (cost - 105) / 1.12
bid_c(cost) = (cost - 160) / 1.02
bid_d(cost) = (cost - 165) / 1.02
bid_e(cost) = (cost - 170) / 1.02

Se si collega il costo in ogni funzione si ottiene un valore di offerta stimata per quella fascia. È necessario verificare che questo valore infatti è che le funzioni all'interno di intervallo valido.

Esempio:

cost = 2000

bid_a(2000) = (2000 - 115) / 1.02 = 1848  Too big! Need to be < 100
bid_b(2000) = (2000 - 105) / 1.12 = 1692  Too big! Need to be <= 500
bid_c(2000) = (2000 - 160) / 1.02 = 1804  Too big! Need to be <= 1000
bid_d(2000) = (2000 - 165) / 1.02 = 1799  Good. It is <= 3000
bid_e(2000) = (2000 - 170) / 1.02 = 1794  Too small! Need to be > 3000

Just to check:

final cost(1799) = 1.02 * 1799 + 165 = 2000   Good!

Poiché la funzione originale è strettamente crescente, al massimo uno di tali funzioni darà un valore accettabile. Ma per alcuni input nessuno di loro vi darà un buon valore. Questo perché la funzione originale salta su quei valori.

final cost(1000) = 1.02 * 1000 + 160 = 1180
final cost(1001) = 1.02 * 1001 + 165 = 1186

Quindi nessuna funzione darà un valore accettabile per cost = 1182per esempio.

Risposto il 13/03/2009 a 03:32
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more