【问题标题】:Maximizing with constraint for number of distinct SKU not greater than X在不大于 X 的不同 SKU 数量的约束下最大化
【发布时间】:2021-12-19 18:36:54
【问题描述】:

我正在使用 Pulp 构建优化工具。

它的目的是定义从每个仓库中取哪个 SKU 和离开哪个 SKU。

我遇到了以下限制:

“选择的不同 SKU 的最大值不应超过 500”

也就是说,无论你拿多少个单位,只要不超过500个品种(不同的SKU),都可以。

这就是我目前所得到的

#simplex
df=pd.read_excel(ruta+"actual/202109.xlsx", nrows=20) #leemos la nueva base del mes

# Create variables and model
x = pulp.LpVariable.dicts("x", df.index, lowBound=0)
mod = pulp.LpProblem("Budget", pulp.LpMaximize)


# Objective function
objvals = {idx: (1.0)*(df['costo_unitario'][idx]) for idx in df.index}
mod += sum([x[idx]*objvals[idx] for idx in df.index])


# Lower and upper bounds:
for idx in df.index:
    mod += x[idx] <= df['unidades_sobrestock'][idx]

# Budget sum
mod += sum([x[idx] for idx in df.index]) <= max_uni

# Solve model
mod.solve()

# Output solution
for idx in df.index:
    print (str(idx) + " " + str(x[idx].value()))


print ('Objective' + " " + str(pulp.value(mod.objective)))
   

在同一个数据框中,我有一列包含每个特定行的 SKU df['SKU']

我想约束应该是这样的:

for idx in df.index:

  mod += df['SKU'].count(distinct) <= 500
   

但这似乎不起作用。

谢谢!

【问题讨论】:

  • 你应该编辑你的帖子,在pulp 中包含你当前的工作,这样我们就可以看到你是如何设置问题、变量等的。你应该自己做一个huge 赞成而不是将pandaspulp 混为一谈。您不能将数据框函数放入模型中(如上面的count())。将您的数据移动到字典中并从中构建模型...更容易且不易出错。
  • 感谢@AirSquid
  • 您熟悉“大 M”约束吗?您可能需要引入一个额外的二进制变量(索引与 x 相同)以产生大 M 约束并有一个变量来计算使用的 SKU。

标签: dataframe optimization pulp


【解决方案1】:

您将需要一个二进制变量 y[i] 来指示是否使用了 SKU。在类似数学的符号中:

  x[i] ≤ maxx[i]*y[i]     (y[i] = 0 ==> x[i] = 0) 
  sum(i, y[i]) ≤ maxy     (limit number of different SKUs)
  y[i] ∈ {0,1}            (binary variable)

在哪里

   maxx[i] = upperbound on x[i]
   maxy = limit on number of different SKUs 

【讨论】:

  • 您好 Erwin,非常感谢,我明白了,但是我如何告诉变量正在使用某些 SKU,以便进行增量并评估是否满足条件?
  • y[i] 跟踪是否使用 SKU i,如果使用(即如果使用 x[i]&gt;0),那么y[i]=1 必须为真。
  • 谢谢!我正在尝试对其进行编码,一旦它运行,我就会将其标记为答案。我只是不太清楚 maxx[i]; x[i] 的上限是什么意思?
  • 这种方法很准确。 maxx[i] 是可以使用的最大数量。如果y[i] == 1,它允许x[i] 达到最大值。因此,如果x[7] 的可用数量为205,则maxx[7] = 205。它只是模型中的一个参数。
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多