2009-09-23 7 views
3

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

код, в идеале взять несколько аргументов:

  • алгоритма использовать (определяет, как быстро возрастает значение
  • начального значения
  • конечного значения (максимум)
  • времени (количество времени между начальным и конечным значением)
  • этап (гранулярность в миллисекундах)

Таким образом, каждый [шаг] событие будет поднято, указывая, какое значение в данный момент времени.

Это идеальная реализация, поэтому я открыт для предложений.

Любой входной сигнал был бы весьма признателен, спасибо :)

EDIT:

Позвольте мне быть более ясным ... сумма, значение увеличивается не линейна, то кривая.

+2

ОК, какая кривая? Можете ли вы описать, как выглядит идеальная кривая? –

+0

Есть много кривых, которые вы можете выбрать из моего answser: P –

ответ

3

Если вы хотите получить какую-то форму насыщения (см. Sigmoid function), взгляните на мой ответ here. Другой общей формой функции будет linear or exponential growth. Просто дайте мне знать, если вам понадобится один из них.

+0

Звучит как сигмовидная кривая - это то, что вы ищете, такую ​​функцию, как maxVal/(1 + e^(minVal - x)), где x - текущий шаг – SpaceghostAli

0

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

1

значение = (endValue - StartValue)/(время/размер шага) * currentStep;

0

Если я правильно понял, то почему бы не сделать это (с помощью «переменных», которые вы определили): Вы должны прогрессировать общий конечное значение - начальное значение значения.

Используя переменную времени, вы можете выяснить, сколько увеличения вы хотите каждые миллисекунды (назовем это увеличение суммы).

Шаг просто говорит вам, сколько времени нужно «спать» между каждым значением, которое вы поднимаете. Каждый раз, когда возникает новое значение, вы просто делаете последнее значение + (миллисекунды-с-last_step * увеличение суммы).

Примечание: Я не уверен, почему вам нужна первая переменная (алгоритм для использования), поскольку мне кажется, что ее роль определяется другими переменными.

+0

См. Мой вопрос edit для объяснения первого («алгоритма») аргумента. – Nippysaurus

+0

Ну, в таком случае нам придется ждать, пока кто-то предложит решение, я не уверен, как это сделать ... –

0

Вы ищете что-то вроде этого?(В питоне, извините, мой C# заржавели в лучшем случае)

Учитывая у вас есть кривой Г, которая принимает значение от 0 до 1:

 
def my_stepper(f, start, end, time, step_size, current_step): 
    x = current_step * step_size/time 
    f_1 = f(1) 
    f_0 = f(0) 
    y = start + (end - start) * (f(x)- f_0)/(f_1 - f_0) 
    return y 

for i in xrange(11): 
    # increment increases over time 
    print 'exp', my_stepper(math.exp, 100., 200., 10., 1., i) 
    # increment decreases over time 
    print 'log', my_stepper(lambda x: math.log(1+x), 100., 200., 10., 1., i) 
0

Pseduo логика вашей проблемы:

Пусть функция должна быть F (a + b * x) для данного шага x, Пусть начальное значение запускается, Пусть конечное значение заканчивается , если время начала равно 0, а конечное время - , а InverseF - обратная функция F.

, когда x = 0, F (a) = start Следовательно a = InverseF (начало) , когда x = время, F (a + b * time) = end, Следовательно b = (InverseF (end) -a)/time которая сводится к B = (inverseF (конец) -inverseF (старт))/время

Finaly для любого х = шага,

значение F (A + B * шаг), который не является ничего, кроме

F (inverseF (start) + (inverseF (end) -nverseF (start))/time * step)

- ответ.

Например, если

Р (х) является вкладыш т.е.) Р (х) = х

значение = старт + (конечный старт)/время * шаг

, если Р (х) x * x, затем

value = (sqrt (начало) + (sqrt (end) -sqrt (начало))/время * шаг) * (sqrt (start) + (sqrt (end) -sqrt (начало))/time * step)

если F (x) - exp (x), то

значение = Exp (журнал (начало) + (журнал (конец) -log (старт))/время * шаг)

, если Р (х) журнал (х), то

значение = Вход ((ехр (начало) + (ехр (конец) -exp (старт))/время * шаг)

и так далее ..

другой подход без использования обратной функции поясняется ниже.

пусть функция будет а + Ь * Р (х) при заданном шаге х, пусть начальное значение, это начать, пусть конечное значение является концом пусть начальное время равно 0, а последний раз время

то а + Ь * F (0) = начало и а + Ь * F (время) = конец, на решении & б,

вы получите

значение = начало + (конец старта)/(F (время) -F (0)) * (F (x) -F (0))

и на стадии х,

значение = старт + (конечный старт)/(Р (время) -F (0)) * (F (шаг) -F (0))

и Надеюсь, что любой из вышеперечисленных вопросов решит вашу проблему.

0

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

Учитывая ваши входные параметры, я бы назвал это так: функции алгоритма

Spread(startingValue, endingValue, time/step, x => 1-(1-x)*(1-x)) 

Пример: Выход

FocusOnHighLoad = x => 1-(1-x)*(1-x) 
FocusOnLowLoad = x => x * x 
FocusOnMediumLoad = x => (1 + Math.Pow(x * 2 - 1, 3))/2 

Пример:

foreach (double load in Spread(50, 1000, 9, FocusOnHighLoad)) 
    Console.WriteLine("Working with {0} load", load); 

Working with 50 load 
Working with 272.65625 load 
Working with 465.625 load 
Working with 628.90625 load 
Working with 762.5 load 
Working with 866.40625 load 
Working with 940.625 load 
Working with 985.15625 load 
Working with 1000 load 
2

Я думаю, что вам нужно, это какой-то функция ослабления.

Существует набор известных функций ослабления, созданных Робертом Пеннером. Вы можете попытаться посмотреть: Tweener transition cheat sheets, которые визуализируют уравнения Роберта Пеннера.

Оригинальный код Robert Penner должен быть his webpage.

+0

Эти чит-листы показывают, что именно я пытаюсь сделать ... показать множество профилей нагрузки и позволить пользователю выбрать один:) Спасибо :) – Nippysaurus

+0

Здесь реализация в C#: https://xnatweener.codeplex.com/ –

Смежные вопросы