一道关于在公交站,等车平均等待时间的问题

800 views
Skip to first unread message

junfei liang

unread,
Dec 22, 2013, 3:54:17 AM12/22/13
to pon...@googlegroups.com
题目和思路,放在代码的注释里了,感觉思路是对的,但没有这个选项。求确认。

-------------------
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;

//
// 有A和B两路公交车, 平均发车间隔时间分别是5min和10min.
// 某乘客在站点S可以任意选择两者之一乘坐, 假设A和B到达S的时刻无法确定.
// 那么该乘客的平均等待时间约为:
// A. 1min20s B. 3min20s C.2min30s D. 1min40s
// 来源: 2014 阿里巴巴 武汉站 校园笔试题目

// 5分钟一趟
// 10分钟一趟
// 假设单位是一秒
// 等5分钟一趟的车, 有300种情况
// 等10分钟一趟的车, 有600种情况
//
// 认为两者相互独立
// (x, y) 表示两辆车到达的时间, 单位为秒
// 则显然等待时间为z=min(x, y)
// 统计每个z出现的次数, 则可求出, p(Z=i)的概率 = count[i] / (300*600)
//
// 求平均等待时间, 就是求期望
// E(Z) = sum(z*p[z])
// = sum(i*count[i]) / (300*600)
// = 125.5
// 也就是说, 平均等待时间为2min5.5s
//
// 题目种的答案只有: 1m20s, 1m40s, 2m30s, 3m20s
// 这个题目没有正确答案.


int main(int argc, const char *argv[])
{
int count[5*60+1] = {0};

for(int i = 1; i <= 300; ++i) {
for(int j = 1; j <= 600; ++j) {
int z = min(i, j);
count[z]++;
}
}

double ez = 0;
for(int i = 1; i <= 300; ++i) {
ez += i * count[i];
}

ez /= 300;
ez /= 600;

cout << ez << endl;

return 0;
}
/**
* output: 125.5
*/

Yang Ye

unread,
Dec 22, 2013, 12:01:01 PM12/22/13
to pon...@googlegroups.com

应该是A。1/(1/2.5+1/5))=1/0.6=5/3分钟。按一分钟的概率。

--

---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out

Yang Ye

unread,
Dec 22, 2013, 3:56:07 PM12/22/13
to pon...@googlegroups.com

之前计算结果是1分40秒,是D,不是A。不过不正确。

用模拟解决

from random import *

seed

sum=0

for i in range(10000)
   i=randrange(0,600,1)
   j=randrange(0,300,1)
   if i<j:
      sum+=i
   else:
      sum+=j

print sum/10000

答案和楼主一致。

junfei liang

unread,
Dec 22, 2013, 7:24:55 PM12/22/13
to pon...@googlegroups.com
先前的把问题离散化了,下面是用连续的思路来解决
算出的结果,是2min5s
应该是对的。

// FZ(z)表示, Z < z的概率
// FX(x)表示, X < x的概率
// FX(x)表示, Y < y的概率
//
// FZ(z)表示的意思是在时间z内等到车的概率
// FZ(z) = p(Z < z) // z的(0, 5]
// = 1 - p(Z >= z)
// = 1 - p(X >= z)p(Y >= z) // Z = min(X, Y)
// = 1 - (1- FX(z))(1- FY(z))
// = 1 - (1 - z/5)(1- z/10)
// 读FZ(z) 求积分,可得
// fZ(z) = (15- 2z)/50
// eZ = 定积分(z*fZ(z)) // z 的范围是0到5
// 计算的结果是, 25/12 min
// 2min5s
> --
>
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛“TopLanguage”中的主题。
> 要退订此主题,请访问 https://groups.google.com/d/topic/pongba/ESOaLw_IxV4/unsubscribe
> 要退订此论坛及其所有主题,请发送电子邮件到 pongba+un...@googlegroups.com
> 要查看更多选项,请访问 https://groups.google.com/groups/opt_out

Nan Xue

unread,
Dec 22, 2013, 9:13:44 PM12/22/13
to pon...@googlegroups.com
为什么x和y分别满足均匀分布?那我换个分布算出来的结果会不一样吧。

junfei liang

unread,
Dec 22, 2013, 9:24:03 PM12/22/13
to pon...@googlegroups.com
是的,如果换个分布,结果应该是会变的。
但这个,到底是什么分布,题目没提到。
假设成均匀分布是否合理?不太确定。
还得再研究研究....

猛禽

unread,
Dec 22, 2013, 9:47:59 PM12/22/13
to pon...@googlegroups.com
这个算法是对的。
LZ的思路不对。因为300种情况是在5分钟范围内,600种情况是在10分钟范围内。
平均分布是因为乘客的到达时间是随机平均分布的。车辆的达到时间当然不是平均分布,但是因为求的也是平均时间,所以这个分布对结果没有太大影响。

junfei liang

unread,
Dec 23, 2013, 1:10:07 AM12/23/13
to pon...@googlegroups.com
猛禽同学,均匀分布那块儿,我想我弄明白你的意思了。
在模型里,车到达某个车站的时间是固定的,但是因为人到到站的时间是随机均匀的(这也是个假设。。。)。
所以他的等待时间,是一个均匀分布。
但,你前面的结论,我没看懂。
1/(1/2.5+1/5))=1/0.6=5/3 的逻辑是?
因为300种情况是在5分钟范围内,600种情况是在10分钟范围内, 所以?
可以解释一下吗?
> --
>
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛“TopLanguage”中的主题。
> 要退订此主题,请访问 https://groups.google.com/d/topic/pongba/ESOaLw_IxV4/unsubscribe
> 要退订此论坛及其所有主题,请发送电子邮件到 pongba+un...@googlegroups.com
> 要查看更多选项,请访问 https://groups.google.com/groups/opt_out

HYRY

unread,
Dec 23, 2013, 6:50:02 AM12/23/13
to pon...@googlegroups.com
平均5分钟一趟和10分钟一趟的车加在一起就是平均10分钟三趟。即200秒一趟。
而公车到达S站的分布按照泊松分布计算。

S站前后两个Bus之间的时间为伽玛分布(k=1, lambda=1/200)

由于观察者偏差现象,更多的人会出现在更长的BUS间隔中。

所以结果是一个如下的定积分:

integrate(x*x*gamma.pdf(x, k=1, lambda=1/200), 0, inf) / 200 / 2 = 200秒



在 2013年12月22日星期日UTC+9下午5时54分17秒,junfei liang写道:

HYRY

unread,
Dec 23, 2013, 7:00:50 AM12/23/13
to pon...@googlegroups.com
下面是Python模拟程序,结果为200秒:

import numpy as np

N = 100000 # 到达S站的BUS的总次数
m = 200 #平均200秒一趟BUS
bus = np.random.rand(N) * (N*m)
bus = np.sort(bus) #BUS的到达时间
passenger = np.random.rand(1000000)*(N*m*0.5) #模拟100万人次在前半段时间到达S车站

# 计算平均等待时间
pos = np.searchsorted(bus, passenger)
print np.mean(bus[pos] - passenger)


在 2013年12月22日星期日UTC+9下午5时54分17秒,junfei liang写道:

junfei liang

unread,
Dec 23, 2013, 8:21:07 AM12/23/13
to pon...@googlegroups.com
google了一下,I found, http://www.cnblogs.com/jmp0xf/p/2014_Alibaba_Waiting_Bus.html
文中,指出把“平均发车间隔”理解为“发车间隔”是不对的,
因为题目种有指出,假定 A 和 B 到达 S 的时刻无法确定。
如果是发车间隔是固定的,则达到S的时间应该是确定的才对。
然后,泊松分布什么的。。。。orz。。。
结果是3min20s.
如果,发车时间间隔固定确实是2min5s
搜索的过程种,还发现matrix67等车的一篇文章
文种指出,如果发车时间间隔是随机的,那么等待时间就是平均发车时间间隔。
有意思~

猛禽

unread,
Dec 23, 2013, 7:46:49 PM12/23/13
to pon...@googlegroups.com
看了你后面给的链接以后发现我也想错了。我想当然地认为平均等待时间为平均间隔的一半……
Reply all
Reply to author
Forward
0 new messages