Программирование уравнения алгебры

голоса
2

в другом посте, 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
Задан 13/03/2009 в 02:08
источник пользователем
На других языках...                            


2 ответов

голоса
2

Благодаря использованию 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, так что это не является правильным решением.

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

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

Ответил 13/03/2009 в 02:47
источник пользователем

голоса
3

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

                  / 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, например.

Ответил 13/03/2009 в 03:32
источник пользователем

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