You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PuLP的拼车系统最小化驾驶距离代码TypeError问题排查

离线拼车匹配模型错误排查:TypeError: must be real number, not dict

错误根源

触发TypeError的核心原因是**dvsr_ver字典的结构错误**:
代码中定义dvsr_ver[rider] = {'shortest_distance': shortest_distance},将乘客的最短距离存储为嵌套字典,但在目标函数中直接调用dvsr_ver[r]时,取到的是字典对象而非数值,导致PuLP在构建线性目标时无法识别类型。

关键代码修正

1. 修正dvsr_ver的存储结构

将原本的嵌套字典改为直接存储数值:

dvsr_ver = {}
for rider in R:
    start_location = vsr[rider]
    end_location = ver[rider]
    shortest_distance = dv_v_prime[(start_location, end_location)]
    dvsr_ver[rider] = shortest_distance  # 直接存储距离数值,而非字典

2. 修正目标函数

去掉冗余的.get()调用,直接使用数值,同时补充缺失的乘客遍历:

# 目标函数:最小化总驾驶距离
prob += lpSum([yd_r[d, r] * dvsr_ver[r] for d in D for r in R]) + lpSum((1 - z_r[r]) * dvsr_ver[r] for r in R)

其他潜在代码问题修正

1. 修正predπd_v的前驱映射结构

原代码中predπd_v存储为司机对应的地点列表,无法正确映射每个地点的前驱,需改为司机-地点的键值对:

predπd_v = {d: {} for d in D}
for d in πd:
    path = πd[d]
    for i in range(1, len(path)):
        current_loc = path[i]
        pred_loc = path[i-1]
        predπd_v[d][current_loc] = pred_loc

对应的约束条件需同步修改:

for d in D:
    for v in V:
        if v in predπd_v[d]:  # 判断当前地点是否属于司机路线的非起点位置
            prob += od_v[d, v] == od_v[d, predπd_v[d][v]] + lpSum(yd_r[d, r] * num_people[r] for r in startsπd_v[d][v]) - lpSum(yd_r[d, r] * num_people[r] for r in endsπd_v[d][v])

2. 删除无效的d == r判断

原代码中if d == r:的逻辑完全不成立(司机和乘客ID无交集),导致时间窗约束从未生效,调整为合理判断:

for d in D:
    for v in V:
        # 保留其他约束...
        for r in R:
            # 仅当乘客的起止点在司机路线上时,添加时间窗约束
            if vsr[r] in πd[d] and ver[r] in πd[d]:
                prob += yd_r[d, r] * etr[r] <= td_v[d, vsr[r]]
                prob += M - td_v[d, ver[r]] >= (M - ltr[r]) * yd_r[d, r]

3. 修正时间窗冲突约束

原代码中嵌套四层循环的约束逻辑冗余,改为直接对每个司机-乘客对判断时间窗冲突:

for d in D:
    for r in R:
        if etr[r] < etd[d] or ltr[r] > ltd[d]:
            prob += yd_r[d, r] == 0

4. 修正司机路线时间约束

原代码中stv_v_prime的调用逻辑错误,需使用司机路线中的地点对:

for d in D:
    for i in range(len(πd[d])-1):
        loc_prev = πd[d][i]
        loc_curr = πd[d][i+1]
        prob += td_v[d, loc_curr] >= td_v[d, loc_prev] + stv_v_prime[(loc_prev, loc_curr)]

来源标注

内容的提问来源于stack exchange,提问作者roya razaghi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:12:32