摘要:
商户收银需求与收银能力不匹配,是一个普遍问题,高峰不足/平常过剩。参考论文《混合制排队模型下中式快餐店排队系统的优化_荣艳蕊.pdf》,本文主要使用QT5、QtChart等完成了基于以上论文模型的关于排队模型优化的图表对比功能,其中涉的数据公式计算使用C++完成。
运用运筹学中混合制排队模型对某中式快餐店排队系统进行优化, 在常规优化方案的基础上 提出进一步的优化方案。
通过优化不仅使该店降低了服务成本, 提高了服务效率, 而且增强了顾客满意度, 增加了经济效益。
根据运筹学中的排队论对中式快餐店作出的技术性定量分析, 通过建立数学模型来减少平均等待时间。
实现了以较低投入成本获得较高顾客满意度的排队优化目标, 从而带来直接的经济效益, 为饭店顾客排队系统优化提供了一个思路。
文中源码文件【获取方式】:关注公众号:利哥AI实例探险, 给公众号发送 “qt折线图”
获取下载方式,关注发送关键字即可获取下载方式,无套路。由于本人能力有限,难免有疏漏之处。
原文链接:通过qt折线图实现论文内容-快餐店排队效能分析
1. 系统演示
2. 基本介绍
排队论是研究排队系统( 又称随机服务系统) 的数学理论和方法, 是运筹学的一个重要分支。 它是通过研究各种服务系统的排队现象, 解决服务系统最优设计和最优化控制的一门科学。
根据运筹学中的排队论对中式快餐店作出的技术性定量分析, 通过建立数学模型来减少平均等待时间。 实现了以较低投入成本获得较高顾客满意度的排队优化目标, 从而带来直接的经济效益, 为饭店顾客排队系统优化提供了一个思路。
可根据以下公式计算出排队系统的服务指标( 其中λ为单位时间内平均的顾客数即平均到达率, μ为单位时间内服务完的顾客数即平均服务率, P0 为系统服务台空闲的概率, PK 为系统处于K 状态顾客不能再进入的概率即顾客损失率, λe 为实际平均到达率即单位时间内实际可进入系统的顾客平均数) :
3. 理论模型
适用运筹学中排队论中的:混合制 M/M/n/m/∞ 模型,n=收银台数,m=座位人数
- 假设条件:
- 菜品性价比高、顾客流量充足,高峰期明显。客流分布:泊松,收银分布:负指数。
- λ=平均到达率(顾客到达量 人/分)。μ=平均服务率(收银速度 人/分 );平均客单价KD。
- ρ = λ/μ,收银台空闲概率 Pk =ρ^k* (1- ρ) / [1-ρ^(m+1)] ; k=0,1,2, ; 收银员成本CB。
- 排队长度 Lq = ρ /(1-ρ ) - (m+1)*ρ((m+1)]/【1-ρ)(m+1)】- (1-P0);
- 顾客等待时间 Wq = Lq/ [λ (1-Pm)];当Wq超过T(10分钟)时,顾客就会流失。
- 问题:配备多少收银台n,商户利润是最大化的?
商户案例: - 相关参数:
- 高峰期(11:30–12:30)60分,m=35桌*4人/桌=140人,打包比例7.8%。平均排队6分钟,最长48人。
- 顾客买单后堂食时间18.4分钟(翻台率3.3次/60分),λ = 16人/分,平均客单价KD=22.1元。
- 收银员:收银速度 RS = 3.5人/分, 收银员数量 RN人=1.3(0.3为经理),工资 GZ = 5000元/月。
- 机器:收银速度 JS = 2.6人/分,机器人数量 JN台=2,租金 ZJ = 2500元/月,人工协助率 α= 20%。
- μ = RS( RN - JNα)+ JS*JN = 8.35
- 测算结果:平均排队等待时间 8.4分钟,排队长度70人,与实际检验结果相近。
4. 核心代码
可以根据核心代码自行编码调试,或下载源码修改调试:
void Init(){
chart = new QChart();
chart->setTitle("横轴: 店面桌数(按4人/桌计), 纵轴: 排队等待时间(分钟)");
axisX = new QValueAxis;
axisX->setRange(12, 50); //设置范围
axisX->setLabelFormat("%u"); //设置刻度的格式
axisX->setGridLineVisible(true); //网格线可见
axisX->setTickCount(50-12); //设置多少格
axisX->setMinorTickCount(1); //设置每格小刻度线的数目
//
axisY = new QValueAxis;
axisY->setRange(0, 60); //设置范围
axisY->setLabelFormat("%u"); //设置刻度的格式
axisY->setGridLineVisible(true); //网格线可见
axisY->setTickCount(7); //设置多少格
axisY->setMinorTickCount(10); //设置每格小刻度线的数目
//
chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
ui->horizontalLayout->addWidget(chartView);
//
ui->lineEdit_ftl->setPlaceholderText("翻台率");
ui->lineEdit_dbl->setPlaceholderText("1-打包比例");
//
QLineSeries *seriesLine = new QLineSeries();
seriesLine->setName("分割线");
seriesLine->setColor(QColor(255, 255, 0));
for(int i=12; i<=50; i++){
seriesLine->append(i, 10);
}
chart->addSeries(seriesLine);
chart->setAxisX(axisX, seriesLine);
chart->setAxisY(axisY, seriesLine);
}
void Dialog::on_pushButton_clicked()
{
double rgsd = ui->lineEdit_rgsd->text().toDouble();
double rgsl = ui->lineEdit_rgsl->text().toDouble();
double jqsd = ui->lineEdit_jqsd->text().toDouble();
double jqrsl = ui->lineEdit_jqrsl->text().toDouble();
double rgxzl = ui->lineEdit_rgxzl->text().toDouble();
double miu = rgsd*(rgsl - jqrsl * rgxzl) + jqsd*jqrsl;
double ftl = ui->lineEdit_ftl->text().toDouble(); //翻台率3
double dbl = ui->lineEdit_dbl->text().toDouble(); //除了打包率
int gfq = ui->lineEdit_gfq->text().toDouble(); //高峰期时间
int RobotCount = jqrsl;
int nRowCount = ui->tableWidget->rowCount();
QLineSeries *series = new QLineSeries();
series->setName(QString("%1台").arg(RobotCount));
QString Log;
for(int i=0; i<nRowCount; i++){
int zhuoshu = ui->tableWidget->item(i, 0)->text().toInt();
int m = zhuoshu*4;
double lamada = m*ftl/dbl/gfq;
double rou = lamada/miu;
double P0 = (1 - rou) / (1 - pow(rou, m+1));
double Pm = pow(rou, m) * P0;
Pm = QString::number(Pm, 'f', 2).toDouble();
double lamada_shiji = (1 - Pm)*lamada;
double duichangL = rou/(1 - rou) - (m + 1) * pow(rou, m+1) / (1 - pow(rou, m+1));
double pduichangL = fabs(duichangL - (1 - P0));
double dengdaijiashouyinshijian = duichangL / lamada_shiji;
double dengdaishijian = pduichangL / lamada_shiji;
QString Wq = QString::number(dengdaishijian, 'f', 2);
qDebug() << "桌数=" << zhuoshu << "台数=" << RobotCount
<< lamada << miu << rou << P0 << Pm << lamada_shiji << duichangL
<< pduichangL << dengdaijiashouyinshijian << dengdaishijian
<< Wq;
QString szLog = QString("%1,%2").arg(zhuoshu).arg(Wq);
Log.append(szLog).append("\n");
series->append(zhuoshu, Wq.toDouble());
}
chart->addSeries(series);
chart->setAxisX(axisX, series);
chart->setAxisY(axisY, series);
// chart->createDefaultAxes();
ui->textEdit->setText(Log);
}
往期文章回顾
【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 | 【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示 |
---|---|
【深度学习】行人跌倒行为检测软件系统 | 【深度学习】火灾检测软件系统 |
【深度学习】吸烟行为检测软件系统 | 【深度学习】数竹签演示软件系统 |
【深度学习】菜品目标检测软件系统 | QT5集成FTP实现文件及文件夹的下载 |
QT集成开源日志库示例 | python源码加密之Cython方案简单示例 |
【python源码加密】Cython针对python工程多层级目录处理办法 | http服务网络请求如何确保数据安全(含python示例源码) |
http请求数据传输时确保完整性和保密性方案(含源码) | QT集成百度在线地图JS API实现交互及特定效果 |
【qt小游戏】小老鼠闯迷宫小游戏(附源码) | 【qt小系统】传感器云平台3D散点图(附源码) |