汽车租赁问题的python解决

 1.考虑问题:

       在外地旅游时,为了出行方便,许多游客会选择租车出行。某公司在北京和天津两地开展汽车租赁业务,共投入7000辆车。消费者可以从任意一个城市租车,也可以任意还车到各个城市。需要解决的问题是如何分配最初的车辆布局可以让车辆利用率达到最大化。例如:从天津借出的车辆0.7还车在天津,0.3还车在北京。从北京借出的车辆0.6还车在北京,0.4还车在天津。故有简单数学式表示下一天车辆和当天车辆的表达式(假设每辆车都被借出去了):

       具体地: a,b,c,d为三个城市,其中从a城市租借的车辆在a城市规划的比例为p[0][0],b城市为a[0][1],c城市为p[0][2],d城市为p[0][3]。同理在b和c城租借的车辆在各个城市归还的比例分别表示为p[1][0]、p[1][1]、p[1][2]、p[1][3]和p[2][0]、p[2][1]、p[2][2]、p[2][3]。设定一个新的限制:租借的车辆并不需要及时归还。租借的车辆可以在租车起未来三天内自由归还。根据租客还车的喜好,可以设定每个租车人在两内的每天的换车比例。例如第一天归还的比例占0.7,第二天归还比例占0.3。为了和实际情况靠近,考虑各城市之间的距离,设定模拟超参数,判断用户需要将车从某城还往某城时,选择第一天第二天还车的意愿。利用矩阵运算可以很好处理这样的问题。

2.问题条件和解释

       矩阵中的各个量表示从某地借车还车到某地的意愿。

      矩阵表示从某地借车还到某地情况下第一天还车和第二天还车的意愿,可以综合考虑两地之间的距离,出行目的等因素或直接进行调查分析。这里随机给出一些值

 3.python代码求解

       从问题出发,显然利用numpy模块进行矩阵运算非常方便。需要特别注意的是第一天借出的车辆由于一部分用户决定隔一天还,故第一天的情况需要单独处理。之后利用循环迭代便可得到结果。显然可知,车辆数量一定的情况下,车辆在各个城市的分布最终会达到平衡。可以以此为基础分配最初的车辆分布情况,提高汽车的利用率。

import numpy as np
p = np.array([[0.7,0.2,0.0,0.1],[0.2,0.5,0.2,0.1],[0.1,0.1,0.5,0.3],[0.5,0.2,0.2,0.1]])
r_1 = np.array([[0.8,0.6,0.4,0.2],[0.3,0.7,0.1,0.4],[0.4,0.3,0.8,0.2],[0.2,0.5,0.4,0.8]])
r_2 = np.array([[0.2,0.4,0.6,0.8],[0.7,0.3,0.9,0.6],[0.6,0.7,0.2,0.8],[0.8,0.5,0.6,0.2]])
amount_per_day = {}
amount = np.array([1000,300,600,800])
amount_per_day[0] = amount
amount_per_day[1] = np.dot(np.multiply(p,r_1).transpose(),amount.transpose())#第一天单独处理
for i in range(2,21):
    amount_per_day[i] = np.dot(np.multiply(p,r_1).transpose(),amount_per_day[i - 1].transpose())+\
    np.dot(np.multiply(p,r_2).transpose(),amount_per_day[i - 2].transpose())
    amount_per_day[i] = np.array(list(map(int, amount_per_day[i][:])) ) #每次循环都取整  
print(amount_per_day[20])

       运行结果为 [833 490 294 245]

4.结果可视化

       利用matplotlib进行结果可视化。代码如下。

a = []
b = []
c = []
d = []
for j in range(21):
    a.append(amount_per_day[j][0])
    b.append(amount_per_day[j][1])
    c.append(amount_per_day[j][2])
    d.append(amount_per_day[j][3])
wang_numpy = np.arange(0,21,1)
plt.plot(wang_numpy,a,'r--')
plt.plot(wang_numpy,b,'b--')
plt.plot(wang_numpy,c,'g--')
plt.plot(wang_numpy,d,'m--')
plt.xlabel('iteraitons or days')
plt.ylabel('number of cars')
plt.xticks(np.arange(0, 21, 1))
plt.grid(True)

        结果如图:

5.Jupyter Notebook版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值