1

我正在尝试使用 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

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

单位可以互换。

4

1 回答 1

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 输出并不决定这一点。

需要最后一组决策变量:

如果Y_lst_ctype在时间段 t 结束时,位置 l 的传感器类型 s 最终处于ctype基于它在该年感测到的曝光次数的条件,则设为 1。

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

通过我们的符号 Y_2b2_poor 表示传感器类型 b 连接到单元 2 的决策变量,在第 2 年结束时最终处于poor状态。

约束

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

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

总数约束 对于每种传感器类型,在每一年,我们都有一个总数方程。

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 模型并写出公式,看看它是否有意义。尝试解决一个琐碎的问题,并不断添加更多的约束和变量。

希望能帮助你前进。

于 2013-07-15T19:35:33.843 回答