代码包含队长有限与队长无限两种情况,又由服务台个数分为单服务台模式和多服务台模式,使用语言为C++。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<time.h>
using namespace std;
int fac(int x) //递归函数
{
int f;
if (x == 0 || x == 1)
f = 1;
else
f = fac(x - 1) * x;
return f;
}
//单服务台队长无限
void single_queue_infinite() {
int lambda = 2;
double mu = (double)1 / 3;
double ro = (double)lambda / mu;
double p0 = 1 - ro;
double Ls = abs((double)lambda / (mu - lambda));
double Lq = ro * Ls;
double Ws = (double)Ls / lambda;
double Wq = Ws * ro;
}
//单服务台队长有限
void single_queue_finite(int N) {
int lambda = 2;
double mu = (double)1 / 3;
double ro = (double)lambda / mu;
double p0 = (double)(1 - ro) / (1 - pow(ro, N + 1));
double pN = (double)(1 - ro) * pow(ro, N) / (1 - pow(ro, N + 1));
double Ls = (double)1 / (1 - ro) - (double)(N + 1) * pow(ro, N + 1) / (1 - pow(ro, N + 1));
double Lq = Ls - 1 + p0;
double Ws = (double)Ls / (lambda * (1 - pN));
double Wq = Ws - (double)1 / mu;
}
//队长无限长(非损失制)
void queue_infinite_ideal(int s) {
//s为服务台个数
int lambda = 2;
double mu = (double)1/3;
double ro = (double)lambda / mu;//忙度期望
double ros = (double)lambda / (s * mu);
double p00;
double p0 = 0;
for (int i = 0; i < s; i++) {
p00 = (double)pow(ro, i) / fac(i);
p0 = p0 + p00;
}
p0 = p0 + (double)pow(ro, s) / ((double)fac(s) * (1 - ro));
p0 = (double)1 / p0;//空闲概率
double Lq = (double)p0 * ros * pow(ro, s) / (fac(s) * (1 - ros) * (1 - ros));//排队等待顾客数期望
double Ls = Lq + ro;//总顾客数期望
double Ws = (double)Ls / lambda;//逗留时间期望
double Wq = (double)Lq / lambda;//排队等待时间期望
cout << ro << " " << p0 << " " << Lq << " " << Ls << " " << Wq << " " << Ws << " " << endl;
}
//队长有限长(损失制度)
void queue_finite_ideal(int c, int N) {
//c为服务台个数,N为队长限制
int lambda = 2;
double mu = (double)1 / 3;
double ro = (double)lambda / (mu*c);
double p00;
double p0 = 0;
for (int i = 0; i < c; i++) {
p00 = (double)(c * pow(ro, i)) / fac(i);
p0 = p0 + p00;
}
p0 = p0 + (double)pow(c, c) * ro * (pow(ro, c) - pow(ro, N)) / (fac(c) * (1 - ro));
p0 = (double)1 / p0;
double pN = (double)pow(c, c) * pow(ro, N) * p0 / fac(c);
double Lq = (double)pow(c * ro, c) * ro / (fac(c) * (1 - ro) * (1 - ro)) * p0 * (1 - pow(ro, N - c) * pow(ro, N - c) * (1 - ro));
double Ls = Lq + c * ro * (1 - pN);
double Wq = (double)Lq / (lambda * (1 - pN));
double Ws = Wq + (double)1 / mu;
cout << ro << " " << p0 << " " << Lq << " " << Ls << " " << Wq << " " << Ws << " " << endl;
}
对应模型分别为M/M/1/∞/∞,M/M/1/N/∞,M/M/c/∞/∞,M/M/c/N/∞。
式中设定参数lambda为2,即顾客平均到来速度为2人/min,mu为1/3,即每人需要服务时长为三分钟。相关参数可以根据自己的需求进行对应的修改,也可将参数设置为形参提供输入接口。