Het programmeren van een algebravergelijking

stemmen
2

in een andere post, MSN gaf me een goede gids op het oplossen van mijn algebra probleem ( berekenen biedprijs van de totale kosten ). Nu, hoewel ik het kan berekenen met de hand, ik ben helemaal vast over hoe dit te schrijven in pseudo-code of code. Iedereen kon me snel een hint geven? By the way, ik wil het bod te berekenen, gezien de uiteindelijke kosten.

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
De vraag is gesteld op 13/03/2009 om 02:08
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Als gevolg van het gebruik van PINen ceiling, denk ik niet een gemakkelijke manier om de berekening te keren zien. Ervan uitgaande dat bidis een vaste precisie (ik zou twee decimalen achter de punt denk ik) kunt u altijd gebruik maken van een binary search (zoals de functies monotoon).

Edit: Na het denken over het wat meer, merkte ik dat, gelet op x = bid*1.02 + 100, we hebben dat de uiteindelijke kosten zijn tussen x + 15 (exclusief) en x + 70 (inclusief) (ie x+15 < final cost < x+70). Gezien de omvang van deze range ( 70-15=55) en het feit dat de speciale waarden (zie toelichting hieronder) voor bidzijn allemaal uit elkaar meer dan dit, u kunt nemen x+15 = final costen x+70 = final cost, de juiste gevallen / waarden van het gebruik en de extra kosten en eenvoudig op te lossen die vergelijking ( die niet langer ofwel PINof ceilingdaarin).

Om dit te illustreren, laat de uiteindelijke kosten zijn 222. Van x+15 = 222daaruit volgt dat bid = 107/1.02 = 104.90. Dan hebben we dat het gebruik kosten worden gegeven door bid*0.1en dat de extra kosten zijn 5. Met andere woorden, we krijgen final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105dus bid = (222-105)/1.12 = 104.46. Als deze waarde van bidde middelen van de juiste waarden voor het gebruik en de extra kosten werden genomen, weten we dat dit de oplossing.

Echter, als we eerst zouden hebben gekeken x+70 = 222, dan zouden we het volgende te krijgen. Eerst krijgen we dat voor deze veronderstelling dat bid = 52/1.02 = 50.98. Dit betekent dat het gebruik van kosten 10en de extra kosten zijn 5. Dus we krijgen final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115en daarom bid = (222-115)/1.02 = 104.90. Maar wanneer bidis 104.90dan het gebruik kosten niet 10, maar bid*0.1, dus dit is niet de juiste oplossing.

Ik hoop dat ik legde het duidelijk genoeg is. Zo niet, laat het me weten.

NB: Met speciale waarden bedoel ik die waarvoor de functie de waarden te bepalen van het gebruik en de extra kosten te veranderen. Bijvoorbeeld voor het gebruik van de kosten van deze waarden zijn 100en 500: onder 100u 10, boven 500u 50en tussen die u gebruikt bid*0.1.

antwoordde op 13/03/2009 om 02:47
bron van user

stemmen
3

De functie vereenvoudigt:

                  / 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

Als je elk stuk als een aparte functie te overwegen, kunnen ze worden omgekeerd:

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

Als u uw kosten te sluiten op elke functie krijg je een geschatte bod waarde voor dat bereik. U dient te controleren of deze waarde inderdaad binnen die functies geldige bereik.

Voorbeeld:

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!

Aangezien de oorspronkelijke functie strikt toeneemt, zal hooguit één van deze functies een acceptabele waarde. Maar voor sommige ingangen geen van hen zal een goede waarde te geven. Dit komt omdat de oorspronkelijke functie over die waarden sprongen.

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

Dus geen functie zal een aanvaardbare prijs te geven cost = 1182bijvoorbeeld.

antwoordde op 13/03/2009 om 03:32
bron van user

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