排队论(包含损失制和非损失制)C++函数代码

代码包含队长有限与队长无限两种情况,又由服务台个数分为单服务台模式和多服务台模式,使用语言为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,即每人需要服务时长为三分钟。相关参数可以根据自己的需求进行对应的修改,也可将参数设置为形参提供输入接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值