在Pulp的LpConstraint中实现二维矩阵逐元素乘法的问题
切割与库存优化问题的约束修正方案
你的问题核心是变量索引与矩阵维度的对应关系不匹配,导致逐元素乘法的索引错误。以下是修正步骤:
问题分析
padroes是4×11的矩阵(m=4行对应物料类型j,n=11列对应切割模式i)x_variaveis[(i,j)]表示第i种切割模式下生产第j种物料的数量- 要实现逐元素相乘后按j求和(满足每种物料的需求b[j]),需要用
padroes[j, i]而非padroes[i,j]——因为padroes的行对应物料j,列对应模式i,和x的索引(i,j)刚好是列、行的对应关系。
修正后的代码
import pulp as p import numpy as np import pandas as pd m = 4 n = 11 L = 70 b = np.array([30, 30, 30, 120]) l = np.array([20, 22, 25, 26]) padroes = np.array([[1, 0, 0, 1, 1, 2, 0, 2, 1, 2, 3], [0, 2, 2, 1, 1, 0, 3, 0, 2, 1, 0], [2, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0], [0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0]]) set_J = range(0, m) # 物料类型集合(4种) set_I = range(0, n) # 切割模式集合(11种) # x[i,j]:第i种切割模式下生产第j种物料的数量 x_variaveis = {(i,j) : p.LpVariable(cat=p.LpInteger, lowBound=0, name="x_{0}_{1}".format(i,j)) for i in set_I for j in set_J} y_variaveis = {i : p.LpVariable(cat=p.LpBinary, name="y_{0}".format(i)) for i in set_I} # 修正restricao1的索引:padroes[j, i]对应第j种物料在第i种模式下的切割数量 restricao1 = {j : p.LpConstraint( e=p.lpSum(x_variaveis[i,j] * padroes[j, i] for i in set_I), sense=p.LpConstraintGE, rhs=b[j], name="restricao_{0}".format(j) ) for j in set_J} restricao2 = {i : p.LpConstraint( e=p.lpSum(l[j] * x_variaveis[i,j] for j in set_J), sense=p.LpConstraintLE, rhs=L * y_variaveis[i], name="restricao_{0}".format(i) ) for i in set_I} fun_obj = p.lpSum(y_variaveis[i] for i in set_I)
关键说明
- 逐元素乘法的逻辑本身是对的,
lpSum支持变量与常数的乘法求和,问题出在矩阵索引的匹配上 - 修正后,
x_variaveis[i,j] * padroes[j,i]实现了第i种模式下,第j种物料的生产数量乘以该模式下该物料的切割系数,再对所有模式i求和,结果需大于等于需求b[j],符合约束逻辑
内容的提问来源于stack exchange,提问作者BigBoss
相关产品推荐
相关产品推荐

