网络优化器 network-optimizer

网络优化器是一个专业的运筹学技能,专门解决图结构上的网络优化问题。它提供多种算法实现,包括最短路径计算(Dijkstra、Bellman-Ford、Floyd-Warshall)、最小生成树生成、最大流最小割分析、最小成本网络流建模、匈牙利算法解决分配问题、网络单纯形法以及多商品流建模。该技能适用于物流运输路径优化、资源分配、网络流量分析、供应链管理等多种场景,帮助用户高效解决复杂的网络优化问题。关键词:网络优化、图算法、最短路径、最大流、最小生成树、分配问题、运筹学、物流优化、网络建模、算法实现

运筹学 0 次安装 0 次浏览 更新于 2/25/2026

name: 网络优化器 description: 用于解决图结构上的运输、分配和流问题的网络优化技能。 allowed-tools: Bash(*) Read Write Edit Glob Grep WebFetch metadata: author: babysitter-sdk version: “1.0.0” category: 运筹学 backlog-id: SK-IE-003

网络优化器

您是网络优化器 - 专门解决网络优化问题的技能,包括最短路径、最小生成树、最大流和分配问题。

概述

本技能支持AI驱动的网络优化,包括:

  • 最短路径算法选择(Dijkstra、Bellman-Ford、Floyd-Warshall)
  • 最小生成树生成
  • 最大流/最小割分析
  • 最小成本网络流建模
  • 分配问题求解(匈牙利算法)
  • 网络单纯形法实现
  • 多商品流建模

前提条件

  • Python 3.8+ 并安装NetworkX
  • 用于高级问题的Google OR-Tools
  • 图论基础知识

能力

1. 最短路径算法

import networkx as nx

def shortest_path_analysis(G, source, target):
    """
    选择并应用合适的最短路径算法
    """
    # 检查负权重
    has_negative = any(d.get('weight', 1) < 0
                       for u, v, d in G.edges(data=True))

    if not has_negative:
        # 非负权重使用Dijkstra
        path = nx.dijkstra_path(G, source, target)
        length = nx.dijkstra_path_length(G, source, target)
    else:
        # 负权重使用Bellman-Ford
        path = nx.bellman_ford_path(G, source, target)
        length = nx.bellman_ford_path_length(G, source, target)

    return {
        "path": path,
        "length": length,
        "algorithm": "dijkstra" if not has_negative else "bellman_ford"
    }

# 全对最短路径
def all_pairs_shortest_paths(G):
    # 稠密图使用Floyd-Warshall
    if G.number_of_edges() > G.number_of_nodes()**2 / 4:
        return dict(nx.floyd_warshall(G))
    else:
        # 稀疏图使用Johnson
        return dict(nx.johnson(G))

2. 最小生成树

def minimum_spanning_tree(G, algorithm='kruskal'):
    """
    生成最小生成树
    """
    if algorithm == 'kruskal':
        mst = nx.minimum_spanning_tree(G, algorithm='kruskal')
    elif algorithm == 'prim':
        mst = nx.minimum_spanning_tree(G, algorithm='prim')

    total_weight = sum(d['weight'] for u, v, d in mst.edges(data=True))

    return {
        "tree": mst,
        "total_weight": total_weight,
        "edges": list(mst.edges(data=True))
    }

3. 最大流/最小割

def max_flow_min_cut(G, source, sink):
    """
    计算最大流和最小割
    """
    # 最大流
    flow_value, flow_dict = nx.maximum_flow(G, source, sink)

    # 最小割
    cut_value, partition = nx.minimum_cut(G, source, sink)

    # 识别割边
    reachable, non_reachable = partition
    cut_edges = [(u, v) for u in reachable for v in G[u]
                 if v in non_reachable]

    return {
        "max_flow": flow_value,
        "flow_dict": flow_dict,
        "min_cut_value": cut_value,
        "cut_edges": cut_edges,
        "source_side": list(reachable),
        "sink_side": list(non_reachable)
    }

4. 最小成本流

from ortools.graph.python import min_cost_flow

def min_cost_flow_problem(nodes, arcs):
    """
    解决最小成本网络流问题
    """
    smcf = min_cost_flow.SimpleMinCostFlow()

    # 添加弧:(起点, 终点, 容量, 单位成本)
    for start, end, capacity, cost in arcs:
        smcf.add_arc_with_capacity_and_unit_cost(
            start, end, capacity, cost
        )

    # 设置供应/需求
    for node, supply in nodes.items():
        smcf.set_node_supply(node, supply)

    status = smcf.solve()

    if status == smcf.OPTIMAL:
        result = {
            "status": "optimal",
            "total_cost": smcf.optimal_cost(),
            "flows": []
        }
        for i in range(smcf.num_arcs()):
            if smcf.flow(i) > 0:
                result["flows"].append({
                    "from": smcf.tail(i),
                    "to": smcf.head(i),
                    "flow": smcf.flow(i),
                    "cost": smcf.flow(i) * smcf.unit_cost(i)
                })
        return result

    return {"status": "infeasible"}

5. 分配问题(匈牙利算法)

from scipy.optimize import linear_sum_assignment

def assignment_problem(cost_matrix):
    """
    使用匈牙利算法解决分配问题
    """
    row_ind, col_ind = linear_sum_assignment(cost_matrix)

    total_cost = cost_matrix[row_ind, col_ind].sum()

    assignments = list(zip(row_ind.tolist(), col_ind.tolist()))

    return {
        "total_cost": total_cost,
        "assignments": assignments,
        "assignment_costs": cost_matrix[row_ind, col_ind].tolist()
    }

6. 多商品流

def multi_commodity_flow(G, commodities):
    """
    多商品流问题建模
    commodities: (源点, 汇点, 需求)列表
    """
    from ortools.linear_solver import pywraplp

    solver = pywraplp.Solver.CreateSolver('GLOP')

    # 每条边上每个商品的流变量
    flows = {}
    for k, (s, t, d) in enumerate(commodities):
        for u, v in G.edges():
            flows[k, u, v] = solver.NumVar(0, G[u][v]['capacity'],
                                           f'f_{k}_{u}_{v}')

    # 流量守恒
    for k, (s, t, d) in enumerate(commodities):
        for node in G.nodes():
            inflow = sum(flows[k, u, node] for u in G.predecessors(node))
            outflow = sum(flows[k, node, v] for v in G.successors(node))

            if node == s:
                solver.Add(outflow - inflow == d)
            elif node == t:
                solver.Add(inflow - outflow == d)
            else:
                solver.Add(inflow == outflow)

    # 容量约束(共享)
    for u, v in G.edges():
        solver.Add(sum(flows[k, u, v] for k in range(len(commodities)))
                  <= G[u][v]['capacity'])

    # 最小化总成本
    solver.Minimize(sum(
        flows[k, u, v] * G[u][v].get('cost', 1)
        for k in range(len(commodities))
        for u, v in G.edges()
    ))

    solver.Solve()
    return solver

流程集成

本技能与以下流程集成:

  • transportation-route-optimization.js
  • warehouse-layout-slotting-optimization.js
  • capacity-planning-analysis.js

输出格式

{
  "problem_type": "max_flow",
  "status": "optimal",
  "objective": 23.0,
  "solution": {
    "flow_paths": [
      {"path": ["s", "a", "b", "t"], "flow": 10},
      {"path": ["s", "c", "t"], "flow": 13}
    ]
  },
  "analysis": {
    "bottleneck_edges": [["a", "b"], ["c", "t"]],
    "recommendations": ["增加边(a,b)的容量"]
  }
}

工具/库

描述 使用场景
NetworkX 图分析 通用网络
OR-Tools 最小成本流 大规模问题
igraph 快速算法 性能要求高
SciPy 分配问题 匈牙利方法

最佳实践

  1. 选择合适的算法 - 根据问题结构匹配算法
  2. 处理不可行性 - 检查不连通组件
  3. 缩放权重 - 避免数值问题
  4. 可视化网络 - 辅助调试和沟通
  5. 测试边界情况 - 空图、单节点等

约束

  • 求解前验证网络连通性
  • 记录所有边权重和容量
  • 适当处理负环
  • 清晰报告不可行情况