Programmere en algebra ligning

stemmer
2

i et annet innlegg, MSN ga meg en god guide på å løse min algebra problem ( Beregning tilbudsprisen fra total kostnad ). Nå, selv om jeg kan beregne det for hånd, er jeg helt fast på hvordan du skriver dette i pseudokode eller kode. Noen kunne gi meg en rask hint? Forresten, jeg ønsker å beregne bud gitt de endelige kostnadene.

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
Publisert på 13/03/2009 klokken 01:08
kilden bruker
På andre språk...                            


2 svar

stemmer
2

På grunn av bruken av PINog ceiling, ser jeg ikke en enkel metode for å reversere beregningen. Forutsatt at bidhar en fast presisjon (jeg vil gjette to desimaler bak dot) kan du alltids bruke en binær søk (som funksjonene er monotone).

Edit: Etter å ha tenkt på det litt mer, jeg observert at, tar x = bid*1.02 + 100, har vi at de endelige kostnadene er mellom x + 15 (eksklusiv) og x + 70 (inkluderende) (dvs. x+15 < final cost < x+70). Gitt størrelsen på dette området ( 70-15=55) og det faktum at de spesielle verdier (se merknad nedenfor) for bider alle fra hverandre mer enn dette, kan du ta x+15 = final costog x+70 = final costfår de riktige saker / verdier av bruk og merkostnader og bare løse ligningen ( som ikke lenger har enten PINeller ceilingi det).

For å illustrere, la den endelige kostnaden være 222. Fra x+15 = 222det følger at bid = 107/1.02 = 104.90. Da har vi at bruk kostnader er gitt av bid*0.1og at de ekstra kostnadene er 5. Med andre ord, vi får final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105og derfor bid = (222-105)/1.12 = 104.46. Som denne verdien av bidmidler de riktige verdiene for bruk og ekstra kostnader ble tatt, vet vi at dette er løsningen.

Men hvis vi ville ha først så på x+70 = 222, vil vi få følgende. Først får vi at for denne antagelsen om at bid = 52/1.02 = 50.98. Dette betyr at bruk kostnader er 10og de ekstra kostnadene er 5. Så vi får final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115og derfor bid = (222-115)/1.02 = 104.90. Men hvis bider 104.90da bruk kostnader er ikke 10men bid*0.1, så dette er ikke den riktige løsningen.

Jeg håper jeg forklarte det tydelig nok. Hvis ikke, kan du gi meg beskjed.

NB: Med spesielle verdier mener jeg de som funksjonen som definerer verdiene for bruk og ekstra kostnader endre. For eksempel, for bruk kostnadene disse verdiene er 100og 500: under 100du bruker 10, ovenfor 500du bruker 50og i mellom du bruker bid*0.1.

Svarte 13/03/2009 kl. 01:47
kilden bruker

stemmer
3

Funksjonen kan forenkles til:

                  / 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

Hvis du tenker på hver brikke som en egen funksjon, kan de bli invertert:

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

Hvis du kobler kostnadene til hver funksjon du får en anslått bud verdi for dette området. Du må kontrollere at denne verdien faktisk er innenfor det fungerer gyldig område.

Eksempel:

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!

Siden den opprinnelige funksjon er strengt øker, vil høyst én av disse funksjoner gi en akseptabel verdi. Men for noen innspill ingen av dem vil gi en god verdi. Dette er fordi den opprinnelige funksjon hopper over disse verdiene.

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

Så ingen funksjon vil gi en akseptabel verdi for cost = 1182for eksempel.

Svarte 13/03/2009 kl. 02:32
kilden bruker

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