如何使用PuLP配置时间/时间线性编程约束?

时间:2013-07-12 19:34:45

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

我正在尝试使用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在正确的轨道上,我如何正确设置我的约束来解决问题?

请注意,每个项目的每个项目都有一个表格,其中包含适当的类别和数据点

修改以反映以下评论:

总共有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

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

单位可以互换。

1 个答案:

答案 0 :(得分:1)

以下是我如何做到这一点。

一般要点

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

如果您的配方正确,则实施起来会更容易。 (你正确地提到你的问题有一些棘手的限制。)

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

IP配方

决策变量与输入常量

我们有三种类型的传感器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结束时,Y_lst_ctype为1,则位置l中的传感器类型s将根据其在该年感测到的曝光次数而变为条件ctype

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

根据我们的符号Y_2b2_poor表示传感器类型b附加到单元2的决策变量,在第二年结束时以poor条件结束。

约束

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

封面约束 每个地点每年都必须有一个传感器。    (总和s)每个t的X_lst = 1,每个位置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)

目标函数

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

Min 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模型并写出配方,看它是否有意义。尝试一个简单的问题,并继续添加更多的约束和变量。

希望能帮助你前进。