PulP:添加聚合变量的约束

时间:2018-01-02 23:20:22

标签: python linear-programming pulp

我对python很新,或者更倾向于编码,并试图找到我的方法。我花了几天时间在网上搜索并阅读了我在这方面找到的所有提示和文档,但找不到我的问题的解决方案。 我的目标实际上是一个非常基本的LP,找到最合适的音量,它与每个索引车道的最小值和最大值绑定,并最大化每个车道不同的利润。我找到了一些基础与我一直非常接近的代码,并根据我的需要对其进行了调整

prob = pulp.LpProblem('LaneSelectionOptimization', LpMaximize)

'''Set the variable'''
x = LpVariable.dicts('Lane',Lanes,None,None,LpInteger)


for l in Lanes:
 x[l].bounds(MinVols[l], MaxVols[l])


''' Set the objective function '''
prob += lpSum([x[l] * Impacts[l] for l in Lanes]), 'Sum_of_Impact'


''' Set the constraints '''
#to meet the requirements of the high level constrains i.e. total optimized volume shouldn't differ more than +/-10%
prob += lpSum([x[l] for l in Lanes]) <= VOLUME_LIMIT_UPPER
prob += lpSum([x[l] for l in Lanes]) >= VOLUME_LIMIT_LOWER 

到目前为止,一切顺利,它完成了预期。

现在我尝试添加另一个约束,它基本上需要聚合某个列字符串(SecToSecRel)上的变量,即创建一个小计,该小计应该小于在不同表中分配给该字符串的值

这是第二个表的一部分以及与之对齐的值,它起作用。

Total_Customer_Target = pd.DataFrame({"TOrgNo":data2.iloc[:,1],"SecToSecRel":(data2.iloc[:,2]+data2.iloc[:,3]), "Target 2018":data2.iloc[:,6]})

SRGNRel_Customer_Target_lane = (Total_Customer_Target[Total_Customer_Target.SecToSecRel == SecToSecRel[l]].sum()["Target 2018"])*1.10

然后添加约束....我尝试了各种方法,但不幸的是没有保留所有这些。

第一次尝试 - 没有工作

prob += lpSum([x[l] for l in Lanes if any(SecToSecRel) == SecToSecRel[l]]) <= SRGNRel_Customer_Target_lane, 

第二次尝试 - 在中间停止并返回KeyError

for s in Total_Customer_Target.SecToSecRel:
    prob += lpSum([x[l] for l in Lanes if s in SecToSecRel[l]]) <= SRGNRel_Customer_Target_lane

第3次尝试 - 以为我必须摆脱Key错误才能使其正常工作,设置默认值 - 但无法正常工作

for s in Total_Customer_Target.SecToSecRel:
    default = 'No Sector Relation'
    SecToSecRel.append(Total_Customer_Target.setdefault(s,default))
    prob += lpSum([x[l] for l in Lanes if s in SecToSecRel[l]]) <= SRGNRel_Customer_Target_lane,

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

这听起来像个有趣的问题!

首先,在建模问题时不能使用if语句。

为了清楚起见,您希望SecToSecRel中的车道总数小于SRGNRel_Customer_Target_lane吗?