数模准备过程中,写了这种运筹学仿真的代码,虽然自己选了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/OperationalResearchModeling​github.com

内部含网络图/决策论等算法。

python建模仿真报告_Python|数学建模|排队论仿真相关推荐

  1. python数学建模基础教程_Python数学建模极简入门(二)差分方程

    差分方程这名字大家可能不太熟悉,其实差分方程指的是下面这种: 差分方程 其实就是我们数学中数列的递推公式,在以前学数学的时候,往往要通过递推公式来求通项公式才能快速地得到某一项的值,现在借助编程的话, ...

  2. 雅可比法实验报告matlab,数学建模实验报告范文 数学建模的实验报告

    数学建模 实验报告 姓名:学院: 专业班级: 学号: 数学建模实验报告(一) --用最小二乘法进行数据拟合 一.实验目的: 1. 学会用最小二乘法进行数据拟合. 2. 熟悉掌握matlab 软件的文件 ...

  3. 神经网络建模的基本思想,数学建模神经网络应用

    1.人工神经网络有什么应用条件 人工神经网络(Artificial Neural Network,简称ANN ),以数学模型模拟神经元活动,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统.人 ...

  4. 数学建模与数据分析 || 1. 数学建模简介

    数学建模简介 文章目录 数学建模简介 1. 数学建模比赛的理解 2. 一般数据分析的流程 3. 机器学习与统计数据分析 4. 各种编程软件仅仅是工具,对问题的观察视角和解决问题的策略才是关键 4.1 ...

  5. 简述数学建模的过程_数学建模入门知识分享(一):什么是数模

    0 一个不是那么标准的Introduction 2019年的美赛结束于1月29日,接近一年多对数学建模的不断学习,终于有了些数模的感触,这个系列就简单从几个方面比较系统的阐述一下数模的基本问题,本人在 ...

  6. 【Python爬虫】2022年数学建模美赛B题数据爬取

    2022年数学建模美赛B题数据爬取 背景 2022年的美赛刚刚落下帷幕,该题的一个主要难点在于数据的获取.很多人无法找到有效的数据,或者是无法获取数据. 比如找到了如下米德湖的水文数据,但是发现并没有 ...

  7. python初中数学建模培训_中学生数学建模训练营VIP班

    本课程是面向中学生.低年级大学生开设的数学建模基础教育课程,从课程中了解数学方法在实际中的应用,了解数学建模竞赛,了解编程语言,了解论文的写作方法,最终完成一份应用数学知识,建立数学模型,编程计算结果 ...

  8. python初中数学建模培训_初中生数学建模培养

    初中生数学建模培养 一.认识数学建模 目前, "数学建模教学理论"还不完善,对"数学建模"的含义还有不同的理解. 数学模型: 对于现实中的原型, 为了某个特定目 ...

  9. python初中数学建模培训_中学生数学建模训练营精品班

    本课程是面向中学生.低年级大学生开设的数学建模基础教育课程,从课程中了解数学方法在实际中的应用,了解数学建模竞赛,了解编程语言,了解论文的写作方法,最终完成一份应用数学知识,建立数学模型,编程计算结果 ...

最新文章

  1. 艾伟:FCKeditor 配置、扩展
  2. mysql alter算法_MySQL ALTER语法的运用方法 操作索引和字段
  3. Vue项目实操cookie相关操作封装
  4. Latex注释快捷键
  5. CEdit 控件 更新内容的 方法(可以自动滚动至末尾)
  6. php批量采集电视剧,如何通过PHP多线程批量采集下载远程网站图片代码实例
  7. 做完四个小项目的收获
  8. jquery 文本编辑器插件
  9. widthStep、width
  10. 【JS逆向系列】某服务器平台sm系列算法分析
  11. 如何通过python多线程抓取所有东方财富股票信息
  12. fastadmin中ajax传参
  13. mysql身份证号的类型_MySQL--隐藏手机号、身份证号三种方式
  14. sys fs的原理和使用
  15. 【听课笔记】复旦大学遗传学_09基因与演化
  16. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道
  17. 苹果手机以旧换新活动_苹果中国宣布以旧换新活动延期至3月25日
  18. 在windbg中显示win32k.sys调试符号
  19. pyinstaller 打包小坑2
  20. MinIO的介绍以及简单的使用

热门文章

  1. C#仿QQ皮肤-主窗体MainForm和Main的实现
  2. CentOS 6安装Oracle报错解决方案
  3. unity发布webgl 触摸控制和鼠标控制冲突问题解决
  4. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
  5. 避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常
  6. OS X终端颜色[关闭]
  7. Tensorflow:如何保存/恢复模型?
  8. 功能分支重新设置后,Git推送被拒绝
  9. 从另一个分支在Git中创建一个分支
  10. 检查是否已使用jQuery选中复选框