我正在尝试使用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 -
"Very poor"
。 适用于sensor_type_a
:
[50, 55, 55, 55, 60]
[ 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
:
[60, 65, 65, 70, 75]
[ 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
:
[5000, 5100, 5200, 5300, 5400]
[ 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
该模型不能改变今年传感器类型的组成,但它应该能够在未来几年充分模拟它。意味着包括更换成本等,以获得更好的传感器和降低总体成本。
单位可以互换。
答案 0 :(得分: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结束时,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模型并写出配方,看它是否有意义。尝试一个简单的问题,并继续添加更多的约束和变量。
希望能帮助你前进。