【问题标题】:How to configure temporal / time linear programing constraints using PuLP?如何使用 PuLP 配置时间/时间线性编程约束?
【发布时间】:2013-07-12 19:34:45
【问题描述】:

我正在尝试使用 PuLP 解决假设的线性问题。该问题旨在最大限度地降低 5 年内的运营成本,同时最大限度地提高产品形状和条件。该问题必须产生5个成本,每年一个,同时优化整个系统和每年的运营。

total_cost = [(var_cost[year] + fix_cost[year] + cost_new_sensors[year]) for year in range(0,5)]

total_cost 涉及维护三种类型的传感器:

                   # units    price_new fixed_cost_per_unit_per_yr   variable_costs_pr_yr_pr_unit
sensor_type_a      300        $50       rent + insurance             power + maint
sensor_type_b      900        $75       rent + insurance             power + maint
sensor_type_c      1500       $90       maint + insurance            -     
  • 问题必须考虑到,对于每一年,传感器在 比前一年更好的条件以及不能更多 超过 12% 的传感器条件为"Very poor"
  • 系统应该能够用另一种传感器类型替换或降级新传感器 如果曝光率不高,请购买。 (此声明与本帖无关)

对于sensor_type_a

  • 固定成本:
    • 每单元1至5年的租金为[50, 55, 55, 55, 60]
    • 第 1 年至第 5 年的单位保险为[ 1.0, 1.2, 1.2, 1.8, 2.0]
  • 可变成本:
    • 功率基于传感器测量的项目数:10+.05*each_measurement。价格每年上涨 1%
    • 维护基于$500 for the total number of sensors + each_measurement*2.45。价格每年上涨 2%
  • 暴露指数表示每个传感器的状态,基于下表:

_

exposure(# of measurements)    category
<=100                          excellent
250                            good
400                            poor
>=400                          very poor

对于sensor_type_b

  • 固定成本:
    • 每单元1至5年的租金为[60, 65, 65, 70, 75]
    • 第 1 年至第 5 年的单位保险为[ 1.1, 1.3, 1.4, 1.7, 2.0]
  • 可变成本:
    • 功率基于传感器测量的项目数:10+.08*each_measurement。价格每年上涨 1%
    • 维护基于$500 for the total number of sensors + each_measurement*2.65。价格每年上涨 1.5%
  • 暴露指数表示每个传感器的状态,基于下表:

_

exposure(# of measurements)    category
<=200                          excellent
350                            good
500                            poor
>=500                          very poor 

对于sensor_type_c

  • 固定成本:
    • 第 1 年至第 5 年所有单元的维护是 [5000, 5100, 5200, 5300, 5400]
    • 第 1 至第 5 年的单位保险为[ 1.1, 1.3, 1.4, 1.7, 2.0]
  • 暴露指数表示每个传感器的状态,基于下表:

_

exposure(# of measurements)    category
<=300                          excellent
450                            good
600                            poor
>=600                          very poor

我的目标函数/方程是最小化之一:

problem = pulp.LpProblem(’Cost Minimization’, pulp.LpMinimize)

我的限制:

我在设置约束函数时遇到问题。这是我在概念上想做的事情(伪和python的混合):

problem += sum([fixed_costs[yr][a] + var_costs[yr][a]
                               for a in sensor_type_a
                               for yr in years])

problem += sum([fixed_costs[yr][b] + var_costs[yr][b]
                               for a in sensor_type_b
                               for yr in years])

problem += sum([fixed_costs[yr][c] + var_costs[yr][c]
                               for a in sensor_type_c
                               for yr in years])

problem += sum(sensor_type_[a].condition('very poor') + \
               sensor_type_[b].condition('very poor') + \
               sensor_type_[c].condition('very poor')) <= 12%

problem += sum(sensor_type_[a].average_condition(yr) + \
               sensor_type_[b].average_condition(yr) + \
               sensor_type_[c].average_condition(yr) >=
               sensor_type_[a].average_condition(yr-1) + \
               sensor_type_[b].average_condition(yr-1) + \
               sensor_type_[c].average_condition(yr-1)

问题:

如果我的伪+python 没有走上正轨,我该如何正确设置约束来解决问题?

请注意,我为每个变量填写了一个表格,其中包含适当的类别和数据点

编辑以反映以下 cmets:

总共需要测量 2,700 个单位或位置。我有以下性质的表:

   unit_ID  actual_2013   forecasted_2014   forecasted_2015   forecasted_2016   forecasted_2017
         1           25                30                40                35    50
         2          400               430               460               480    50
         n          x_1               x_2               x_3               x_4    x_5

该模型不能改变今年传感器类型的构成,但是它应该能够为未来几年充分建模。这意味着包括更换成本等,以获得更好的传感器并降低总体成本。

单位可以互换。

【问题讨论】:

  • 您已经很好地涵盖了成本要素,但我认为我们遗漏了一些信息。每年需要多少次曝光(测量)?任何类型的传感器都可以分配给任何测量吗?一旦你把decision variables 搞清楚了,公式就会变得容易得多。
  • @RamNarasimhan 我将获得当前的实际曝光和未来年份曝光的建模结果,这意味着我会知道在传感器类型下,位置将有 x 个读数等等。对于分配用于测量的当年传感器不能改变;但是,它们可以在未来几年改变
  • 你能更新你的问题定义吗?有多少个地点?是否需要使用所有 1500 个 C 型传感器?这三种类型可以互换吗?预计每年有多少次曝光?我们需要这些来制定 LP。
  • @RamNarasimhan 我刚刚更新了问题

标签: python linear-programming equation-solving temporal pulp


【解决方案1】:

这是我的处理方法。

一般要点

首先,您希望将模型公式与 PuLP 或其他方式中的代码实现分开。

如果你的公式正确,它会变得更容易实施。 (你正确地提到你的问题中有一些棘手的限制。)

在我们查看公式之前的最后一个建议:您有一组相当复杂和详细的成本和限制。我建议让基本公式和 LP 解决方案工作,然后分层约束和详细成本(租金、维护等)否则,您将花费大量时间调试和验证您的模型.

知识产权配方

决策变量与输入常量

我们有三种类型的传感器s = {a, b, c}。 我们的时间跨度为 5 年 = t = {1..5} 我们有大约 2700 个地点l = {1..2700}

主要决策变量 - 决定哪种感官类型在哪个位置进行

Let `X_lst` be 1 if the unit at location l gets assigned a sensor of type `s` in year `t`
           0 otherwise

 Let `N_st` be the total number of sensors of type s used in year t

X 和 N 是决策变量。

我们还获得了很多“常量”(这些是您的输入表。)

Let E_lt be the total number of exposures in location l in year t. 

(请注意,E_lt 是在问题之外给出或预测的。IP 输出决定这一点。

需要最后一组决策变量:

如果在时间段 t 结束时,位置 l 的传感器类型 s 最终处于状态 ctype,则令 Y_lst_ctype 为 1,这取决于它在该年感应到的曝光次数。

ctype 可以是 {Excellent、Good、Poor、VeryPoor} 之一

通过我们的符号 Y_2b2_poor 表示传感器类型 b 连接到单元 2 的决策变量,在第 2 年结束时以poor 条件结束。

约束

现在,让我们开始对您提到的众多约束进行建模:

覆盖约束 每个地点每年都必须有一个传感器。 (sum over s) X_lst = 1 对于每个 t,对于每个位置 l。

总数限制 对于每种传感器类型,我们每年都有一个总数等式。

N_st = X_1st + X_2st + ... + X_2700st for each sensor type s, and for each time period t

(这些约束有时被称为“定义”约束。它们确保 N 和 X 内部一致。)

起始条件

N_a1 <= 300
N_b1 <= 900
N_c1 <= 1500

传感器条件相关约束

这些有点棘手,这就是为什么我们不得不引入这么多 0/1 类型的Y 变量。

每个传感器只能在一种情况下结束

Y_lst_excellent + Y_lst_good + Y_lst_poor + Y_lst_verypoor = 1

现在我们编写了一组线性约束,根据曝光次数确定传感器的状况。

技巧我们必须使用 big-M 方法来确保模型为其分配正确的条件。

对于传感器类型 a

E_lt x X_lat <= 100 + M (1- Y_lat_good)

E_lt x X_lat <= 250 + M (1- Y_lat_poor)

E_lt x X_lat <= 400 + M (1- Y_lat_verypoor)

如果您对此进行研究,您会发现,根据所经历的曝光次数,分配了正确的条件,同时仍保持一切线性。 (M 是一个很大的数字)

对传感器类型 b 和 c 也这样做。

将百分比限制为非常差的情况

Y_1st + Y_2st + Y_3st + ... + Y_2700st <= 0.12 x Nst (for each sensor type s, year t)

目标函数

你已经列出来了,所以我只提一下目标函数将采用的轮廓。

最小 sum_all_cots x X_lst 其中总和将包含与租金、维护和更换相关的部分。

最后说明为了获得超级准确,您还需要一个决策变量来决定是在每个位置保留还是更换新的传感器。

R_lst = 1 if location l gets a NEW sensor of type s at the end of year t

根据“替换与零售”成本权衡,您会添加更多约束。但是这个模型本身就很复杂,所以我没有写出那些约束。

你必须翻译成你的 Python 模型并写出公式,看看它是否有意义。尝试解决一个琐碎的问题,并不断添加更多的约束和变量。

希望能帮助你前进。

【讨论】:

  • 感谢 Ram 的详细回复。在我开始理解之前,我必须多次阅读这些回复之一。我真的很感谢你在这方面的努力
  • 欢迎。请问我是否有任何不清楚的地方。 SO 不是共享 IP 公式的最佳媒介。从一个传感器开始 2 年,用 PuLP 解决这个问题,然后通过添加约束来扩展它。
猜你喜欢
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多