python建模仿真报告_Python|数学建模|排队论仿真
数模准备过程中,写了这种运筹学仿真的代码,虽然自己选了C题没有用到,但考虑到市面上存在的仿真代码较少,聊以为分享。
文档介绍
本文档使用了Python的离散事件仿真库对于排队论模型进行了仿真
仿真的主要目的是提供个性化定制,如对分布的设定,对排队规则的设定等。通过蒙特卡洛模拟得到复杂规则下难以得到的数值解。
本文档提供了:
基础排队模型仿真
Erlang分布实现
通用分布函数适配器
工具库
库依赖
from numpy.random import *
from simpy import *
高阶函数随机数生成器
输入:分布函数,单一参数(多参数请柯里化)
输出:随机数
def rng(dis,param):
"""random number generator"""
def generate():
return dis(lam=param,size=1)[0]
return generate
Erlang分布函数:
输入:阶数
输出:k阶erlang分布函数
def erlang(k):
"""由k个指数分布拟合"""
def exp2erlang(lam,size):
res=[]
for n in range(size):
k_poisson= exponential(lam/k,size=k)
sum=0
for x in k_poisson:
sum = sum + x
res.append(sum)
return res
return exp2erlang
测试,计算分布期望
x=rng(erlang(10),10)
sum=0
for i in range(10000):
sum= sum+x()
print(sum/10000)
结果为9.99565983119657,说明函数正确
FIFO队列模型
#典型银行模型:FIFO
def bankSample(X,Y,Z,A,B,EX):
"""
银行排队服务例子
情景:
一个柜台对客户进行服务, 服务耗时, 客户等候过长会离开柜台
%X 表示时间间隔分布
%Y 表示服务时间的分布
%Z 表示服务台的个数
%A 表示系统的容量,此处特殊化为客户的耐心时间分布
%B 表示顾客数
%以上参数必须有界,受到计算机精度限制,可以使用大常数近似无穷
%C 表示服务规则,请修改函数
%EX 传递了银行储蓄额的分布
"""
#加入随机种子是为了对比模型的变化
seed(2)
def source(env, number, interval,counter):
"""生成客户"""
for i in range(number):
c = customer(env, '客户%04d' % i, counter, time_in_bank=Y(),account=EX())
env.process(c)
yield env.timeout(interval)
#成功服务的客户
SUCC=0
#成功客户等待时间
WAIT=0
#成功客户逗留时间
STAY=0
#业务额
AMT=0
def customer(env, name, counter, time_in_bank,account):
nonlocal WAIT
nonlocal SUCC
nonlocal STAY
nonlocal AMT
"""顾客服务与离开仿真"""
arrive = env.now
#print('%7.4f %s: 到达' % (arrive, name))
with counter.request() as req:
patience = A()
# 直到到达或者失去耐心
results = yield req | env.timeout(patience)
wait = env.now - arrive
if req in results:
# 到达
WAIT=WAIT+wait
STAY=STAY+time_in_bank
AMT= AMT + account
#print('%7.4f %s:等待%6.3f' % (env.now, name, wait))
yield env.timeout(time_in_bank)
SUCC=SUCC+1
#print('%7.4f %s:服务完成' % (env.now, name))
else:
# We reneged
pass
#print('%7.4f %s:等待%6.3f后离开' % (env.now, name, wait))
# 初始化环境
print('排队问题仿真')
env = Environment()
# 开始协程
counter = Resource(env, capacity=Z)
env.process(source(env, B, X(), counter))
env.run()
print("总服务人数:{0:n}人".format(SUCC))
print("总营业额:{0:n}元".format(AMT))
print("总计失去: {0:n}名客户".format(B-SUCC))
print("损失率为: {0:n}%".format((B-SUCC)/B*100))
print("平均等待时间:{0:n}".format(WAIT/SUCC) )
print("平均耗费时间:{0:n}".format(STAY/SUCC) )
我们以下列参数作为输入
#间隔分布
X=rng(erlang(3),3)
#服务时间分布
Y=rng(erlang(3),10)
#耐心时间分布
A=rng(erlang(3),3)
#业务额分布正态
def normaltocurry(s):
def normalcurry(lam,size):
return normal(lam,s,size=size)
return normalcurry
EX=rng(normaltocurry(200),1000)
bankSample(X,Y,3,A,1000,EX)
输出的结果为:
排队问题仿真
总服务人数:417人
总营业额:409903元
总计失去: 583名客户
损失率为: 58.3%
平均等待时间:1.8828
平均耗费时间:10.0787
营业额优先队列模型
然后,我们转变一下模型,变成营业额越高越优先的队列
#银行模型·ELite:优先队列
def eliteBankSample(X,Y,Z,A,B,EX):
"""
银行排队服务例子
情景:
一个柜台对客户进行服务, 服务耗时, 客户等候过长会离开柜台
%X 表示时间间隔分布
%Y 表示服务时间的分布
%Z 表示服务台的个数
%A 表示系统的容量,此处特殊化为客户的耐心时间分布
%B 表示顾客数
%以上参数必须有界,受到计算机精度限制,可以使用大常数近似无穷
%C 表示服务规则,请修改函数
%EX 传递了银行储蓄额的分布
"""
#加入随机种子是为了对比模型的变化
seed(2)
def source(env, number, interval,counter):
"""生成客户"""
for i in range(number):
c = customer(env, '客户%04d' % i, counter, time_in_bank=Y(),account=EX())
env.process(c)
yield env.timeout(interval)
#成功服务的客户
SUCC=0
#成功客户等待时间
WAIT=0
#成功客户逗留时间
STAY=0
#业务额
AMT=0
def customer(env, name, counter, time_in_bank,account):
nonlocal WAIT
nonlocal SUCC
nonlocal STAY
nonlocal AMT
"""顾客服务与离开仿真"""
arrive = env.now
#print('%7.4f %s: 到达' % (arrive, name))
#以业绩作为优先级,priority越小,优先级越大,
with counter.request(priority = 1/account) as req:
patience = A()
# 直到到达或者失去耐心
results = yield req | env.timeout(patience)
wait = env.now - arrive
if req in results:
# 到达
WAIT=WAIT+wait
STAY=STAY+time_in_bank
AMT= AMT + account
#print('%7.4f %s:等待%6.3f' % (env.now, name, wait))
yield env.timeout(time_in_bank)
SUCC=SUCC+1
#print('%7.4f %s:服务完成' % (env.now, name))
else:
# We reneged
pass
#print('%7.4f %s:等待%6.3f后离开' % (env.now, name, wait))
# 初始化环境
print('排队问题仿真')
env = Environment()
# 开始协程
counter = PriorityResource(env, capacity=Z)
env.process(source(env, B, X(), counter))
env.run()
print("总服务人数:{0:n}人".format(SUCC))
print("总营业额:{0:n}元".format(AMT))
print("总计失去: {0:n}名客户".format(B-SUCC))
print("损失率为: {0:n}%".format((B-SUCC)/B*100))
print("平均等待时间:{0:n}".format(WAIT/SUCC) )
print("平均耗费时间:{0:n}".format(STAY/SUCC) )
以相同的参数测试
结果为:
排队问题仿真
总服务人数:432人
总营业额:450145元
总计失去: 568名客户
损失率为: 56.8%
平均等待时间:1.28862
平均耗费时间:9.69799
总结
可以看出,在加入了上述充满着歧视与不公平的规则之后, 人均营业额上升,并且等待时间和耗费时间都有所下降 即:富人和银行获得了利益,富人节约了自己的时间,银行增加了业绩sjtuzwj/OperationalResearchModelinggithub.com
内部含网络图/决策论等算法。
python建模仿真报告_Python|数学建模|排队论仿真相关推荐
- python数学建模基础教程_Python数学建模极简入门(二)差分方程
差分方程这名字大家可能不太熟悉,其实差分方程指的是下面这种: 差分方程 其实就是我们数学中数列的递推公式,在以前学数学的时候,往往要通过递推公式来求通项公式才能快速地得到某一项的值,现在借助编程的话, ...
- 雅可比法实验报告matlab,数学建模实验报告范文 数学建模的实验报告
数学建模 实验报告 姓名:学院: 专业班级: 学号: 数学建模实验报告(一) --用最小二乘法进行数据拟合 一.实验目的: 1. 学会用最小二乘法进行数据拟合. 2. 熟悉掌握matlab 软件的文件 ...
- 神经网络建模的基本思想,数学建模神经网络应用
1.人工神经网络有什么应用条件 人工神经网络(Artificial Neural Network,简称ANN ),以数学模型模拟神经元活动,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统.人 ...
- 数学建模与数据分析 || 1. 数学建模简介
数学建模简介 文章目录 数学建模简介 1. 数学建模比赛的理解 2. 一般数据分析的流程 3. 机器学习与统计数据分析 4. 各种编程软件仅仅是工具,对问题的观察视角和解决问题的策略才是关键 4.1 ...
- 简述数学建模的过程_数学建模入门知识分享(一):什么是数模
0 一个不是那么标准的Introduction 2019年的美赛结束于1月29日,接近一年多对数学建模的不断学习,终于有了些数模的感触,这个系列就简单从几个方面比较系统的阐述一下数模的基本问题,本人在 ...
- 【Python爬虫】2022年数学建模美赛B题数据爬取
2022年数学建模美赛B题数据爬取 背景 2022年的美赛刚刚落下帷幕,该题的一个主要难点在于数据的获取.很多人无法找到有效的数据,或者是无法获取数据. 比如找到了如下米德湖的水文数据,但是发现并没有 ...
- python初中数学建模培训_中学生数学建模训练营VIP班
本课程是面向中学生.低年级大学生开设的数学建模基础教育课程,从课程中了解数学方法在实际中的应用,了解数学建模竞赛,了解编程语言,了解论文的写作方法,最终完成一份应用数学知识,建立数学模型,编程计算结果 ...
- python初中数学建模培训_初中生数学建模培养
初中生数学建模培养 一.认识数学建模 目前, "数学建模教学理论"还不完善,对"数学建模"的含义还有不同的理解. 数学模型: 对于现实中的原型, 为了某个特定目 ...
- python初中数学建模培训_中学生数学建模训练营精品班
本课程是面向中学生.低年级大学生开设的数学建模基础教育课程,从课程中了解数学方法在实际中的应用,了解数学建模竞赛,了解编程语言,了解论文的写作方法,最终完成一份应用数学知识,建立数学模型,编程计算结果 ...
最新文章
- 艾伟:FCKeditor 配置、扩展
- mysql alter算法_MySQL ALTER语法的运用方法 操作索引和字段
- Vue项目实操cookie相关操作封装
- Latex注释快捷键
- CEdit 控件 更新内容的 方法(可以自动滚动至末尾)
- php批量采集电视剧,如何通过PHP多线程批量采集下载远程网站图片代码实例
- 做完四个小项目的收获
- jquery 文本编辑器插件
- widthStep、width
- 【JS逆向系列】某服务器平台sm系列算法分析
- 如何通过python多线程抓取所有东方财富股票信息
- fastadmin中ajax传参
- mysql身份证号的类型_MySQL--隐藏手机号、身份证号三种方式
- sys fs的原理和使用
- 【听课笔记】复旦大学遗传学_09基因与演化
- 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道
- 苹果手机以旧换新活动_苹果中国宣布以旧换新活动延期至3月25日
- 在windbg中显示win32k.sys调试符号
- pyinstaller 打包小坑2
- MinIO的介绍以及简单的使用
热门文章
- C#仿QQ皮肤-主窗体MainForm和Main的实现
- CentOS 6安装Oracle报错解决方案
- unity发布webgl 触摸控制和鼠标控制冲突问题解决
- PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
- 避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常
- OS X终端颜色[关闭]
- Tensorflow:如何保存/恢复模型?
- 功能分支重新设置后,Git推送被拒绝
- 从另一个分支在Git中创建一个分支
- 检查是否已使用jQuery选中复选框