python / pandas线性编程/优化挑战

时间:2015-10-30 09:31:14

标签: python optimization pandas linear-programming

所以,我有一个优化问题,也许可以通过线性编程来解决(使用PuLP?)。我对这一系列工作的经验是有限的,所以也许另一种解决方案会更好。

问题如下:

需要购买37件物品。每件商品必须以特定数量,特定颜色购买。 对于每个项目,我有可变数量的商店出售该项目。大约有8000家商店合计销售37件商品。没有一家商店出售所有37件商品。每个商店都有可变数量的可用商品(如果可用)和可变价格。此外,每家商店都有最低购买金额。

在python中,我有两个数据帧,应该包含我需要的所有信息。 (商店名称被模糊')

wanted.head()
    item_color_id   item_id item_qty
0   86              21837   1
1   5               2431    2
2   11              2444    6
3   11              2476    4
4   3               2654    2

stores.head()
    item_color_id   item_id store_min_buy   store_name  store_price store_qty
0   86              21837   20.00           fda         0.18        100
1   86              21837   10.00           asdfa       0.52        89
2   86              21837   10.00           ghsde       0.55        64
3   86              21837   9.14            j5rs        0.41        31
4   86              21837   10.00           pjvds       0.44        26

stores数据框已经过预处理,因此不包含任何NaN值。请注意,store_min_buy是该商店需要花费的最低金额。

挑战是尽量减少购买37件商品的成本。除此之外,我需要实际的解决方案:需要从哪些商店购买哪些商品。

1 个答案:

答案 0 :(得分:2)

min_buy约束有点烦人,其余的更明显。

所以有一些决策变量:

x[i,j] = number of item i to buy at store j
u[j]   = store j is used at all

然后是明显的约束:

sum(x[i,any]) >= wanted[i]  (>= because the min_buy constraint may force you to buy extra)

min_buy约束。这很烦人,因为它有点像条件约束。

sum(x[any,j]) <= M * u[j]  (ban u[j]=0 if some item is bought here)
min_buy[j] * u[j] <= sum(x[i,j] * price[i]) (force buying enough)

您可以以明显的方式将其转换为合法约束格式。 M是一个很大的数字,大到足以在使用商店时总是满足约束(所以至少与你可能存在的最大项目数一样大)。

我真的不喜欢这个模特。线性相将尽可能多地滥用M,并且可能通过选择u微小但非零而轻微地满足最后两个约束。这将导致整数阶段的悲痛,因为这意味着分数解决方案可能会大大低估成本。