Как создать формулу с убывающей доходностью? - PullRequest
9 голосов
/ 11 мая 2010

Полагаю, это математический вопрос, а не вопрос программирования, но как можно создать формулу с убывающей отдачей?

Вот несколько примеров того, как я хочу, чтобы кривая выглядела.

f(1) = 1
f(1.5)= .98
f(2) = .95
f(2.5) = .9
f(3) = .8
f(4) = .7
f(5) = .6
f(10) = .5
f(20) = .25 

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

Другой способ сказать это - использовать реальный пример. Вы знаете, что в Diablo II у них есть Magic Find? Есть уменьшающаяся отдача от магической находки. Если вы получите 100%, настоящая волшебная находка все еще будет 100%. Но чем больше вы получаете, тем меньше ваша настоящая магическая находка. Столько всего, что говорят, если у вас было 1200, ваша настоящая волшебная находка, вероятно, составляет 450%. Поэтому у них есть такая функция:

actualMagicFind(magicFind) = // some way to reduced magic find

Ответы [ 3 ]

17 голосов
/ 11 мая 2010

f (x) = f (0) e -rx


, где r - коэффициент сложного убывающего дохода

Это просто экспоненциальный спад

4 голосов
/ 01 сентября 2015

f (1) = 1
f (1,5) = 0,98
f (2) = 0,95
f (2,5) = 0,9
f (3) = 0,8
f (4) = 0,7
f (5) = 0,6
f (10) = .5
f (20) = .25

Это не имеет смысла: для 3-5 добавление одного раза вычитает .1. С реальной кривой выход не будет равномерно распределен между любыми равномерно распределенными входами. Другими словами, ваша кривая не является кривой, как вы можете видеть на графике: https://docs.google.com/spreadsheets/d/1EEbRxTyYalPSyQ93rcIbKiIvmYRX1lhRvkRh_HyofJc/edit?usp=sharing

Так что давайте просто проигнорируем вашу «кривую»; Есть несколько способов создать убывающую отдачу. Один из моих любимых это:

f(x) = (x*a) / (x+b) + c

Вы можете сделать a, b и c все, что захотите. С этим форматом a + c по существу * становится вашим максимально возможным выводом, c является вашим минимумом, а b контролирует, насколько быстро масштаб выходных значений и его эффективность относительно значения a. Эта кривая, конечно, увеличивает выход при увеличении ввода, в то время как ваш пример хочет уменьшить выход при увеличении ввода. Чтобы это исправить, вы можете поменять числитель и знаменатель:

f(x) = (x+b) / (x*a) + c

Это делает минимальное выходное значение равным 1/a + c, максимальное выходное значение приближается к бесконечности, когда входное значение приближается к 0. b еще раз контролирует, насколько быстро масштабируется выход и его эффективность относительно значения a.


Другой подход - использовать что-то вроде того, что упоминал @Pierreten, хотя я не уверен, почему он явно использует e:

a^(-bx)

И a, и b оказывают глубокое влияние на скорость масштабирования кривой. Если a больше 0 и меньше 1, выход будет увеличиваться по мере увеличения входного сигнала, но также будет иметь противоположный эффект, то есть будет увеличиваться, а не уменьшаться. Если a больше 1, то вы увидите, что желаемый эффект выхода уменьшается по мере того, как вход увеличивается с уменьшением отдачи. Следующее - самое близкое, что я нашел к числам, которые вы описали:

f (x) = 1,01 ^ (- 6,96607x)
f (0) = 1
f (1) = 0,933
f (3) = 0,812
f (10) = 0,5
f (20) = 0,25

Есть и несколько других вариантов, но этого достаточно.

2 голосов
/ 11 мая 2010

Любая обратная экспоненциальная функция, такая как f (x) = 1 / (x 2 ) . Измените показатель степени, чтобы отрегулировать крутизну кривой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...