2021年认证杯SPSSPRO杯数学建模
C题 破局共享汽车
原题再现:
自 2015 年以来,共享汽车行业曾经“百花齐放”,多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题,陆续有共享汽车公司因为资金链断裂而倒闭。据易观发布的《2019 中国共享汽车平台创新白皮书》显示,2019 年的共享汽车行业,是中小参与者不断出局,头部平台拉动行业重启增长的一年。而共享汽车增速在 2019 年 5–10 月达到 2.21%,超过网约车和线上租车。
在以前,汽车被当作“大件”购买。而现在,由于车型更新迭代之快让人眼花缭乱,加之受疫情影响,消费者的决策过程会变得更长。消费者有用车的欲望、有消费升级的欲望,但他们越来越聪明了,他们想知道,有没有更轻更好的用车方式。共享汽车的“分时租赁”模式很多的解决了这个问题。但是这种方式的成本控制环节过多,导致盈利非常困难。
第二阶段问题:
1. 附件中的数据是以色列的特拉维夫市的数据,请你参考该城市的人口、交通状况、消费能力等相关情况,建立数学模型,给出使得企业利润最大的共享汽车按小时计价方案。
2. 共享汽车的停车点是公司租用的。考虑到租赁费用高昂,请你建立合理的数学模型,结合第一阶段的数据分布特点,研究是否可以减少停车点的数量?
3. 共享汽车行业属于重资产、重运营的行业,在发展初期政府的扶持非常重要,请为该市政府提供一个共享汽车行业的扶持解决方案,突出在购车补助、运营补助、税费减免方面的具体措施。
整体求解过程概述(摘要)
对于问题一,依据以色列特拉维夫市的人口,消费情况,确定当前地区对于共享汽车的需求,然后,根据需求及供应理论,分析影响共享汽车定价的因素,进一步地,以企业利润最大为目标建立共享汽车动态定价模型,最后,依据免疫遗传算法对模型进行求解,给出了使得企业利润最大的共享汽车按小时计价方案。
对于问题二,为了获得特拉维夫市的最佳停车数量。首先,在充分调研共享汽车发展现状的基础上,结合共享汽车的应用场景、经营模式确定了共享汽车网点选址的影响因素,构造了共享汽车租赁点选址的非线性整数规划模型。模型分别从决策者和用户角度出发,以满足的用户需求量最大为目标函数,并以租赁用户满足率、成本和站点数量为约束条件。考虑固定网点结合流动网点运营的选址运营模式。其次,通过对建立的共享汽车网点选址模型进行分析,并结合特拉维夫市的实际情况采用遗传算法进行求解,得出研宄区域内停车点最优布设方案。
对于问题三,政府通过优先为共享汽车产业提供贷款,为共享汽车相关企业减免保险,鼓励金融机构为共享汽车产业提供低息贷款或无息贷款,并对相关贷款提供财政贴息,支持金融信贷向共享汽车分时租赁产业偏斜;通过政府采购,可以有效引导企业的生产行为,对消费行为起到示范作用,进而刺激共享汽车产业的消费需求、促进产业发展;通过减征车辆购置税和免征车船税、土地税减免、个人所得税减免、增值税改革、企业所得税优惠等税收政策给予共享汽车产业支持还有较大的发展空间。
问题分析:
问题一的分析
为了更好地解决共享汽车企业面临的站点供需不平衡及盈利焦虑等问题,将以单向式共享汽车定价问题作为研究对象建立动态定价模型,在各个时段针对不同的站点制定不同的定价策略。首先对共享汽车的定价机制进行分析,确定优化目标并设定相关的假设条件;然后定义模型涉及的变量,构建了考虑多种约束条件,以运营商收益最大为目标的共享汽车动态定价模型。
问题二的分析
随着城市的发展,共享汽车的使用量越来越多,但是考虑到停车位租赁费用及各个地区居民不同的需求量等因素,停车位的数量并不是越多越好。这里我们考虑了用户的需求量、商圈分布及停车位成本等因素,建立了汽车租赁点选址的非线性规划模型。模型已用户需求量最大为目标函数,以用户的满足率、成本和站点数量为约束,最终利用遗传算法求解,得到共享车辆最佳的选址数量和车辆规模。
问题三的分析
共享汽车分时租赁的商业模式以高效、环保的特点受到广泛关注,但其很难凭借自身条件在市场环境下取得较快发展。各国普遍从财政、税收等角度频出利好政策,以推动共享汽车的发展。我国共享汽车产业还存在补贴资金浪费、责权不明、政策可操作性弱等问题。本文在比较国内外共享汽车分时租赁财税政策的基础上,提出政府应针对产业链各方在技术研发、宣传推广、消费补贴、基础设施建设等方面给予财政支持和税收优惠。
模型假设:
1. 信息完备性、稳定性假设
假定在进行共享汽车动态定价时,站点的停车位占用状态和车辆使用状态是完备和已知的,并且各个站点车辆、停车位及定价信息能够实时准确地传输到运营商使用的运营平台及用户使用的APP平台。
2. 车辆、路况完好性假设
假设同一类型的共享汽车的服务性能无个体差异,并且不考虑个别车辆因车辆故障、路况非完好等特殊原因而导致不能租赁的情况。
3. 用户使用流程假设
假定用户在租赁车辆时,了解共享汽车运营商的动态定价机制,熟悉车辆租赁流程,没有出现借还车不成功等现象,且当天租赁车辆都能在当天使用完毕并归还到站点。
4. 定价时间窗假设
共享汽车定价是一个持续动态的过程,在此过程中要以上一个时间窗的终止时的车辆使用状态和停车位空余情况作为下一个时间窗的起始状态,不同的站点在不同的时间窗会有不同的定价方案。
论文缩略图:
程序代码:
function f = genetic_operator(parent_chromosome, M, V, mu, mum, l_limit, u_limit)
[N,m] = size(parent_chromosome);
clear m
p = 1;
was_crossover = 0;
was_mutation = 0;
for i = 1 : N
if rand(1) < 0.9
child_1 = [];
child_2 = [];
parent_1 = round(N*rand(1));
if parent_1 < 1
parent_1 = 1;
end
parent_2 = round(N*rand(1));
if parent_2 < 1
parent_2 = 1;
end
while isequal(parent_chromosome(parent_1,:),parent_chromosome(parent_2,:))
parent_2 = round(N*rand(1));
if parent_2 < 1
parent_2 = 1;
end
end
parent_1 = parent_chromosome(parent_1,:);
parent_2 = parent_chromosome(parent_2,:);
for j = 1 : V
u(j) = rand(1);
if u(j) <= 0.5
bq(j) = (2*u(j))^(1/(mu+1));
else
bq(j) = (1/(2*(1 - u(j))))^(1/(mu+1));
end
child_1(j) = ...
0.5*(((1 + bq(j))*parent_1(j)) + (1 - bq(j))*parent_2(j));
child_2(j) = ...
0.5*(((1 - bq(j))*parent_1(j)) + (1 + bq(j))*parent_2(j));
if child_1(j) > u_limit(j)
child_1(j) = u_limit(j);
elseif child_1(j) < l_limit(j)
child_1(j) = l_limit(j);
end
if child_2(j) > u_limit(j)
child_2(j) = u_limit(j);
elseif child_2(j) < l_limit(j)
child_2(j) = l_limit(j);
end
end
child_1(:,V + 1: M + V) = evaluate_objective(child_1, M, V);
child_2(:,V + 1: M + V) = evaluate_objective(child_2, M, V);
was_crossover = 1;
was_mutation = 0;
else
parent_3 = round(N*rand(1));
if parent_3 < 1
parent_3 = 1;
end
child_3 = parent_chromosome(parent_3,:);
for j = 1 : V
r(j) = rand(1);
if r(j) < 0.5
delta(j) = (2*r(j))^(1/(mum+1)) - 1;
else
delta(j) = 1 - (2*(1 - r(j)))^(1/(mum+1));
end
child_3(j) = child_3(j) + delta(j);
if child_3(j) > u_limit(j)
child_3(j) = u_limit(j);
elseif child_3(j) < l_limit(j)
child_3(j) = l_limit(j);
end
end
child_3(:,V + 1: M + V) = evaluate_objective(child_3, M, V);
was_mutation = 1;
was_crossover = 0;
end
if was_crossover
child(p,:) = child_1;
child(p+1,:) = child_2;
was_cossover = 0;
p = p + 2;
elseif was_mutation
child(p,:) = child_3(1,1 : M + V);
was_mutation = 0;
p = p + 1;
end
end
f = child;
function f = non_domination_sort_mod(x, M, V)
[N, ~] = size(x);
clear m
front = 1;
F(front).f = [];
individual = [];
for i = 1 : N
individual(i).n = 0;
individual(i).p = [];
for j = 1 : N
dom_less = 0;
dom_equal = 0;
dom_more = 0;
for k = 1 : M
if (x(i,V + k) < x(j,V + k))
dom_less = dom_less + 1;
elseif (x(i,V + k) == x(j,V + k))
dom_equal = dom_equal + 1;
else
dom_more = dom_more + 1;
end
end
if dom_less == 0 && dom_equal ~= M
individual(i).n = individual(i).n + 1;
elseif dom_more == 0 && dom_equal ~= M
individual(i).p = [individual(i).p j];
end
end
if individual(i).n == 0
x(i,M + V + 1) = 1;
F(front).f = [F(front).f i];
end
end
while ~isempty(F(front).f)
Q = [];
for i = 1 : length(F(front).f)
if ~isempty(individual(F(front).f(i)).p)
for j = 1 : length(individual(F(front).f(i)).p)
individual(individual(F(front).f(i)).p(j)).n = ...
individual(individual(F(front).f(i)).p(j)).n - 1;
if individual(individual(F(front).f(i)).p(j)).n == 0
x(individual(F(front).f(i)).p(j),M + V + 1) = ...
front + 1;
Q = [Q individual(F(front).f(i)).p(j)];
end
end
end
end
front = front + 1;
F(front).f = Q;
end
[temp,index_of_fronts] = sort(x(:,M + V + 1));
for i = 1 : length(index_of_fronts)
sorted_based_on_front(i,:) = x(index_of_fronts(i),:);
end
current_index = 0;
%% Crowding distance
for front = 1 : (length(F) - 1)
distance = 0;
y = [];
previous_index = current_index + 1;
for i = 1 : length(F(front).f)
y(i,:) = sorted_based_on_front(current_index + i,:);
end
current_index = current_index + i;
sorted_based_on_objective = [];
for i = 1 : M
[sorted_based_on_objective, index_of_objectives] = ...
sort(y(:,V + i));
sorted_based_on_objective = [];
for j = 1 : length(index_of_objectives)
sorted_based_on_objective(j,:) = y(index_of_objectives(j),:);
end
f_max = ...
sorted_based_on_objective(length(index_of_objectives), V + i);
f_min = sorted_based_on_objective(1, V + i);
y(index_of_objectives(length(index_of_objectives)),M + V + 1 + i)...
= Inf;
y(index_of_objectives(1),M + V + 1 + i) = Inf;
for j = 2 : length(index_of_objectives) - 1
next_obj = sorted_based_on_objective(j + 1,V + i);
previous_obj = sorted_based_on_objective(j - 1,V + i);
if (f_max - f_min == 0)
y(index_of_objectives(j),M + V + 1 + i) = Inf;
else
y(index_of_objectives(j),M + V + 1 + i) = ...
(next_obj - previous_obj)/(f_max - f_min);
end
end
end
distance = [];
distance(:,1) = zeros(length(F(front).f),1);
for i = 1 : M
distance(:,1) = distance(:,1) + y(:,M + V + 1 + i);
end
y(:,M + V + 2) = distance;
y = y(:,1 : M + V + 2);
z(previous_index:current_index,:) = y;
end
f = z();