交通流优化技术问询:追踪源到汇的车辆完整路径流量
交通流优化问题与解决方案建议
路网定义
节点类型规则
- 圆形节点(如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节点)单独定义流量变量,追踪每个源出发的车辆在路网中的路径:
- 识别所有源节点:边界源(A、B等)和Z节点。
- 对每个源
s,定义边流量变量flow_s[(u, v)],代表从s出发经过u->v的车辆数。 - 为每个源
s添加流量守恒约束:- 对源节点
s:所有流出边的flow_s总和等于该源的总输出(边界源由约束确定,Z节点可自由生成)。 - 对中间节点(i/n开头):流入边的
flow_s总和等于流出边的flow_s总和。 - 对汇节点:流入边的
flow_s总和即为s到该汇的流量。
- 对源节点
- 原边总流量约束:所有源的
flow_s[(u, v)]之和等于原flow[(u, v)],并保留原边的约束规则。 - 优化目标可保持总流量最小,或根据需求调整。
这种方案能直接得到每个源到汇的流量分布,但模型变量和约束数量会增加,适合路网规模不大的场景。
方案2:优化后进行流量分解计算
在现有单商品流优化结果的基础上,通过线性规划或路径枚举计算每个源的流量去向:
- 基于优化得到的边总流量,构建流量分解模型:对每条边的流量,分解为来自不同源的分量。
- 对每个源
s,添加流量守恒约束(同方案1的规则)。 - 求解分解模型,得到每个源在各条边上的流量分量,进而统计源到汇的流量。
这种方案无需修改原优化模型,适合已经有最优总流量结果的场景,可作为后续分析步骤。
补充优化建议
- Z节点的流量平衡可改用更清晰的变量定义:引入
generation_s(Z节点生成的车辆数)和termination_s(Z节点终止的车辆数),约束为incoming + generation = outgoing + termination,其中generation ≥0、termination ≥0,能直观追踪Z节点的车辆生成/终止数量。
内容的提问来源于stack exchange,提问作者Deffo
相关产品推荐
相关产品推荐

