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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:17