Domanda

in un altro post, MSN mi ha dato una buona guida per risolvere il mio problema di algebra ( Calcolo prezzo di offerta dal costo totale ). Ora, anche se posso calcolarlo a mano, sono completamente bloccato su come scrivere questo in pseudocodice o codice. Qualcuno potrebbe darmi un rapido suggerimento? 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
È stato utile?

Soluzione

La funzione semplifica in:

                  / 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 consideri 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 inseriscono i costi in ciascuna funzione, si ottiene un valore di offerta stimato per quell'intervallo. È necessario verificare che questo valore rientri effettivamente nell'intervallo valido di tali funzioni.

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 è in costante aumento, al massimo una di quelle funzioni darà un valore accettabile. Ma per alcuni input nessuno di essi darà un buon valore. Questo perché la funzione originale salta su questi 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 = 1182 per esempio.

Altri suggerimenti

A causa dell'uso di PIN e soffitto , non vedo un modo semplice per invertire il calcolo. Supponendo che bid abbia una precisione fissa (immagino due decimali dietro il punto) puoi sempre usare una ricerca binaria (dato che le funzioni sono monotone).

Modifica: dopo averci pensato un po 'di più, ho osservato che, prendendo x = bid * 1.02 + 100 , i costi finali sono compresi tra x + 15 (esclusivo) e x + 70 (incluso) (ovvero x + 15 < costo finale < x + 70 ). Date le dimensioni di questo intervallo ( 70-15 = 55 ) e il fatto che i valori speciali (vedi nota sotto) per bid sono tutti più di questo, puoi prendi x + 15 = costo finale e x + 70 = costo finale , ottieni i giusti casi / valori di utilizzo e costi aggiunti e risolvi semplicemente quell'equazione (che non ha più o PIN o soffitto in esso).

Per illustrare, lascia che il costo finale sia 222 . Da x + 15 = 222 segue che bid = 107 / 1.02 = 104.90 . Quindi abbiamo che i costi di utilizzo sono indicati da bid * 0.1 e che i costi aggiuntivi sono 5 . In altre parole, otteniamo costo finale = offerta * 0.1 + offerta * 0.02 + 5 + 100 + offerta = offerta * 1.12 + 105 e quindi offerta = (222-105) /1.12 = 104.46 . Poiché questo valore di bid indica che sono stati presi i giusti valori per l'utilizzo e i costi aggiuntivi, sappiamo che questa è la soluzione.

Tuttavia, se avessimo prima esaminato x + 70 = 222 , avremmo ottenuto quanto segue. Per prima cosa otteniamo per questo presupposto che bid = 52 / 1.02 = 50.98 . Ciò significa che i costi di utilizzo sono 10 e i costi aggiuntivi sono 5 . Quindi otteniamo costi finali = 10 + bid * 0,02 + 5 + 100 + bid = bid * 1.02 + 115 e quindi bid = (222-115) /1.02 = 104.90 . Ma se bid è 104,90 , i costi di utilizzo non sono 10 ma bid * 0.1 , quindi non lo è la soluzione giusta.

Spero di averlo spiegato abbastanza chiaramente. Altrimenti, per favore fatemi sapere.

N.B .: Con valori speciali intendo quelli per i quali cambia la funzione che definisce i valori di utilizzo e i costi aggiunti. Ad esempio, per i costi di utilizzo questi valori sono 100 e 500 : sotto 100 si utilizza 10 , sopra 500 usi 50 e nel frattempo usi bid * 0.1 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top