Programowanie równania matematycznego

głosy
2

w innym poście, MSN dał mi dobry przewodnik na rozwiązanie mojego problemu matematycznego ( Obliczanie cenę oferty od całkowitego kosztu ). Teraz, chociaż mogę go obliczyć ręcznie, jestem całkowicie zatrzymany na jak napisać to w Pseudokod lub kodu. Ktoś mógłby dać mi szybką podpowiedź? Nawiasem mówiąc, chcę, aby obliczyć stawkę podane ostateczne koszty.

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
Utwórz 13/03/2009 o 02:08
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

Ze względu na wykorzystanie PINi ceiling, ja nie widzę łatwy sposób odwrócić obliczenia. Zakładając, że bidma stałą precyzji (Przypuszczam dwóch miejsc po przecinku tył kropka) zawsze można użyć przeszukiwanie binarne (jak funkcje są monotoniczne).

Edit: Po myślenie o nim czegoś więcej, zauważyłem, że biorąc x = bid*1.02 + 100, mamy, że ostateczne koszty są między X + 15 (Exclusive) oraz x + 70 (włącznie) (to znaczy x+15 < final cost < x+70). Biorąc pod uwagę wielkość tego zakresu ( 70-15=55) oraz fakt, że wartości szczególnych (patrz uwaga poniżej) bidsą od siebie bardziej niż to, można wziąć x+15 = final costi x+70 = final cost, uzyskać prawo przypadków / wartości zużycia i dodatkowych kosztów i po prostu rozwiązać ten równanie ( który nie ma już ani PINczy ceilingw nim).

Aby zilustrować, niech będzie ostateczny koszt 222. Z x+15 = 222powyższego wynika, że bid = 107/1.02 = 104.90. Następnie mamy, że koszty użytkowania są podane bid*0.1i że dodatkowe koszty 5. Innymi słowy, mamy final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105i dlatego bid = (222-105)/1.12 = 104.46. Jak to wartość bidoznacza prawo do użytkowania i wartości dodatkowych kosztów zostały podjęte, wiemy, że jest to rozwiązanie.

Jednakże, jeśli mielibyśmy pierwszy spojrzał x+70 = 222, chcielibyśmy uzyskać następujący. Po pierwsze mamy, że z tego założenia, że bid = 52/1.02 = 50.98. Oznacza to, że koszty użytkowania są 10i dodatkowe koszty 5. Więc mamy final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115i dlatego bid = (222-115)/1.02 = 104.90. Ale jeśli bidjest 104.90to koszty użytkowania nie są 10jednak bid*0.1tak nie jest dobrym rozwiązaniem.

Mam nadzieję, że wyjaśniłem to wystarczająco jasno. Jeśli nie, proszę dać mi znać.

NB: Przy wartościach specjalnymi mam na myśli tych, dla których funkcja definiowania wartości zużycia i dodatkowe koszty zmienić. Na przykład w przypadku kosztów użytkowania wartości te są 100i 500: poniżej 100użyć 10przede 500użyć 50iw między użyć bid*0.1.

Odpowiedział 13/03/2009 o 02:47
źródło użytkownik

głosy
3

Funkcja upraszcza się do:

                  / 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

Jeśli wziąć pod uwagę każdy kawałek jako odrębnej funkcji, mogą być odwrócone:

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

Jeśli podłączysz swój koszt do każdej funkcji można uzyskać szacunkową wartość stawek dla tego zakresu. Musisz upewnić się, że wartość ta jest w istocie, że funkcjonuje prawidłowy zakres.

Przykład:

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!

Od pierwotnej funkcji jest ściśle wzrasta, co najwyżej jeden z tych funkcji daje akceptowalną wartość. Ale dla niektórych wejść żadna z nich nie daje dobrą wartość. To dlatego, że pierwotna funkcja skacze nad tymi wartościami.

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

Więc żadna funkcja daje akceptowalną wartość dla cost = 1182np.

Odpowiedział 13/03/2009 o 03:32
źródło użytkownik

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