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

交通流优化技术问询:追踪源到汇的车辆完整路径流量

交通流优化问题与解决方案建议

路网定义

节点类型规则

  • 圆形节点(如A、B):边界源/汇节点,单个节点无需满足流入=流出,仅需全网流入总量等于流出总量。
  • i/n开头节点:中间节点,流入边车辆总和必须等于流出边车辆总和。
  • Z开头节点:内部源/汇节点,可按需生成或终止车辆以满足流量约束。

边约束规则

  • 黑色边:严格流量约束,如A-Z1边流量必须等于S292_1。
  • 绿色边:无约束,流量可为0。
  • 蓝色边:流量≥A1。

现有实现代码

import networkx as nx
import json
from gurobipy import Model, GRB

M = 1000

def load_graph_from_graphml(file_path):
    return nx.read_graphml(file_path)

def load_constraints_from_json(json_path):
    with open(json_path, "r") as f:
        return json.load(f)

def optimize_vehicle_flow(graph, constraints):
    model = Model("Traffic Flow Optimization")

    flow = {}
    for u, v, data in graph.edges(data=True):
        edge_label = data.get("label", f"{u}_{v}")
        flow[(u, v)] = model.addVar(name=f"flow_{u}_{v}", vtype=GRB.CONTINUOUS, lb=0)

        if edge_label in constraints:
            model.addConstr(flow[(u, v)] == constraints[edge_label], name=f"constraint_{edge_label}")
        # 补充蓝色边的流量下限约束(需根据实际边标识调整判断逻辑)
        if edge_label == "蓝色边标识":
            model.addConstr(flow[(u, v)] >= constraints["A1"], name=f"blue_edge_lower_{edge_label}")

    model.update()

    for node, data in graph.nodes(data=True):
        node_label = data.get("label", node)
        incoming = sum(flow[(u, node)] for u in graph.predecessors(node) if (u, node) in flow)
        outgoing = sum(flow[(node, v)] for v in graph.successors(node) if (node, v) in flow)

        if "Z" in node_label:
            model.addConstr(incoming - outgoing >= -M, name=f"flow_balance_{node_label}_lower")
            model.addConstr(incoming - outgoing <= M, name=f"flow_balance_{node_label}_upper")
        elif "n" in node_label or "i" in node_label:  # 补充i开头节点的流量守恒约束
            model.addConstr(incoming == outgoing, name=f"flow_conservation_{node_label}")

    # 修复原代码中的缩进错误
    model.setObjective(sum(flow.values()), GRB.MINIMIZE)
    model.optimize()

    if model.status == GRB.OPTIMAL:
        node_label_map = {node: data.get("label", node) for node, data in graph.nodes(data=True)}
        result = {(node_label_map[u], node_label_map[v]): var.x for (u, v), var in flow.items()}
        return result
    else:
        print(f"模型未找到最优解。状态: {model.status}")
        model.write("model.ilp")
        return None

graphml_file = "myNetwork.graphml"
json_file = "constraints.json"

graph = load_graph_from_graphml(graphml_file)
constraints = load_constraints_from_json(json_file)

result = optimize_vehicle_flow(graph, constraints)
print(result)

注:原代码存在三处问题:1. 未处理i开头节点的流量守恒约束;2. 函数内部存在错误缩进的递归调用和打印语句;3. 未实现蓝色边的流量下限约束,已针对性修复。

约束JSON文件结构

{
    "S292_1": 452,
    "S292_2": 590,
    "V1": 471,
    "A1": 100,
    ...
}

当前问题与需求

当前输出仅能看到单条边的总流量,无法区分流量的来源与去向:

  • 例如输出('A', 'Z1'): 452.0和('Z1', 'i3'): 471.0时,无法得知452辆从A到Z1的车中有多少继续流向其他节点、多少在Z1终止;也无法知道Z1到i3的471辆车中,多少来自A、多少是Z1新增的。

需要获取每个源节点到汇节点的最终流量分布,比如A出发的452辆车分别有多少到达C、D等汇节点,多少在Z1终止。

解决方案建议

方案1:调整优化模型,使用多商品流追踪来源

在模型中为每个源节点(边界源+内部源Z节点)单独定义流量变量,追踪每个源出发的车辆在路网中的路径:

  1. 识别所有源节点:边界源(A、B等)和Z节点。
  2. 对每个源s,定义边流量变量flow_s[(u, v)],代表从s出发经过u->v的车辆数。
  3. 为每个源s添加流量守恒约束:
    • 对源节点s:所有流出边的flow_s总和等于该源的总输出(边界源由约束确定,Z节点可自由生成)。
    • 对中间节点(i/n开头):流入边的flow_s总和等于流出边的flow_s总和。
    • 对汇节点:流入边的flow_s总和即为s到该汇的流量。
  4. 原边总流量约束:所有源的flow_s[(u, v)]之和等于原flow[(u, v)],并保留原边的约束规则。
  5. 优化目标可保持总流量最小,或根据需求调整。

这种方案能直接得到每个源到汇的流量分布,但模型变量和约束数量会增加,适合路网规模不大的场景。

方案2:优化后进行流量分解计算

在现有单商品流优化结果的基础上,通过线性规划或路径枚举计算每个源的流量去向:

  1. 基于优化得到的边总流量,构建流量分解模型:对每条边的流量,分解为来自不同源的分量。
  2. 对每个源s,添加流量守恒约束(同方案1的规则)。
  3. 求解分解模型,得到每个源在各条边上的流量分量,进而统计源到汇的流量。

这种方案无需修改原优化模型,适合已经有最优总流量结果的场景,可作为后续分析步骤。

补充优化建议

  • Z节点的流量平衡可改用更清晰的变量定义:引入generation_s(Z节点生成的车辆数)和termination_s(Z节点终止的车辆数),约束为incoming + generation = outgoing + termination,其中generation ≥0、termination ≥0,能直观追踪Z节点的车辆生成/终止数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:44:52