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

使用Scipy线性优化失败:网络吞吐量最大化问题求助

线性优化(最大化网络吞吐量)实现问题修复

问题背景

首次使用Python结合Scipy实现线性优化以最大化网络吞吐量,现有全局nodes列表,每个myNode对象包含estimated_throughput属性,将优化问题中的m*h^(-1)[PDR]简化为8*0.5,编写optimization类后调用报错:

c = np.array(c, dtype=np.float64, copy=True).squeeze() TypeError: float() argument must be a string or a real number, not 'myNode'

报错核心原因

  1. 参数类型错误:调用linprog时传入c=self.nodes,但linprog要求c是数值型数组(目标函数系数),不能直接传入myNode对象列表。
  2. 目标函数方向错误:linprog默认执行最小化,但需求是最大化吞吐量,未做符号转换。
  3. 约束条件构造错误:A_ub参数传入格式不符合要求,且未正确声明0/1变量的约束。

修正方案与代码

关键修正点

  • 目标函数:将最大化sum(d_i * estimated_throughput_i)转换为最小化-sum(d_i * estimated_throughput_i),对应c为-np.array(estimated_throughput_list)。
  • 约束条件:构造正确的约束矩阵A_ub,表示所选节点的吞吐量总和不超过8*0.5=4。
  • 变量约束:通过bounds限制变量为0-1,并用integrality声明变量为整数(实现二进制选择)。
  • 方法选择:使用支持整数规划的method='highs'(Scipy版本需≥1.9.0)。

完整修正代码

import numpy as np
from scipy.optimize import linprog

class Optimization():
    def __init__(self, nodes):
        self.nodes = nodes
        # 提取所有节点的吞吐量数值列表
        self.throughputs = np.array([node.estimated_throughput for node in nodes])
        self.num_nodes = len(self.nodes)

    def solve(self):
        # 目标函数:最大化sum(d_i * throughput_i) → 转换为最小化sum(-d_i * throughput_i)
        c = -self.throughputs
        
        # 约束条件:sum(d_i * throughput_i) ≤ 8*0.5=4
        A_ub = [self.throughputs]
        b_ub = [8 * 0.5]
        
        # 每个变量d_i的范围:0或1
        bounds = [(0, 1)] * self.num_nodes
        
        # 声明所有变量为整数(0/1二进制变量)
        integrality = np.ones(self.num_nodes)
        
        # 调用linprog求解,使用支持整数规划的highs方法
        result = linprog(
            c=c,
            A_ub=A_ub,
            b_ub=b_ub,
            bounds=bounds,
            integrality=integrality,
            method='highs'
        )
        return result

# 主函数调用示例
# 假设nodes是已定义的myNode对象列表
opt = Optimization(nodes)
result = opt.solve()

print("最优解状态:", result.success)
print("选中的节点索引(d_i=1):", np.where(result.x == 1)[0])
print("最大化的总吞吐量:", -result.fun)  # 转换回最大化的目标值

补充说明

  • 若使用旧版本Scipy(<1.9.0),需更换为method='revised simplex'并配合第三方整数规划工具(如pulp),因为旧版本linprog不支持integrality参数。
  • 需确保myNode对象的estimated_throughput属性为数值类型(如float/int)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:53:26