Распределить нагрузку через нормальное распределение в течение 24 часов с пиком в полдень? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь неравномерно распределить нагрузку по каждому часу дня с пиковой нагрузкой около полудня, когда доступно больше людей.По сути, я хочу «нормальное распределение» задач в сравнении с простым n / 24 = hourly load.

Цель состоит в том, чтобы большую часть работы нужно было выполнять в середине дня с меньшим количеством работы рано утром и поздно ночью.

Normal Distribution Chart

Это все, что я получил, создавая что-то вроде кривой.

// Number per day
const numberPerDay = 600;
const numberPerHour = numberPerDay / 24;

let total = 0;
for (let hour = 1; hour < 24; hour++) {
  // Normal Distribution should be higher at 12pm / noon
  // This Inverse bell-curve is higher at 1am and 11pm
  const max = Math.min(24 - hour, hour);
  const min = Math.max(hour, 24 - hour);
  const penalty = Math.max(1, Math.abs(max - min));

  const percentage = Math.floor(100 * ((penalty - 1) / (24 - 1)));
  const number = Math.floor(numberPerHour - (numberPerHour * percentage / 100));

  console.log(`hour: ${hour}, penalty: ${penalty}, number: ${number}`);
  total += number;
}

console.log('Expected for today:', numberPerDay);
console.log('Actual for today:', total);

Live jsfiddle .

, которая производит что-токак это:

demo chart

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Я думаю, вы в порядке с приближением.В этом случае что-то вроде y = sin (pi * x) ^ 4 может быть относительно хорошим (и простым) решением.Затем можно сделать это распределение более широким или более тонким, увеличив y до некоторой степени, близкой к 1.

y = sin(pi * x) from 0 to 1

Кроме того, оно циклическое, что помогает реализацииделать что-то вроде

y = (sin(pi*hour/24))^4

и масштабировать до 600 заданий.

1 голос
/ 03 апреля 2019

Вам необходимо реализовать функцию Гаусса. Следующая ссылка может быть полезной: https://math.stackexchange.com/questions/1236727/the-x-y-coordinates-for-points-on-a-bell-curve-normal-distribution

Вам нужно будет выбрать среднее значение и стандартное отклонение (сигма). Вот фрагмент, который я нашел:

//taken from Jason Davies science library
// https://github.com/jasondavies/science.js/
function gaussian(x) {
    var gaussianConstant = 1 / Math.sqrt(2 * Math.PI),
    mean = 0,
    sigma = 1;
    x = (x - mean) / sigma;
    return gaussianConstant * Math.exp(-.5 * x * x) / sigma;
};

https://gist.github.com/phil-pedruco/88cb8a51cdce45f13c7e

Чтобы заставить его делать 0-24, вы устанавливаете среднее значение на 12 и настраиваете сигма, чтобы растягивать кривую столько, сколько вам нужно. Вы также захотите немного изменить значение y.

Обновление

Я создал JS Fiddle для вас, который готовит то, что, я думаю, вам нужно. https://jsfiddle.net/arwmxc69/2/

var data = [];
var scaleFactor = 600
        mean = 12,
        sigma = 4;

function gaussian(x) {
    var gaussianConstant = 1 / Math.sqrt(2 * Math.PI);
    x = (x - mean) / sigma;
    return gaussianConstant * Math.exp(-.5 * x * x) / sigma;
};

for(x=0;x<24;x+=1) {
    var y = gaussian(x)
    data.push({x:x,y:y*scaleFactor});
}
...