Programmazione di un'equazione di algebra
-
22-07-2019 - |
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
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
.