Javascript 24小时内通过正态分布分配负荷,峰值在中午?

Javascript 24小时内通过正态分布分配负荷,峰值在中午?,javascript,math,normal-distribution,Javascript,Math,Normal Distribution,我试图在一天中的每一个小时内不均匀地分配负载,高峰处理时间大约在中午,这时有更多的人可用。基本上,我希望任务的“正态分布”与一个简单的n/24=小时负荷相对应 我们的目标是,大部分工作需要在一天当中完成,而在凌晨和深夜完成的工作更少 这就是我所能得到的曲线 // Number per day const numberPerDay = 600; const numberPerHour = numberPerDay / 24; let total = 0; for (let hour = 1;

我试图在一天中的每一个小时内不均匀地分配负载,高峰处理时间大约在中午,这时有更多的人可用。基本上,我希望任务的“正态分布”与一个简单的
n/24=小时负荷
相对应

我们的目标是,大部分工作需要在一天当中完成,而在凌晨和深夜完成的工作更少

这就是我所能得到的曲线

// 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);
//每天的数量
常数numberday=600;
常数numberhour=numberday/24;
设total=0;
for(让小时=1;小时<24;小时++){
//正态分布在中午12点时应该更高
//这条反向钟形曲线在凌晨1点和晚上11点较高
const max=数学最小值(24小时,小时);
const min=数学最大值(小时,24小时);
常数惩罚=Math.max(1,Math.abs(max-min));
常数百分比=数学下限(100*((罚款-1)/(24-1));
常数=数学楼层(数小时-(数小时*百分比/100));
log(`hour:${hour},penal:${penal},number:${number}`);
总数+=数量;
}
console.log('预计今天:',numberday);
console.log('今天的实际值:',总计);
活着

产生了这样的结果:


您需要实现一个高斯函数。以下链接可能会有所帮助:

你需要选择你的平均值和标准偏差(西格玛)。以下是我发现的一个片段:

//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;
};

要使其达到0-24,您将平均值设置为12,并调整西格玛,以尽可能多地分散曲线。您还需要稍微缩放“y”值

更新 我已经为您创建了一个JS提琴,它可以绘制我认为您需要的内容。

var数据=[];
var scaleFactor=600
平均数=12,
西格玛=4;
高斯函数(x){
var gaussianConstant=1/Math.sqrt(2*Math.PI);
x=(x-平均值)/西格玛;
返回高斯常数*数学表达式(-.5*x*x)/sigma;
};

对于(x=0;x,您需要实现高斯函数。以下链接可能会有所帮助:

您需要选择您的平均值和标准偏差(sigma)。以下是我发现的一个片段:

//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;
};

为了使它达到0-24,你将平均值设置为12,并调整sigma,使曲线尽可能分散。你还需要稍微调整“y”值

更新 我已经为您创建了一个JS提琴,它可以绘制我认为您需要的内容。

var数据=[];
var scaleFactor=600
平均数=12,
西格玛=4;
高斯函数(x){
var gaussianConstant=1/Math.sqrt(2*Math.PI);
x=(x-平均值)/西格玛;
返回高斯常数*数学表达式(-.5*x*x)/sigma;
};

对于(x=0;x我想你可以接受一个近似值。在这种情况下,类似于y=sin(pi*x)^4的东西可能是一个相对较好(且简单)的解决方案。然后,通过将y提高到接近1的幂,可以使这个分布更宽或更细

此外,它是循环的,因此通过执行以下操作来帮助实现

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

和缩放以适应600个工作。

我想您可以接受近似值。在这种情况下,类似于y=sin(pi*x)^4的解决方案可能是一个相对较好(且简单)的解决方案。然后,可以通过将y提高到接近1的某个幂,使此分布更宽或更细

此外,它是循环的,因此通过执行以下操作来帮助实现

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

和缩放以适应600个工作。

对于正态分布,您需要公式中的方差和then分布的例外。您是指数学上的
正态分布的真正含义,还是试图找到类似的东西来拟合上面的曲线?对于正态分布,您需要方差和then分布的例外但是在公式中。你是指数学
正态分布的真正意义,还是你正在试图找到类似的东西来拟合上面的曲线?高斯函数可能是一种可行的方法,但我不确定在1-24(小时)内会是什么样子范围。我已经在答案中添加了更多内容,并添加了一个JSFIDLE。您是否有可能将此标记为最佳答案,作为一个有效的解决方案,或者让我知道您是否需要我添加任何内容?谢谢。Stackoverflow对某些事情有最低时间限制(例如接受答案或奖励).高斯函数可能是一种可行的方法,但我不确定1-24(小时)的情况范围。我已经在答案中添加了更多内容,并添加了一个JSFIDLE。您是否有可能将此标记为最佳答案,作为一个有效的解决方案,或者让我知道您是否需要我添加任何内容?谢谢。Stackoverflow对某些事情有最低时间限制(例如接受答案或奖励)。