卡车与无人机协同配送路径规划:数学建模与智能优化算法实战
1. 项目概述当数学建模遇上无人机物流又到了一年一度的五一数学建模竞赛今年的C题“具有无人机的物流配送问题”一出来就在我们这个小圈子里炸开了锅。这题目可以说是精准地踩在了当前物流科技和运筹学研究的双重热点上。简单来说就是研究如何让卡车和无人机这对“黄金搭档”协同工作在复杂的城市路网中高效、低成本地完成一系列包裹的配送任务。题目里通常会给出配送中心的位置、各个客户点的位置和需求、卡车的容量、无人机的航程和载重限制以及两者的速度、成本等参数然后要求我们建立数学模型规划出最优的配送方案。这不仅仅是出一道题它背后反映的是整个智慧物流行业正在发生的深刻变革。无人机配送早已不是科幻电影里的概念国内外各大电商和物流巨头都在积极布局。但无人机不是万能的它受限于续航和载重无法独立完成长距离、大批量的配送。这时候卡车作为“移动母舰”或“空中基站”的价值就凸显出来了。如何让卡车和无人机在时间和空间上精密配合实现“112”的效果就是这道题的核心也是现实中亟待解决的工程与商业难题。对于参赛的同学来说这既是一次对数学建模综合能力的考验也是一次接触前沿产业问题的绝佳机会。无论你是擅长算法编程的“技术流”还是善于构建模型的“理论派”都能在这个题目中找到发挥的空间。2. 核心思路拆解从问题本质到模型框架面对这样一个综合性问题最忌讳的就是一头扎进细节里开始编程。我的经验是先用半小时到一个小时把问题的“骨架”给搭起来。这个骨架就是我们的建模思路。2.1 问题归类与核心挑战首先我们得给这个问题归个类。它本质上是一个复杂的组合优化问题并且混合了车辆路径问题VRP和无人机路径规划的特点。我们可以把它称为“卡车与无人机协同配送的混合车辆路径问题”Truck-Drone Collaborative VRP。其核心挑战在于处理两种异构运载工具之间的耦合关系时空耦合卡车和无人机的移动路径在时间和空间上必须精确同步。无人机从卡车起飞去服务客户必须能在其电量耗尽前返回卡车可能是原地也可能是卡车移动后的新汇合点。资源耦合卡车的车厢空间、无人机的电池和载重都是有限资源。如何分配包裹给卡车直接配送还是由无人机“接力”配送需要统筹考虑。顺序耦合客户服务的顺序不仅影响总路径长度还深刻影响无人机能否被有效释放和回收。一个糟糕的卡车路径可能会把无人机“困”在车上无法发挥其灵活优势。2.2 主流建模思路解析针对这些挑战学术界和工业界通常有几种主流建模思路我们可以根据自己对题目的理解和编程能力来选择或融合。思路一两阶段启发式算法这是最直观、也最容易被初学者理解的思路。所谓两阶段就是先解决一个再解决另一个。第一阶段聚类与分配。根据客户点的地理分布、无人机航程将客户点划分为不同的“服务簇”。每个簇由一个“关键点”通常是簇的中心或某个特定客户代表卡车只需行驶到这个关键点。第二阶段路径规划与调度。对卡车将各个关键点作为节点规划一条卡车行驶的最短路径经典的TSP问题。对无人机在每个关键点卡车停靠后无人机以该点为基地服务该簇内的所有客户点一个或多个。这相当于在每个簇内解一个无人机路径规划问题可能是带容量限制的VRP或简单的排序问题。优点思路清晰模块化好实现相对简单。非常适合作为基础框架。缺点将问题强行解耦可能损失全局最优性。比如某个客户划给A簇可能不如划给B簇更优但两阶段算法在第一步就固定了划分。思路二基于时空网络的混合整数规划MIP这是最“硬核”、理论上最优的建模方法适合数学功底扎实的队伍。核心思想将整个配送过程离散化为一个时空网络。网络中的节点不仅代表地理位置客户点、配送中心还扩展了“时间”维度。每条边代表在特定时间从A点移动到B点的可能性。决策变量定义0-1变量表示卡车/无人机在特定时间是否选择某条边定义连续变量表示卡车/无人机到达某点的时间、电量状态等。约束条件用数学公式精确描述所有耦合关系。例如无人机从卡车起飞的边被选中必须对应一条在之后时间、从客户点返回卡车的边被选中且时间差小于无人机续航。优点模型精确能获得理论上的最优解如果求解器能算出来的话。缺点模型规模随客户点数量呈指数级增长求解极其困难通常只能处理很小规模如10-15个客户的问题。对于竞赛规模的题目可能几十上百个客户直接求解几乎不可能但可以作为问题理解和局部优化的理论基石。思路三元启发式算法智能优化算法这是目前解决此类大规模组合优化问题最主流、最有效的方法也是竞赛中冲击高奖的“利器”。核心思想不追求精确的数学最优解而是通过模拟自然或社会中的智能行为在巨大的解空间中高效搜索高质量的解。常用算法遗传算法GA将一条完整的协同配送方案包含卡车路径和无人机任务序列编码为一条“染色体”通过选择、交叉、变异操作迭代进化。模拟退火SA从一个初始解开始以一定概率接受“更差”的新解从而跳出局部最优逐步逼近全局最优。蚁群算法ACO模拟蚂蚁觅食的信息素机制路径被选择的次数越多信息素越浓后续蚂蚁选择它的概率越大从而收敛到较优路径。变邻域搜索VNS系统性地改变当前解的邻域结构进行搜索在“震荡”和“深化”间取得平衡。在本题的应用关键在于解的表示编码和邻域动作的设计。例如解可以表示为卡车访问节点的顺序列表同时附带一个列表标明每个节点是由卡车服务还是由无人机从某个节点服务。邻域动作可以包括交换两个节点的访问顺序、将某个客户从卡车服务改为无人机服务并为其寻找合适的起降点、改变无人机起降点等。优点能处理大规模问题在合理时间内得到非常优秀的可行解。灵活性高可以方便地加入各种复杂约束时间窗、多车、多机等。缺点算法设计复杂参数调优需要经验且不能保证得到最优解。对于大多数参赛队伍我建议采用“思路三为主思路一为辅”的策略。即用元启发式算法如遗传算法作为全局搜索框架但在算法内部评估解的质量时可以借鉴两阶段的思想来快速计算一个可行方案的成本。或者先用聚类方法得到一个较好的初始解再喂给元启发式算法进行精细优化。3. 模型构建的关键细节与实现要点确定了宏观思路接下来就要深入到模型的“肌理”之中。这里有几个细节处理得好坏直接决定模型的优劣和论文的深度。3.1 解的表达编码设计这是元启发式算法的第一步也是最重要的一步。一个糟糕的编码会让后续的搜索效率大打折扣。一种强推荐的混合编码方案我们可以设计一个由两部分组成的染色体卡车路径序列Truck Tour一个包含所有客户点ID的排列Permutation。这代表了卡车可能访问所有客户的顺序。注意是“可能”因为其中一些点卡车可能只是经过而不服务作为无人机起降点。服务模式向量Service Mode Vector一个与客户点一一对应的列表每个元素取值例如0-由卡车直接服务1-由无人机从上一个节点服务2-由无人机从当前节点服务即卡车到达该点后释放无人机2的整数-表示由无人机从序列中第N个节点服务。解码过程从染色体到具体方案我们需要一个“解码器”函数将上面的编码转化为一个可计算成本的具体配送方案。解码器需要智能地解析服务模式向量并遵循以下规则模拟配送过程从配送中心出发卡车按照Truck Tour序列移动。当遇到一个标记为0的客户卡车停车完成服务。当遇到一个标记为1的客户检查无人机状态。如果无人机空闲且在车上且从上个节点到此客户的往返距离小于无人机航程则在上个节点释放无人机服务此客户然后无人机返回卡车卡车可能在移动中需计算汇合点。当遇到一个标记为2的客户卡车到达该点后可以释放无人机服务后续标记为“由无人机从当前节点服务”的客户直到无人机必须返回。解码器还需要处理无人机的电量约束、载重约束以及卡车等待无人机的约束。这种编码方式将复杂的协同关系编码进了简单的序列和向量中遗传算法的交叉、变异操作可以很方便地在Truck Tour序列上进行如部分映射交叉PMX、逆转变异而Service Mode Vector也可以进行随机扰动或基于规则的变异。3.2 成本目标函数的计算目标通常是最小化总完成时间Makespan或最小化总成本时间成本运输成本。在解码过程中我们需要同步模拟时间线才能准确计算。时间推进模拟维护两个时间线truck_time和drone_time。卡车按照路径移动每段行程增加距离/卡车速度。无人机任务开始时其drone_time与释放点的truck_time对齐。无人机服务客户并返回其drone_time增加飞行距离/无人机速度。关键点在于汇合同步无人机返回时卡车可能已经在移动。汇合点不一定在释放点。情况一无人机先到汇合点。无人机需要等待卡车此时总时间由卡车到达时间决定。情况二卡车先到汇合点。卡车需要等待无人机。 在模拟中每当无人机完成一个任务或卡车到达一个可能释放/回收无人机的点时都需要检查并同步两者的时间取最大值作为新的共同时间基准。这个模拟过程是解码器的核心务必仔细实现。成本计算示例假设目标是最小化总运营成本包含卡车固定使用成本、单位距离成本无人机单位时间使用成本或单位飞行距离成本。总成本 卡车固定成本 (卡车总行驶距离 * 卡车单位距离成本) (无人机总飞行时间 * 无人机单位时间成本) (总等待时间 * 单位时间惩罚成本)等待时间包括卡车等无人机和无人机等卡车的时间这部分体现了协同效率是优化的重点。3.3 约束的处理技巧约束不能只靠解码器“硬算”那样会生成大量不可行解降低搜索效率。最好将约束“软化”或通过设计融入到算法中。无人机航程约束这是硬约束。在解码器中如果发现某个无人机任务往返距离超过最大航程直接判定该任务不可行。在遗传算法中可以给这种解一个极大的惩罚成本或者设计专门的修复算子例如将这个客户的服务模式强行改为卡车服务0。载重约束卡车和无人机都有载重限制。可以在解码模拟时累加载荷超载则判定为不可行解或施加惩罚。更优的做法是在编码或变异时考虑例如设计一个“贪心装载”的子程序在安排无人机任务时优先派遣它去服务小包裹客户。时间窗约束如果题目有客户要求在特定时间段内被服务。这大大增加了复杂度。在解码模拟时如果早到需要等待晚到则产生惩罚成本。在算法设计上可以优先将时间窗紧迫的客户排在卡车路径前列或专门为其分配无人机以确保准时。实操心得在编写解码器时一定要加入详尽的日志输出功能。把每一时刻卡车和无人机的位置、状态、时间都打印出来。这对于调试复杂的时间同步逻辑至关重要。我曾因为一个细微的边界条件错误无人机返回时卡车刚好启动导致整个优化方向错误浪费了一天时间。用一个小规模案例比如5个客户手动推导出正确的时间线然后用你的程序去验证是保证解码器正确的唯一方法。4. 算法实现与核心代码结构参考这里以Python语言和遗传算法GA框架为例给出一个高层次的代码结构参考。我们不会贴出全部数千行代码但会勾勒出核心模块和关键函数你可以在此基础上填充血肉。4.1 数据准备与问题定义首先定义一个Problem类来封装所有输入数据。import numpy as np import math class Problem: def __init__(self, data): self.depot data[depot] # 配送中心坐标 (x, y) self.customers data[customers] # 列表每个客户是字典 {id, x, y, demand, service_time, [time_window]} self.num_customers len(self.customers) self.truck_speed data[truck_speed] self.drone_speed data[drone_speed] self.truck_capacity data[truck_capacity] self.drone_capacity data[drone_capacity] self.drone_range data[drone_range] # 最大航程 self.truck_cost_per_km data[truck_cost_per_km] self.drone_cost_per_hour data[drone_cost_per_hour] self.waiting_penalty data[waiting_penalty] def distance(self, pos1, pos2): 计算两点间欧氏距离 return math.sqrt((pos1[0]-pos2[0])**2 (pos1[1]-pos2[1])**2) # ... 其他辅助方法4.2 个体编码与解码器这是算法的核心。class Individual: 个体代表一个解决方案 def __init__(self, problem): self.problem problem self.truck_tour None # 卡车路径序列如 [3,1,4,2] self.service_mode None # 服务模式向量长度等于客户数 self.fitness float(inf) # 适应度总成本越小越好 self.feasible False self.schedule None # 解码后的详细时刻表 def random_init(self): 随机初始化个体 self.truck_tour np.random.permutation(self.problem.num_customers).tolist() # 服务模式随机初始化可以有一定倾向性如更多用卡车 self.service_mode np.random.choice([0, 1, 2], sizeself.problem.num_customers, p[0.5, 0.25, 0.25]).tolist() self.decode() def decode(self): 解码器将编码转换为具体配送方案并计算成本 # 这是一个复杂的模拟过程伪代码逻辑如下 schedule { truck_route: [], # 记录卡车实际停靠点序列含配送中心 drone_missions: [], # 记录每次无人机任务 {launch_node, customers_served, return_node} timeline: [] # 记录关键事件时间 } current_time 0 truck_pos self.problem.depot drone_status idle # idle, flying, waiting drone_return_time 0 drone_return_pos None truck_load 0 total_cost 0 total_waiting 0 # 按照truck_tour顺序遍历所有客户点 for i, customer_id in enumerate(self.truck_tour): customer self.problem.customers[customer_id] mode self.service_mode[customer_id] # 1. 卡车移动到当前点 travel_dist self.problem.distance(truck_pos, customer[pos]) travel_time travel_dist / self.problem.truck_speed current_time travel_time truck_pos customer[pos] # 2. 根据服务模式处理 if mode 0: # 卡车服务 if truck_load customer[demand] self.problem.truck_capacity: # 卡车服务客户消耗服务时间 service_time customer[service_time] current_time service_time truck_load customer[demand] schedule[truck_route].append({node: customer_id, arrive: current_time-service_time, depart: current_time}) else: # 超载不可行解 self.feasible False self.fitness 1e10 return elif mode 1: # 无人机从前一个节点服务 # 检查前一个节点是否适合作为发射点且无人机空闲 prev_customer_id self.truck_tour[i-1] if i0 else depot prev_pos self.problem.customers[prev_customer_id][pos] if prev_customer_id ! depot else self.problem.depot # 计算往返距离检查航程和载重 round_trip_dist self.problem.distance(prev_pos, customer[pos]) * 2 if (drone_status idle and round_trip_dist self.problem.drone_range and customer[demand] self.problem.drone_capacity): # 执行无人机任务 flight_time round_trip_dist / self.problem.drone_speed drone_return_time current_time flight_time # 假设卡车等待 # 更新时间和成本 total_waiting flight_time # 卡车等待时间 current_time drone_return_time # 卡车必须等到无人机返回 total_cost flight_time * self.problem.drone_cost_per_hour schedule[drone_missions].append({launch: prev_customer_id, serve: customer_id, return: prev_customer_id, time: flight_time}) else: # 无人机任务不可行转为惩罚或尝试其他方式 self.fitness 1000 # 惩罚项 # ... 处理mode2等其他情况以及无人机从更早节点服务的情况 # 3. 处理无人机与卡车的汇合逻辑略需详细实现 # 4. 更新状态检查约束 # 计算总成本 total_truck_dist ... # 根据schedule计算卡车总行驶距离 total_cost total_truck_dist * self.problem.truck_cost_per_km total_cost total_waiting * self.problem.waiting_penalty self.schedule schedule self.fitness total_cost self.feasible True # 如果所有约束都满足4.3 遗传算法主框架class GeneticAlgorithm: def __init__(self, problem, pop_size100, generations500, crossover_rate0.8, mutation_rate0.1): self.problem problem self.pop_size pop_size self.generations generations self.population [] self.best_individual None def initialize_population(self): for _ in range(self.pop_size): ind Individual(self.problem) ind.random_init() self.population.append(ind) def selection(self): 锦标赛选择 tournament_size 3 selected [] for _ in range(self.pop_size): contestants np.random.choice(self.population, sizetournament_size, replaceFalse) winner min(contestants, keylambda x: x.fitness) selected.append(winner) return selected def crossover(self, parent1, parent2): 顺序交叉 (OX) 用于卡车路径单点交叉用于服务模式 child1, child2 Individual(self.problem), Individual(self.problem) # 1. 对卡车路径进行OX交叉 cut1, cut2 sorted(np.random.choice(len(parent1.truck_tour), 2, replaceFalse)) segment1 parent1.truck_tour[cut1:cut2] segment2 parent2.truck_tour[cut1:cut2] # ... 实现OX交叉逻辑生成child1_tour和child2_tour # 2. 对服务模式进行单点交叉 cross_point np.random.randint(len(parent1.service_mode)) child1_mode parent1.service_mode[:cross_point] parent2.service_mode[cross_point:] child2_mode parent2.service_mode[:cross_point] parent1.service_mode[cross_point:] # 3. 赋值给子代 child1.truck_tour child1_tour child1.service_mode child1_mode child2.truck_tour child2_tour child2.service_mode child2_mode return child1, child2 def mutation(self, individual): 变异随机交换卡车路径中的两个点或随机改变某个点的服务模式 if np.random.rand() 0.5: # 路径变异 i, j np.random.choice(len(individual.truck_tour), 2, replaceFalse) individual.truck_tour[i], individual.truck_tour[j] individual.truck_tour[j], individual.truck_tour[i] else: # 服务模式变异 idx np.random.randint(len(individual.service_mode)) individual.service_mode[idx] np.random.choice([0, 1, 2]) individual.decode() # 变异后必须重新解码计算适应度 def run(self): self.initialize_population() for gen in range(self.generations): # 评估 for ind in self.population: if not hasattr(ind, fitness) or ind.fitness is None: ind.decode() # 选择 selected self.selection() next_population [] # 交叉与变异 for i in range(0, len(selected), 2): parent1, parent2 selected[i], selected[i1] if np.random.rand() self.crossover_rate: child1, child2 self.crossover(parent1, parent2) else: child1, child2 parent1, parent2 if np.random.rand() self.mutation_rate: self.mutation(child1) if np.random.rand() self.mutation_rate: self.mutation(child2) child1.decode() child2.decode() next_population.extend([child1, child2]) # 精英保留保留上一代最优个体 best_current min(self.population, keylambda x: x.fitness) next_population[0] best_current self.population next_population[:self.pop_size] # 记录全局最优 current_best min(self.population, keylambda x: x.fitness) if self.best_individual is None or current_best.fitness self.best_individual.fitness: self.best_individual current_best print(fGeneration {gen}, Best Fitness: {self.best_individual.fitness:.2f}) return self.best_individual4.4 可视化与结果分析得到最优解后可视化至关重要。使用matplotlib绘制配送路线图。import matplotlib.pyplot as plt def plot_solution(problem, best_individual): fig, ax plt.subplots(figsize(10, 8)) # 画出所有客户点 customers_x [c[pos][0] for c in problem.customers] customers_y [c[pos][1] for c in problem.customers] ax.scatter(customers_x, customers_y, cblue, labelCustomers, s50) # 画出配送中心 ax.scatter(problem.depot[0], problem.depot[1], cred, markers, s200, labelDepot) schedule best_individual.schedule # 绘制卡车路径 truck_route schedule[truck_route] route_x, route_y [problem.depot[0]], [problem.depot[1]] for stop in truck_route: cust problem.customers[stop[node]] route_x.append(cust[pos][0]) route_y.append(cust[pos][1]) # 回到配送中心如果题目要求 route_x.append(problem.depot[0]) route_y.append(problem.depot[1]) ax.plot(route_x, route_y, k-, linewidth2, labelTruck Route) # 绘制无人机任务用虚线箭头表示 for mission in schedule[drone_missions]: launch_node mission[launch] serve_node mission[serve] if launch_node depot: launch_pos problem.depot else: launch_pos problem.customers[launch_node][pos] serve_pos problem.customers[serve_node][pos] ax.annotate(, xyserve_pos, xytextlaunch_pos, arrowpropsdict(arrowstyle-, colorgreen, linestyle--, linewidth1.5)) # 也可以画返回箭头 # ax.annotate(, xylaunch_pos, xytextserve_pos, # arrowpropsdict(arrowstyle-, colororange, linestyle:, linewidth1)) ax.set_xlabel(X Coordinate) ax.set_ylabel(Y Coordinate) ax.set_title(Truck-Drone Collaborative Delivery Solution) ax.legend() ax.grid(True, alpha0.3) plt.show()5. 模型优化与进阶策略基础模型跑通后想要进一步提升成绩就需要在算法和模型细节上做深度优化。5.1 算法层面的优化技巧混合启发式初始化不要完全随机初始化种群。可以先用简单的贪心算法如最近邻法生成一条卡车路径或者用K-means对客户点聚类为每个簇生成一条局部路径再组合起来。这样得到的初始解质量高能加速算法收敛。自适应参数调整让交叉率crossover_rate和变异率mutation_rate随着进化代数动态变化。例如前期采用较高的交叉率和较低的变异率以促进优良模式的结合后期降低交叉率提高变异率以增强局部搜索和跳出局部最优的能力。局部搜索嵌入在遗传算法每一代结束后对当代最优个体或随机选取的几个优质个体进行局部搜索。例如2-opt算子尝试反转卡车路径中的一段看是否能降低成本。Relocate算子将一个客户点从路径中移除插入到另一个位置。Drone-task Swap算子交换两个无人机任务的服务对象或起降点。 这种“全局搜索GA 局部搜索LS”的混合策略Memetic Algorithm效果通常远好于纯GA。多种群并行进化维护多个子种群分别以不同的参数或策略进化定期交换一些个体迁移。这有助于保持种群多样性避免早熟收敛。5.2 模型层面的精细考量多无人机模型一辆卡车搭载多架无人机如2-3架。这需要修改解码器同时管理多个无人机的状态空闲、飞行、电量。决策变量变为为每个客户分配由哪架无人机服务或卡车。这能极大提升并行效率但搜索空间也呈指数增长。无人机中途回收允许无人机不在起飞点回收而是在卡车路径前方的某个预定汇合点回收。这需要更复杂的时间同步计算但能减少卡车等待时间是现实中的常用策略。可以在解码器中实现一个函数根据卡车未来路径和无人机剩余电量动态计算最优汇合点。考虑交通与能耗引入路网距离而非直线距离、速度与交通流量的关系。无人机的能耗模型也可以更精细考虑起飞、悬停、巡航的不同功耗而不仅仅是距离。5.3 灵敏度分析与方案评估一个优秀的数模论文不能只给出一个“黑箱”答案。你需要展示模型的鲁棒性和决策依据。参数灵敏度分析系统性地改变关键参数如无人机航程、速度、卡车成本观察最优方案和总成本的变化。例如绘制“总成本 vs. 无人机航程”曲线。你会发现存在一个临界航程超过它成本下降变得平缓这能为无人机采购提供决策支持。分析“无人机使用比例 vs. 客户分布密度”。在客户密集区域无人机优势明显在稀疏区域卡车更经济。方案对比将你的协同配送方案与纯卡车配送方案、纯无人机配送方案如果可能进行对比。用数据表格和图表清晰地展示协同方案在成本、时间上的优势。例如配送方案总成本元总耗时小时卡车行驶距离km无人机飞行距离km纯卡车配送15008.51200卡车-无人机协同10506.28560成本降低30%27%29%-“What-If”场景分析提出一些假设性场景。例如“如果某个区域临时交通管制卡车速度下降30%我们的方案需要如何调整” 这体现了模型的实用性和你的思考深度。6. 参赛实操避坑指南与心得结合多年参赛和指导经验以下几个“坑”是新手最容易掉进去的务必警惕。过早陷入代码细节拿到题目不要立刻开始写distance函数。花足够的时间至少2小时进行文献调研知网、Google Scholar搜“Truck-Drone routing”、“VRP with Drones”、思路讨论和方案设计。画流程图、理清数据结构和算法步骤比盲目写代码有效率得多。忽视模型假设的清晰表述你的模型基于哪些假设必须清晰、有条理地写在论文里。例如“假设无人机在直线飞行忽略地形和建筑障碍”、“假设客户服务时间固定且与配送员无关”、“假设卡车和无人机速度恒定”。这些假设限定了模型的适用范围也是评委评价你工作严谨性的重要依据。结果可视化薄弱一张好的路线图、成本对比图、收敛曲线图抵得上千言万语。不要只用命令行输出数字。用matplotlib或plotly制作专业、清晰的图表。路线图上用不同颜色和线型区分卡车和无人机路径用箭头指示方向图例要清楚。代码冗长且无注释三天时间写出的代码必然混乱但关键函数、复杂逻辑处一定要写注释。更重要的是在论文中不要贴大段代码只贴最核心的算法伪代码或流程图并加以解释。将完整代码作为附录提交即可。测试用例过于简单自己编一个5个客户点的数据跑通了就以为万事大吉。一定要用题目给的完整数据或按相同规模生成随机数据进行测试。小规模问题和大规模问题的表现可能天差地别你的算法可能需要调整参数甚至更换策略。忽略论文写作数学建模竞赛论文是唯一的评分依据。最后一天一定要留出至少8小时来撰写和修改论文。摘要要精炼包含问题、方法、模型、算法、主要结果和结论。正文结构要清晰公式编号规范图表要有标题和编号。结论部分要总结你的工作并指出模型的优缺点及改进方向。最后的叮嘱这道题工作量巨大三人队伍必须明确分工。一人主攻模型构建与算法设计队长一人主攻编程实现与调试一人主攻论文写作与数据可视化。每天早晚开短会同步进度、解决问题。保持沟通遇到卡壳及时讨论或寻求外部资料相关论文、开源代码。记住完成比完美更重要。先建立一个能跑出可行解的基线模型然后再去迭代优化。祝大家在五一数模竞赛中思路泉涌码力全开取得理想的成绩