微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2020年MathorCup数学建模A题无车承运人平台线路定价问题解题全过程(程序+论文)

2020年第十届MathorCup高校数学建模挑战赛

A题无车承运人平台线路定价问题

原题重述:

  国内公路运输市场开放以来,逐渐形成了“小,散,乱”的发展现状。为规范运输市场,国家交通运输部办公厅于 2016 年 9 月印发《关于推进改革试点加快无车承运物流创新发展的意见》,并初步公布了 48 个无车承运人试点平台。随着我国无车承运行业的逐步兴起,承运线路的科学定价问题是众多无车承运人平台亟待解决的问题。

在这里插入图片描述


  图 1 展示了国内无车承运人的主要运营模式,该模式下有三个主要的参与角色,分别为货主、无车承运人平台以及承运人。作为无车承运人平台,既需要面向货主的运输任务进行报价,同时也需要面向承运司机进行报价。
  本研究以无车承运人的视角,暂不考虑面向货主的运输任务的报价,仅面向广大拥有运力资源(货车)的承运端司机,将需要承运的线路任务以一定价格提前发布到网络平台上供承运端司机浏览决定是否承运该运输任务。平台采用动态定价的形式保证每个任务必须被承运,若任务未被承运将带来一定损失。作为承运端的司机,会根据平台发布的线路任务和价格进行判断是否接单,司机接单则视为该线路任务交易成功,此线路任务随即从平台下架。若在给定的时间内,该任务没有司机接单,则该线路就可以进行调价。每条线路任务最多允许发布 3 次价格,即首次发布线路价格后仍可刷新两次线路价格,其中附件 1 数据文件中的线路指导价为平台首次发布的线路价格。假设上述线路任务全部为固定车型的整车任务,即一个任务需要由某种车型的 1 辆车完成,不考虑拼载任务。本无车承运人平台在当前阶段较为关注的目标是快速促进成交和较低的承运成本。

  基于以上背景,请你们的团队根据附件给出的数据(可不限于此),通过数学建模的方法帮助某无车承运人平台解决以下问题:
  问题 1:通过定量分析的方法,研究影响无车承运人平台进行货运线路定价的主要因素有哪些,并说明理由。
  问题 2:根据附件 1 数据,通过建立数学模型,对已经成交货运线路历史交易数据中的定价进行评价。
  问题 3:建立关于线路定价的数学模型,给出附件 2 的线路任务的三次报价以及总成本定价,并填充在附件 3 的表格中;给出你们的调价策略;评价你们对附件 2 的线路任务所给出的定价。其中附件 3 的表格以 Excel文件形式,连同论文答卷一起上传至参赛系统,请勿改变附件 3 中各任务ID 的原有顺序。附件 3 将用于测试报价的准确性,对于某个确定的任务,三次报价中有一次成交,则后续价格将不再考虑。
  问题 4:根据你们的研究,给无车承运人平台写一封不超过一页的建议信。

  附件 1:货运线路历史交易数据
  附件 2:待定价的货运线路任务单
  附件 3:计算结果

模型的建立与求解:

  附件 1 中给出了16016 个货运任务的历史交易数据,每个任务多达 62 种影响因素,显然不同的因素对于成本价定价的影响程度是不同的,本文采用因子分析法并结合特征相关性热力图对影响因素进行划分,挑选出对无人承运平台定价的 6 个主要影响因素。本题中首先针对数据集进行了探索性数据分析(EDA)。通过查阅资料和定性观察初步评估其相关性,并统计数据集中每个样本的数据缺失情况。然后针对数据集做特征工程,提取数据中的各方面特征。由于提取出特征的数量比较多,所以采用因子分析法对特征进行降维并确定每个特征的权重。接下来,对于上述提取的原始特征数据集做相关性分析并绘制热力图。[2]最后根据权重优先原则选择互相关的特征,即为题目要求的主要影响因素。

数据预处理

  为了更好地处理数据从而得到与问题相关的特征,在对问题建模分析以前需要做一些预处理的工作,例如对数据的格式进行转换、清理数据集中的异常值、纠正错误数据等。
  主流的数据预处理方法有数据清洗,数据集成,数据变换,数据归约等。在做特征工程前采用这些数据预处理技术,将会大大提高数据挖掘模式的质量,容易得到理想的实验结果。
  本题中,数据集为 16016 个货运任务的历史交易数据,则相应的数据集的预处理包括字符串变量的二值化,比如业务类型中的重运和速运;缺失数据的补充或剔除,比如打包类型存在一个缺失则直接剔除;区间放缩,比如里程数的范围映射到 0.02-0.96。

指标相关性分析

  因子分析要求变量之间有相关性,所以首先要进行相关性检验,利用 SPSS 软件中的因子分析模型分别求的新数据集的相关系数矩阵及相关性检验。

在这里插入图片描述


  表 4-3 有两项检验指标,一般情况下,KMO 值小于 0.7 即为指标之间存在相关性。而 Bartlett 球形度检验需要显著性小于 0.001,显然,两者均满足条件,故可以进行因子分析。

提取主成分和公共因子

在这里插入图片描述


在这里插入图片描述

计算回归方程

  针对 RSR 值进行频数分布表格处理,分别计算各 RSR 值出现的频数 f,以及累积频数 ,然后得到平均秩次,并且利用平均秩次得到计算向下累计频数 p(百分数),结合向下累计频数 p(百分数)计算得到 Probit 值。Probit 值为向下累计频数 p(百分数)对应的标准正态离差加 5,如 p 为 0.025 时对应的标准正态离差为-1.96,则 Probit 为 5+(-1.96)=3.04;p 为 0.975 时对应的标准正态离差为 1.96,则 Probit 为 5+1.96=6.96.具体见表.
  第一次报价应逼近历史成交价格下限,第二次报价应为预测模型得出的合理价格,第三次报价则需为价格上限,即确保任务一定被接单。于是在得出调价比例预测模型后,用其和线路成本价相乘即为第二次报价,也就是合理价格,但这个价格可能不被承运司机所接受而无人接单,或者使部分任务价格溢出,这两种情况都会使得无车承运人平台产生损失,所以需要得到两个修正量,一是让调价比例往上平移,确保在历史交易中这样的任务一定会成交;二是让调价比例往下平移,从而寻找到历史交易中的价格下限。修正过后的调价比例曲线分别为第三次调价策略和第一次调价策略。

在这里插入图片描述

论文缩略图

在这里插入图片描述


在这里插入图片描述

程序代码

# !/usr/bin/env python3.7
# -*-encoding: utf-8 -*-
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
df_train = pd.read_excel(' old_change.xlsx')
# 删除任务 id
df_train = df_train.drop(["任务 id","线路编码","业务类型","打包类型","线路指导价(不含税)","线路总
成本","需求类型 1","需求类型 2","线路价格(不含税)"], axis=1)
print(df_train)
t = np.around(df_train.corr(), decimals=4) # 这里是将矩阵结果保留 4 位小数
# tt = df_train.corr() # 认保留 6 位小数,corr = df_train.corr(method='pearson')方法选择 person 相
关性,'spearman'秩相关
# ttt = np.corrcoef(df_train) # 没有表头,WTF!
print(t)

# mm = df_train['线路指导价映射'].corr(df_train['总里程映射']) # 进行两列之间的相关性分析
# print(mm)
# oo = df_train[['num_suc_one', 'num_fail_one', 'num_suc_thr', 'num_fail_thr', 'num_suc_six', 
'num_fail_six',
# 'num_suc_twl', 'num_fail_twl']].corr() # 计算指定多列相关系数
# print(oo)
plt.subplots(figsize=(9, 9)) # 设置画面大小
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,负号正常显示
plt.title('变量相关系数 - 热力图\n', fontsize=18) # 添加图表标题“变量相关系数 - 热
图”,fontsize=18 字体大小 可省略
# annot=True,是显式热力图上的数值;vmax 是显示最大值;xticklabels、yticklabels 轴标签显示
square=True,将图变成一个正方形,认是一个矩形;cmap="Blues"是一种模式,就是图颜色配置。
# mask:控制某个矩阵块是否显示出来,认值是 None,如果是布尔型的 DataFrame,则将 DataFrame 里
True 的位置用白色覆盖掉
plt.title('变量相关系数 - 热力图\n', fontsize=18)
sns.heatmap(t, annot=True, vmax=1, vmin=0, xticklabels=True, yticklabels=True, square=True, cmap=None,
 linewidths=0.05, linecolor='black') # mask=t < 0.8 等价于 mask=(t < 0.8)
plt.show()

原文地址:https://www.jb51.cc/wenti/3286733.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐