将在本文更新深圳杯AC题思路模型代码!欢迎关注UST数模社
问题分析:首先我们通过微博选择需要研究的话题,收集话题的相关数据以及用户粉丝人数、转发量、评论量来作为信息传播的影响因子,通过量化单位时间的转发量、评论量等指标。来作为信息传播的综合评价指标,从而构建综合评价体系量化信息传播指数,引入熵权法求解各评价指标的权重,综合分析信息传播随时间变化的规律。
在全新的信息传播格局下,如何破除“尖叫效应”与“回声室效应”,走出“信息茧房”,是当前迫切需要解决的现实问题,即如何从信息传输的顶层设计、推荐算法的公平性和广大网络用户的责任担当等方面,帮助公众对新闻事件乃至社会现实有一个相对准确、清晰的认识和判断,并在主流意识和个性化信息之间找到平衡点,使得网络舆论环境更具理性和建设性。请回答以下问题:
1. 针对某些话题,在微信、微博、Facebook和Twitter等社交媒体上下载相关数据,定量描述该话题(或信息)的传播过程,并分析其影响因素。该数据分析需至少针对两种不同的话题展开讨论,其中一个话题最终观点趋于相同(中立共识),另一话题最终观点趋于两极分化(观点极化)。
中立共识与观点极化其实是在话题传播途中,用户对话题评论数量的占比,通过分析话题中反对、支持、中立三种不同观点的评论数及评论数随时间增长速度随时间的变化规律;该规律用于刻画话题中共识与极化形成的机制,同时分别统计各因素指标的数值,引入相关性分析模型,分别讨论不同观点评论数量、增长量与各因素的关系。
得出一部分爬虫后的数据
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
C题分析:
为了实现我国在2030年前“碳达峰”、在2060年前“碳中和”的目标,在物料运输中使用环保的自动驾驶电动车是发展趋势。
在制订电动车调度方案时,必须考虑充、换电池的时间成本,从而提出了新的车辆运输选址及调度问题。
问题1 一批自动驾驶电动物料车将物料从P点运送到D点,然后空载返回,如此循环往复运送物料。要求建立数学规划模型,在P点与D点之间确定一个双向同址(像高速的休息站一样)的换电站位置,以及对应的车辆和电池组调度方案,极大化指定时间段内运送物料量,满足资源约束与电池运行方式约束。根据附录所给的数据,求解规划模型,给出换电站位置,并给出在1000小时中运送的物料量,所使用车辆、电池组数量和车辆及其各电池组的具体调度方案。
问题一思路:
问题需要我们求出具体的选址以及调度方案,所以学习过数学建模模型的同学应该可以很快地反应,我们需要用到规划模型,从文中所给我们可以得到决策变量:换电站的位置,根据到P点以及D点的距离,来得出我们的规划模型;
目标函数: 运输的趟数最多或者可以说,到达D点的次数最多 。接下来的约束条件, 只需要根据调度方案选择合适的出发点就可以了。看起来, 出发点的选择可以靠近点P, 又恰好让车跑到90%时更换电池。
我们给出第一、二问的部分代码供大家参考,后续持续更新!
第一问代码
import numpy as np
from itertools import product
class Lorry:
def __init__(self, station1, station2):
# station1: P->D 换电站位置, station2:D->P 换电站位置
self.bet = 100 # 当前电池电量
self.p = 20 - station2 # 当前位置
self.t = 0 # 当前时间
self.station1 = station1
self.station2 = station2
self.n_charge = 0 # 充电次数
def __str__(self):
return "Lorry is at position {}, with battery {}, at time {}".format(self.p, self.bet, self.t)
def move(self, dt):
# 0(P)___10(D)___20(P')
# dt时间后的演化结果
if 0 <= self.p < 10 or np.isclose(self.p, 0):
# P->D
self.bet -= 1/2 * dt # 电池消耗
elif 10 <= self.p < 20 or np.isclose(self.p, 10):
# D->P
self.bet -= 1/3 * dt # 电池消耗
if self.bet < 0 or np.isclose(self.bet, 0):
raise Exception("Lorry is out of battery")
self.t = self.t + dt # 时间变化
self.p = (self.p + dt * 1) % 20 # 位置变化
if np.isclose(self.p, 10) or np.isclose(self.p, 0):
# 装卸货时间
self.t += 1
self.recharge()
def recharge(self):
if (np.isclose(self.p, self.station1) or np.isclose(self.p, 20 - self.station2)) and 10 <= self.bet <= 12.6:
# 逐渐降低阈值,测试是否存在可行解
self.bet = 100
# print("Lorry is recharged at time {}".format(self.t))
# gap.append(self.t)
# print(self)
self.t += 2
self.n_charge += 1
# for (sta1, sta2) in product(np.arange(0, 10, 1), np.arange(0, 10, 1)):
for sta1 in np.arange(0.1, 10, 0.1):
sta2 = sta1
lorry = Lorry(sta1, sta2)
try:
for T in range(1000*60*10):
lorry.move(dt=0.1)
print('({:.1f}, {:.1f}) worked with charge {:d} times'.format(sta1, sta2, lorry.n_charge))
except Exception as e:
print((sta1, sta2), e, end='\r')
# # gap = []
# (sta1, sta2) = (5, 5)
# lorry = Lorry(sta1, sta2)
# for T in range(1000*60*10):
# lorry.move(dt=0.1)
# # print(lorry.n_charge)
# # gap = [gap[i] - gap[i-1] for i in range(1, len(gap))]
# # gap = np.array(gap)
# # print(gap.min())
# n_lorry = 75
第二问代码:
import numpy as np
from itertools import product
class Lorry:
def __init__(self, station1, station2):
# station1: P->D 换电站位置, station2:D->P 换电站位置
self.bet = 100 # 当前电池电量
self.p = 20 - station2 # 当前位置
self.t = 0 # 当前时间
self.station1 = station1
self.station2 = station2
self.n_charge = 0 # 充电次数
self.n_mission = 0 # 运货次数
def __str__(self):
return "Lorry is at position {:.1f}, charged {:d} times,\n complete mission {:d} times in {:.1f} minutes".format(self.p, self.n_charge, self.n_mission, self.t)
def move(self, dt):
# 0(P)___10(D)___20(P')
# dt时间后的演化结果
if 0 <= self.p < 10 or np.isclose(self.p, 0):
# P->D
self.bet -= 1/2 * dt # 电池消耗
elif 10 <= self.p < 20 or np.isclose(self.p, 10):
# D->P
self.bet -= 1/3 * dt # 电池消耗
if self.bet < 0 or np.isclose(self.bet, 0):
raise Exception("Lorry is out of battery")
self.t = self.t + dt # 时间变化
self.p = (self.p + dt * 1) % 20 # 位置变化
if np.isclose(self.p, 0):
# 装卸货时间
self.t += 1
elif np.isclose(self.p, 10):
self.t += 1
self.n_mission += 1
self.recharge()
def recharge(self):
# 逐渐降低阈值,测试是否存在可行解
if np.isclose(self.p, self.station1) and 10 <= self.bet <= 12.6:
# 满载到达换电站
self.bet = 100
self.t += 2
self.n_charge += 1
elif np.isclose(self.p, 20 - self.station2) and 10 <= self.bet <= 12.6:
# 空载到达换电站
self.bet = 100
self.t += 2/3 # 只考虑换电为2, 考虑换电为2/3
self.n_charge += 1
lorry = Lorry(7.0, 2.0)
print("选址位于(7.0, 2.0)")
while lorry.t < (1000*60 - 0.1):
lorry.move(dt=0.1)
print(lorry)
lorry = Lorry(5.0, 5.0)
print("选址位于(5.0, 5.0)")
while lorry.t < (1000*60 - 0.1):
lorry.move(dt=0.1)
print(lorry)
lorry = Lorry(3.0, 8.0)
print("选址位于(3.0, 8.0)")
while lorry.t < (1000*60 - 0.1):
lorry.move(dt=0.1)
print(lorry)
# for (sta1, sta2) in product(np.arange(0, 10, 1), np.arange(0, 10, 1)):
# # for sta1 in np.arange(0.1, 10, 0.1):
# # sta2 = sta1
# lorry = Lorry(sta1, sta2)
# try:
# for T in range(1000*60*10):
# lorry.move(dt=0.1)
# print('({:.1f}, {:.1f}) worked with charge {:d} times'.format(sta1, sta2, lorry.n_charge))
# except Exception as e:
# print((sta1, sta2), e, end='\r')
# # gap = []
# (sta1, sta2) = (5, 5)
# lorry = Lorry(sta1, sta2)
# for T in range(1000*60*10):
# lorry.move(dt=0.1)
# # print(lorry.n_charge)
# # gap = [gap[i] - gap[i-1] for i in range(1, len(gap))]
# # gap = np.array(gap)
# # print(gap.min())
具体换车换电流程为:
初始时, 有75辆车运行, 50辆满电的车备用.
将所有车按1-75进行编号, 初始时, 以0.2km间隔发车, 则最后一辆车与第一辆车有约为5km的间隔.
在满载的状态下, 若如果路过换电站时, 电量在10%至12.6%, 只选择换电, 不选择换车.
在空载的状态下, 若如果路过换电站时, 电量在10%至12.6%, 按照如下状态进行换车换电:
第一轮位于空载状态下路过换电站, 对1-50车进行换车操作, 50-75号车进行换电操作, 则75号与1号车间隔缩小(但仍远大于0.2km), 50号与51号车间隔变大.
第二轮位于空载状态下路过换电站, 对51-75, 1-25车进行换车操作, 25-75号车进行换电操作
第三轮位于空载状态下路过换电站, 对25,-75车进行换车操作, 1-25号车进行换电操作
三轮操作为一个循环, 间距回到原来的状态.
持续更新!