代驾这种业务很多做共享出行的人第一反应是“这不就是网约车的小改版吗”真做进去就会发现完全不是一回事。普通快车高峰期在早晚通勤代驾高峰期全在深夜饭局散场之后快车司机满城流动接单代驾司机大多是蹲守在商圈、餐厅、KTV周边等单用户叫代驾的耐心窗口极短等不到车立马切别的平台而且订单金额高、服务重一单丢了对司机和平台都是实打实的损失。这些特性决定了代驾系统在资源调度和定价策略上不能直接抄网约车那套逻辑。我最近完整做了一遍模拟项目一套共享经济场景下的代驾系统核心是资源调度和动态定价两块算法全部用 Python 实现。整篇文章我会从需求拆解讲到算法设计再到核心代码实现和参数调优最后把模拟过程中遇到的典型问题也一并整理出来。源码关键部分会贴出来方便直接拿去改造成自己的版本。1. 项目概述代驾调度到底难在哪里先厘清这个项目的边界。我所指的代驾系统不是一个完整商业平台而是把核心决策逻辑抽出来的模拟系统给定城市区域的订单分布、司机位置系统要做两件事——决定司机往哪个区域调度以及决定当前订单采用什么倍率定价。这两件事看似独立实际强耦合调度影响供需比供需比又反过来决定定价定价过高会压订单量订单量减少又会让司机空跑。所以整个项目其实是在做一个带反馈回路的决策系统。1.1 代驾场景和网约车的关键差异在做技术方案之前我先把代驾的场景特性做了梳理这决定了后面所有算法选型。第一是时空高度集中。代驾需求集中在晚间特定时段尤其是周五、周六的 22 点到凌晨 2 点空间上集中在餐饮商圈、酒吧街、大型停车场周边。这意味着系统不需要像网约车那样做全城均衡调度而是要做热点区域的“脉冲式”调度——提前把司机赶到即将爆单的区域。第二是司机和用户的双边稀缺。代驾司机群体相对固定很多人是兼职深夜出车意愿受天气、收入和疲劳程度影响很大。用户端则是“即时性强、留存弱”叫不到车就换平台不会等太久。所以定价不仅仅是追求收入最大化还要在高峰期保证足够的应答率否则用户流失的损失远超溢价带来的收益。第三是撮合成本低、决策时间极短。代驾订单几乎没有预约提前量都是即时单从下单到接驾的等待窗口很短。调度算法必须快速完成推荐和分配不能用复杂的全局优化模型跑几秒钟工业上更常见的是局部贪心加规则修正。1.2 这个模拟系统做了哪些事整个模拟系统从零到一实现了四层逻辑数据模拟层生成城市网格地图、模拟司机位置和订单请求。需求预测层基于历史时段数据预测各网格的需求热度。调度决策层计算各网格的供需比给司机推荐目标区域。动态定价层根据实时供需比计算订单倍率同时兼顾司机收入和用户应答率。这套结构比较贴近真实线上系统——预测、调度、定价分层解耦每一层可以单独替换算法方便做 A/B 对比。后面我会按这个顺序逐层拆开讲。2. 资源调度算法让司机比订单更早到达热点区域资源调度在这类系统里的核心逻辑是不要等订单出现再派单而是根据预测提前把司机布置到未来需求密度高的地方。这个逻辑听起来简单落地时有两个问题要解决——需求怎么预测以及调度指令怎么变成司机行为的引导。2.1 需求预测基于时间片和区域网格的订单热度估计预测我采用了一个务实方案按 30 分钟一个时间片、500 米一个网格统计历史订单得到每个网格在每个时间片的“基础热度”然后叠加星期系数和天气系数修正。公式如下热度值 基础热度 × 星期系数 × 天气系数基础热度可以用历史均值也可以用加权移动平均。我对比过几种方式实际模拟里用最近 4 周同时间片订单量做指数加权平均效果最稳。核心代码如下import numpy as np import pandas as pd class DemandPredictor: def __init__(self, grid_size, time_slot_minutes30): self.grid_size grid_size self.time_slot_minutes time_slot_minutes # 存储每个网格每个时间片的历史订单量 self.history {} # 基础热度表 self.base_heat {} # 星期系数表周一至周日 self.weekday_factor {i: 1.0 for i in range(7)} # 天气系数 self.weather_factor {晴天: 1.0, 小雨: 1.15, 大雨: 0.7} def _time_slot_id(self, timestamp): minutes timestamp.hour * 60 timestamp.minute return minutes // self.time_slot_minutes def update_history(self, order): 在线更新历史订单数据用于滚动预测 slot_id self._time_slot_id(order[timestamp]) grid order[grid_id] key (grid, slot_id) self.history[key] self.history.get(key, 0) 1 # 保留最近30天的滚动窗口 self._clean_expired(order[timestamp]) def predict_heat(self, grid, timestamp, weather晴天): 预测某网格在指定时刻的热度值 slot_id self._time_slot_id(timestamp) key (grid, slot_id) base self.history.get(key, 0) # 加上星期和天气修正 heat base * self.weekday_factor[timestamp.weekday()] heat heat * self.weather_factor.get(weather, 1.0) return heat这里有一个容易忽略的坑如果直接用全部历史均值做预测周五深夜的预测值会被周中数据稀释导致热点区域调度不足。所以我引入了星期系数先修正再用天气系数微调。实际调参时星期系数不是拍脑袋定的而是统计各星期的日均订单量与全周均值的比值。2.2 热点区域推荐用供需比而不是单一热度做决策只预测需求还不够调度要看的指标是“供需比”——需求热度和当前司机密度之间的差值。一个区域订单多但司机已经扎堆了就不该再往那里调度反过来订单一般但司机极少反而是调度机会。我定义每个网格的供需比计算公式供需比 当前司机数 / 预测订单数 平滑系数比值越低说明该区域越缺司机调度优先级越高。平滑系数用于避免除零也避免在预测值极低时产生过度敏感的变化。调度系统给每个空闲司机推荐供需比最低的若干网格并把司机导航过去。核心逻辑class DispatchScheduler: def __init__(self, demand_predictor, grid_map): self.demand_predictor demand_predictor self.grid_map grid_map self.drivers {} self.orders [] def calculate_supply_demand_ratio(self, grid, current_drivers, timestamp, weather): predicted_demand self.demand_predictor.predict_heat(grid, timestamp, weather) ratio current_drivers / (predicted_demand 0.5) return ratio def recommend_hot_zones(self, timestamp, weather, top_k5): 为全城空闲司机推荐TopK热点区域 ratios {} for grid in self.grid_map.grids: current_drivers self.grid_map.driver_count(grid) ratios[grid] self.calculate_supply_demand_ratio( grid, current_drivers, timestamp, weather ) sorted_grids sorted(ratios.items(), keylambda x: x[1]) return [g for g, r in sorted_grids[:top_k]] def assign_driver_to_grid(self, driver, target_grid): 引导空闲司机前往目标网格记录预计到达时间 travel_time self.estimate_travel_time(driver[grid], target_grid) driver[target_grid] target_grid driver[eta] travel_time这套逻辑在模拟里表现不错但我也发现了它的局限它只考虑了网格当前的状态没有考虑调度之后的连锁变化。比如 10 个司机同时被推荐到同一个低供需比网格到达后这个网格立刻从“缺司机”变成“司机过剩”而周边的网格反而空掉。这个问题在真实系统里同样存在后面我在“常见问题”章节会展开讲怎么缓解。2.3 调度指令的宽容度设计模拟系统里调度指令可以直接下发给司机但真实代驾平台里司机是自由接单的调度更多是“推荐”而不是“命令”。所以我的模拟系统里也保留了司机接受意愿参数每个司机根据目标区域距离、预计收入、个人偏好决定是否接受调度建议。这里用逻辑回归模拟司机决策def driver_acceptance(self, driver, target_grid, estimated_income, distance_km): 司机接受调度建议的概率模型 # 距离惩罚项距离越远越不愿意去 distance_penalty max(0.0, 1.0 - distance_km / 8.0) # 收入激励项估测收入越高越愿意去 income_incentive min(1.0, estimated_income / 60.0) # 个人意愿系数 base_willingness driver[willingness] accept_prob 0.3 * base_willingness 0.3 * income_incentive 0.2 * distance_penalty # 加上随机扰动模拟个体差异 accept_prob np.clip(accept_prob np.random.normal(0, 0.05), 0.05, 0.98) return np.random.rand() accept_prob加入这个模块后模拟结果更接近真实情况——不是所有司机都会响应调度所以系统需要定期重新评估和推荐形成“评估—推荐—再评估”的循环。这个循环间隔我在模拟里设成 5 分钟一次太长会导致状态滞后太短会产生大量无效推荐请求。3. 动态定价用价格杠杆撬动供需平衡动态定价是共享经济系统里争议最大、也是算法最有发挥空间的部分。代驾场景下定价直接影响三拨人的利益用户在意价格是否合理司机在意收入是否足够吸引出车平台在意订单量和收入的平衡。三者利益不能同时最大化动态定价的目标是在约束条件下找到一个可持续的平衡点。3.1 代驾动态定价和网约车溢价的核心差异网约车溢价的经典做法是“供需比超过阈值就加价”这个逻辑直接搬到代驾会出问题。代驾订单集中在深夜价格弹性很高——普通用户凌晨叫代驾如果价格是白天的 2 倍以上会有一部分人选择把车留在原地明天再取。所以代驾动态定价不能只看供需比还要估算价格对订单量的抑制效应否则会出现涨价后订单量暴跌、司机空等、收入反而下降的恶性循环。我用的模型是这样基准价 × 动态倍率其中动态倍率由两部分组成——供需紧迫程度和价格弹性修正。供需紧迫程度提价价格弹性修正则防止过度提价。3.2 动态倍率的计算实现动态倍率的核心公式倍率 基础倍率(供需比) × 弹性修正系数(当前价格敏感度)基础倍率函数选用分段线性函数——供需比低于阈值时倍率缓缓上升高于阈值时加速上升。弹性修正系数根据最近的“价格上升→订单量变化”回归得出。代码如下class DynamicPricing: def __init__(self, base_fare_range(20, 40), max_multiplier2.5): self.base_fare_range base_fare_range self.max_multiplier max_multiplier self.price_elasticity 0.3 # 默认价格弹性 self.recall_history [] # 用于估计实时价格弹性 def _base_multiplier(self, supply_demand_ratio): 供需比 - 基础倍率的分段函数 if supply_demand_ratio 3.0: # 供给充足不涨价 return 1.0 elif supply_demand_ratio 1.0: # 供需紧张线性上涨 return 1.0 (3.0 - supply_demand_ratio) * 0.25 else: # 严重缺车加速上涨并封顶 return min(1.0 (3.0 - supply_demand_ratio) * 0.4, self.max_multiplier) def _elasticity_adjust(self, multiplier): 价格弹性修正避免提价过猛导致订单量崩塌 # 弹性越大修正后的倍率越低 adjusted 1.0 (multiplier - 1.0) * (1.0 - self.price_elasticity) return max(1.0, adjusted) def get_final_multiplier(self, supply_demand_ratio): base self._base_multiplier(supply_demand_ratio) final self._elasticity_adjust(base) return round(min(final, self.max_multiplier), 2) def estimate_price(self, base_distance_km, supply_demand_ratio, time_night_factor1.0): multiplier self.get_final_multiplier(supply_demand_ratio) base_fare self.base_fare_range[0] base_distance_km * 3.5 price base_fare * multiplier * time_night_factor return round(price, 1), multiplier这段代码里最值得注意的就是_elasticity_adjust。如果不加这个修正供需比低到一定程度时倍率会冲到 2.5模拟里订单量直接掉了 40%司机虽然单价高了但空驶时间也长了单位小时收入反而下降。加入弹性修正后倍率被压到 1.6 左右订单量只掉 15%司机单位小时收入是上升的。这个现象在真实代驾市场也出现过——高倍率不一定带来高收益取决于用户的价格敏感度。3.3 实时价格弹性的估算方法价格弹性不能拍脑袋固定要随着市场状态变化。我在系统里维护了一个滑动窗口每 30 分钟记录一次“平均倍率变化”和“订单量变化率”用最小二乘法拟合出当前的弹性系数。def update_elasticity(self): 利用最近的价格变化和订单量变化率在线估算弹性系数 if len(self.recall_history) 6: return # 取最近6个时间窗的数据 window self.recall_history[-6:] price_changes np.array([w[price_change] for w in window]) order_changes np.array([w[order_change] for w in window]) # 订单量变化率 / 价格变化率的线性拟合 slope, intercept np.polyfit(price_changes, order_changes, 1) # 弹性定义为负的斜率比例数值越大越敏感 self.price_elasticity np.clip(-slope, 0.05, 1.0)这个在线估算不是精确的计量经济学模型但对模拟场景足够了。真正的难点在于数据质量深夜时段的订单量本身波动就大短窗口拟合出来的弹性噪声很高。我试过 4 个时间窗结果弹性系数跳得厉害倍率一会高一会低用户感知很差改成 8 个时间窗后曲线平滑很多但响应速度又变慢了。最后折中用了 6 个时间窗。提示动态定价的更新频率不要跟调度推荐循环一样设成 5 分钟。定价变化太频繁会让人产生“平台杀熟”的观感也容易引发用户投诉。模拟里定价模块是 15 分钟更新一次调度是 5 分钟一次两者解耦运行。4. 核心代码实现把调度和定价串成一个闭环前面分模块讲了很多但代码是拆开的。真实模拟项目必须把预测、调度、定价、订单撮合串到一起才能看到系统整体行为。这一节我把项目的整体结构和主循环逻辑完整写一遍你可以直接跑起来看效果。4.1 项目结构与数据模拟模块项目文件结构如下ride_dispatch_sim/ ├── main.py # 主循环串起所有模块 ├── demand_predictor.py # 需求预测 ├── dispatch_scheduler.py # 调度推荐 ├── dynamic_pricing.py # 动态定价 ├── grid_map.py # 城市网格地图 ├── data_simulator.py # 订单和司机行为模拟 └── config.py # 全局参数配置数据模拟模块是基础它生成两类主体司机和订单。司机有属性当前位置网格、状态空闲/接单中/前往上车点、出车意愿、接单偏好。订单有属性下单时间、起始网格、终点网格、预估里程、期望等待时间。class GridMap: def __init__(self, rows20, cols20): self.rows rows self.cols cols self.grids [(r, c) for r in range(rows) for c in range(cols)] # 每个网格当前的司机数 self.driver_positions {} self.order_positions {} def driver_count(self, grid): return self.driver_positions.get(grid, 0) def move_driver(self, driver_id, from_grid, to_grid): self.driver_positions[from_grid] self.driver_positions.get(from_grid, 0) - 1 self.driver_positions[to_grid] self.driver_positions.get(to_grid, 0) 1 class Driver: def __init__(self, driver_id, grid, statusidle, willingness0.7): self.id driver_id self.grid grid self.status status self.willingness willingness self.total_income 0.0 self.total_orders 0 class Order: def __init__(self, order_id, timestamp, start_grid, end_grid, distance_km): self.id order_id self.timestamp timestamp self.start_grid start_grid self.end_grid end_grid self.distance_km distance_km self.status pending # pending - accepted - completed数据模拟器的核心是生成“符合代驾特征”的订单分布——夜间时段集中、商圈网格热度高、周末系数大。这一步如果造假数据后面算法调参全都会失真。我专门写了一组概率分布函数模拟不同网格的热度差异。4.2 主循环订单撮合与模块联动主循环的伪代码逻辑如下推进时间步每步 5 分钟模拟真实时钟。模拟器生成新订单写入待处理队列。对每个待处理订单计算所在网格的供需比调用定价模块算出预估价格和倍率。在附近空闲司机中按距离和司机意愿匹配若匹配成功则订单进入“接驾中”司机状态更新。对所有空闲司机调用调度模块给出推荐网格司机按意愿移动。每 15 分钟更新一次定价弹性系数和星期系数。import random from config import Config class RideDispatchSimulator: def __init__(self, config): self.config config self.map GridMap(config.grid_rows, config.grid_cols) self.predictor DemandPredictor(config.grid_size, config.time_slot_minutes) self.scheduler DispatchScheduler(self.predictor, self.map) self.pricing DynamicPricing() self.drivers [] self.orders [] self.time_minute 0 def run_step(self): 推进一次模拟返回本次的统计指标 self.time_minute self.config.step_minutes timestamp self._build_timestamp() # 1. 生成新订单 new_orders self._simulate_new_orders(timestamp) self.orders.extend(new_orders) # 2. 订单撮合 matched_count 0 for order in list(self.orders): if order.status ! pending: continue multiplier self.pricing.get_final_multiplier( self._current_ratio(order.start_grid) ) order.estimated_price order.distance_km * 3.5 * multiplier driver self._match_driver(order) if driver: self._assign_order(order, driver) matched_count 1 # 3. 空闲司机调度 self._dispatch_idle_drivers(timestamp) # 4. 定期更新定价弹性 if self.time_minute % 15 0: self.pricing.update_elasticity() return { new_orders: len(new_orders), matched_count: matched_count, avg_multiplier: self.pricing.get_final_multiplier(self._average_ratio()), avg_wait_time: self._average_wait_time(), } def _match_driver(self, order): 在订单附近找出最合适的空闲司机考虑距离和意愿 candidates [] for d in self.drivers: if d.status ! idle: continue distance self._grid_distance(d.grid, order.start_grid) if distance self.config.match_radius_grids: candidates.append((d, distance)) if not candidates: return None candidates.sort(keylambda x: x[1]) for d, dist in candidates: accept_prob self._driver_acceptance(d, dist, order.estimated_price) if random.random() accept_prob: return d return NoneConfig里我放了一批初始参数后面调参大多就是改这个文件。关键的几个参数是match_radius_grids匹配半径、step_minutes步长、max_multiplier最大倍率、smooth_factor供需比平滑系数。初始值我用的是匹配半径 3 个网格步长 5 分钟最大倍率 2.5平滑系数 0.5。4.3 模拟输出与效果指标模拟结束之后不能只看“订单有没有被接”要看几个核心业务指标应答率被接订单占全部订单的比例代驾场景目标值通常在 85% 以上。平均接驾等待时间用户下单到司机到达的时间优质体验阈值一般在 10 分钟以内。司机单位小时收入衡量调度和定价是否让司机赚到钱低于当地代驾司机的心理预期时司机流失会非常快。平台毛利抽取佣金后的净收入用来判断定价策略的可持续性。我在模拟 30 天后拿到了第一版完整数据应答率 82%平均等待 8.5 分钟司机小时收入 42 元平台毛利 18 万元。后来调整了调度推荐权重和定价弹性系数之后应答率提升到 89%等待时间降到 6.9 分钟司机小时收入提升到 51 元平台毛利反而因为订单量上升增长到 24 万元。这个结果再次验证了那个结论动态定价不是一味涨价而是找到让三方都可持续的价格点。5. 实操过程中的常见问题与排查记录模拟系统跑了三个多月中间踩了不少坑。这些问题如果只看算法理论是碰不到的我把它们整理成一张排查表对应真实的运营和开发场景也有参考价值。5.1 冷启动问题历史数据不足时预测失灵模拟项目之初历史订单数据是仿真生成的不存在冷启动问题。但我用真实脱敏数据测试时发现新网格没有历史订单预测热度为 0导致调度永远不推荐新网格形成“没司机→没订单→更没司机”的恶性循环。解决思路有两个一是使用邻域热度代替一个网格没数据就用周围 8 个网格的平均热度做先验二是设置最小调度流量每轮强制分配少量司机去低热度新区域探索。模拟里我选了前者因为更接近真实平台的地域扩张策略——新区域先用邻近商圈热度做冷启动预估。def predict_heat_with_neighbor(self, grid, timestamp, weather, initial_orders3): 带邻域平滑的预测解决冷启动 direct_heat self.predict_heat(grid, timestamp, weather) if direct_heat 0: return direct_heat # 无历史数据用相邻网格平均热度 最小基数 neighbors self._get_neighbor_grids(grid) neighbor_heats [self.predict_heat(g, timestamp, weather) for g in neighbors] neighbor_avg np.mean(neighbor_heats) if neighbor_heats else 0 return neighbor_avg initial_orders加了这个逻辑之后冷启动网格的订单覆盖率在第二轮模拟中从 12% 提升到了 43%效果非常明显。5.2 调度震荡司机集体冲向同一个热点区域这个问题前面提过当调度推荐没有考虑“其他司机也会响应”时会出现羊群效应。10 个司机同时收到同一个热点网格的推荐过去之后网格从缺司机变成司机过剩供需比从 0.2 跳到 4.0引发下一轮调度把这些司机再疏散到别的网格形成震荡。我的解决办法是给推荐加一个信息扰动——不再给所有司机返回同一个排序结果而是基于司机当前位置和到达时间做差异化推荐。距离热点 A 近的司机推荐去 A距离热点 B 近的司机推荐去 B。此外在推荐排序时扣除“正在前往该网格的司机数”让供需比是一个前瞻性的值而不是当前静态值。def recommend_hot_zones_with_anticipation(self, timestamp, weather, top_k5): 前瞻性调度推荐扣除在途司机影响防止羊群效应 ratios {} for grid in self.map.grids: # 当前司机数 在途司机数正在赶来但未到达 current_drivers self.map.driver_count(grid) incoming_drivers self._count_incoming_drivers(grid) effective_drivers current_drivers incoming_drivers predicted_demand self.predictor.predict_heat(grid, timestamp, weather) ratios[grid] effective_drivers / (predicted_demand 0.5) sorted_grids sorted(ratios.items(), keylambda x: x[1]) return [g for g, r in sorted_grids[:top_k]]这个修复加上去以后模拟里的调度震荡幅度明显降低司机平均空驶里程下降了近三分之一。5.3 定价与调度不同步导致的“价格倒挂”还有一个很有意思的问题出现在定价模块和调度模块解耦运行之后。定价 15 分钟更新一次调度 5 分钟更新一次理论上没问题但当调度在 5 分钟节点拉了一批司机进入某个网格后这个网格供需比改善但定价还没重算仍然维持着高倍率。用户看到的是一边大量司机涌入、一边价格依然高企非常破坏信任感。排查后发现是时间步错位的问题。我的解决方案是让定价模块在每次调度完成之后做一次“轻量级价格校验”如果某网格的供需比变化超过 0.5就立即触发定价重算而不是等到 15 分钟的定时节点。这个做法相当于给解耦系统加了一个事件驱动的修正机制既保留了定时更新的稳定性又能及时响应突发变化。5.4 问题排查速查表常见问题可能原因排查思路解决方案应答率长期低于80%司机密度不足或匹配半径过小观察各网格供需比分布扩大匹配半径加大热点调度力度司机收入波动大倍率震荡或调度震荡检查倍率序列和调度序列的相关性加平滑系数降低定价更新频率新区域订单量极低冷启动数据缺失检查预测热度是否为0使用邻域热度和最小基数高峰期用户投诉价格过高价格弹性系数未更新查看弹性拟合曲线增加弹性估算的时间窗长度调度推荐无人响应推荐距离过远或收益预估偏低检查司机接受率日志调整距离惩罚系数和收入激励权重排查这些问题时我最大的体会是模拟日志必须记录每一次调度推荐和定价计算的中间值不要只记最终结果。没有中间值问题出现时你只能靠猜。我在项目里给调度和定价模块都加了 debug 级别的日志输出后面定位问题基本全靠这些日志。6. 从模拟走向生产算法之外的几个现实课题模拟做到最后其实算法本身的挑战已经不算最大的了真正难的是把算法放进真实场景时那些不可控的因素。我梳理了几个在真实代驾平台上一定会遇到的课题供大家参考。第一是人性的不可控性。模拟里司机会按照接受意愿响应调度但真实司机的行为更加复杂——他们会挑单、会扎堆休息、会看天气决定不出车。调度的推荐再完美司机不响应也没有用。所以真实系统的调度模块往往要跟司机端的奖励机制联动比如去冷门区域调度给额外奖励这个在模拟里很难完全还原。第二是定价监管和用户感知。动态定价可以随时调但平台对价格调整的幅度和频率都有很强的外部约束。折扣、优惠券、会员权益也会扭曲价格弹性的计算。模拟中的价格弹性拟合在真实环境里会因为各类补贴活动而失效需要做更复杂的因果推断而不是简单回归。第三是地图和路况的粒度。模拟用网格距离估算调度和接驾时间真实系统里同样距离的两段路拥堵程度可能差三倍以上。调度系统如果要做到精确实时需要接入实时路况数据按 ETA 而不是直线距离做匹配。这会让算法从“网格级”下沉到“道路级”复杂度上升一个量级。从我的角度看这个模拟项目的价值不在于代码本身而在于把共享经济系统的核心矛盾——“供给和需求的时空错配”用代码完整地呈现了一遍。你在模拟里调整一个参数看到应答率、收入、毛利这些指标的变化会比读十篇论文都更直观地理解动态定价和调度的关系。如果后续要扩展我建议优先做三件事一是把 K 近邻聚类引入热点识别替代固定网格的热度统计二是用强化学习训练定价策略替代分段函数倍率三是加入多平台竞争模拟看不同平台的定价和调度策略互相影响时系统会怎么演化。希望这篇拆解对你有用也欢迎把你自己跑出来的数据分享出来一起交流。
阅读完成 · 觉得有帮助?