使用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'
报错核心原因
- 参数类型错误:调用
linprog时传入c=self.nodes,但linprog要求c是数值型数组(目标函数系数),不能直接传入myNode对象列表。 - 目标函数方向错误:
linprog默认执行最小化,但需求是最大化吞吐量,未做符号转换。 - 约束条件构造错误:
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
相关产品推荐
相关产品推荐

