Программирование уравнения алгебры - PullRequest
2 голосов
/ 13 марта 2009

в другом посте MSN дал мне хорошее руководство по решению моей проблемы алгебры ( Расчет цены предложения от общей стоимости ). Теперь, хотя я могу вычислить это вручную, я полностью застрял на том, как написать это в псевдокоде или коде. Кто-нибудь может дать мне быстрый совет? Кстати, я хочу рассчитать ставку с учетом окончательных затрат.

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

Ответы [ 2 ]

3 голосов
/ 13 марта 2009

Функция упрощается до:

                  / 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

Если вы рассматриваете каждую пьесу как отдельную функцию, их можно инвертировать:

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

Если вы включите свои затраты в каждую функцию, вы получите приблизительное значение ставки для этого диапазона. Вы должны убедиться, что это значение действительно находится в допустимом диапазоне этих функций.

Пример:

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!

Поскольку исходная функция строго увеличивается, самое большее одна из этих функций даст приемлемое значение. Но для некоторых входов ни один из них не даст хорошего значения. Это потому, что исходная функция перепрыгивает через эти значения.

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

Так, например, ни одна функция не выдаст приемлемое значение для cost = 1182.

2 голосов
/ 13 марта 2009

Из-за использования PIN и ceiling я не вижу простого способа инвертировать вычисления. Предполагая, что bid имеет фиксированную точность (я думаю, что две точки после точки), вы всегда можете использовать двоичный поиск (так как функции монотонны).

Редактировать: Подумав об этом еще раз, я заметил, что, взяв x = bid*1.02 + 100, мы получаем, что окончательные затраты находятся между х + 15 (исключая) и х + 70 (включительно) (т.е. x+15 < final cost < x+70). Учитывая размер этого диапазона (70-15=55) и тот факт, что специальные значения (см. Примечание ниже) для bid отличаются друг от друга больше, чем это, вы можете взять x+15 = final cost и x+70 = final cost, получить правильные случаи / значения использования и добавленные затраты и просто решите это уравнение (в котором больше нет ни PIN, ни ceiling).

Для иллюстрации, пусть конечная стоимость будет 222. Из x+15 = 222 следует, что bid = 107/1.02 = 104.90. Тогда мы получаем, что затраты на использование задаются bid*0.1, а дополнительные расходы 5. Другими словами, мы получаем final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105 и, следовательно, bid = (222-105)/1.12 = 104.46. Поскольку это значение bid означает, что были приняты правильные значения для использования и дополнительных затрат, мы знаем, что это решение.

Однако, если бы мы сначала посмотрели на x+70 = 222, мы получили бы следующее. Сначала мы получаем это для этого предположения, что bid = 52/1.02 = 50.98. Это означает, что стоимость использования составляет 10, а дополнительные расходы 5. Таким образом, мы получаем final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115 и, следовательно, bid = (222-115)/1.02 = 104.90. Но если bid равно 104.90, то затраты на использование составляют не 10, а bid*0.1, поэтому это не правильное решение.

Надеюсь, я объяснил это достаточно ясно. Если нет, пожалуйста, дайте мне знать.

N.B .: Под специальными значениями я подразумеваю те, для которых изменяется функция, определяющая значения использования и добавленные затраты. Например, для стоимости использования эти значения составляют 100 и 500: ниже 100 вы используете 10, выше 500 вы используете 50 и между вы используете bid*0.1.

...