线性优化python

2024-09-27 09:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试将启动成本添加到工作调度问题中(无启动成本的工作)。时间表应在动态期间进行优化,即一天的所有96个季度。我有一个96个价格的列表,我把它转换成一个矩阵:

prices = np.matrix([prices.as_matrix()])
prices = prices.T
length = prices.size
Range = range(np.size(prices))

以及以下变量:

c_turb = -100
min_turb = 0
max_turb = 8
c_pump = -50
min_pump = -10
max_pump = 0

这是我的目标:

 prob = pulp.LpProblem("The PSP",LpMaximize)
 prob +=lpSum([(price[i])*pump[i] for i in RANGE]
             + [price[i]*turbine[i] for i in RANGE]
             + [z_turb[i]*c_turb for i in RANGE]
             + [z_pump[i]*c_pump for i in RANGE])

我的变量定义如下:

pump = LpVariable.dicts("pump", RANGE,upBound=0,  cat="Integer")
turbine = LpVariable.dicts("turbine", RANGE, lowBound=0, cat="Integer")
pump_status=LpVariable.dicts("pump_status", RANGE,  cat="Binary")
turbine_status=LpVariable.dicts("turbine_status", RANGE,  cat="Binary")
z_pump = LpVariable.dicts("pump_startup", RANGE,  cat="Binary")
z_turb= LpVariable.dicts("turbine_startup", RANGE, cat="Binary")

for i in pump:
     pump[i].lowBound = -10 #bounds can vary for each i but irrelevant for problem

for i in turbine:
     turbine[i].upBound = 8

现在我添加了以下约束:

for i in range(1,length+1):
    n=range(0,i)
    prob += lpSum((-0.8*pump[i]-turbine[i])*0.25 for i in n ) <=50        prob += lpSum((-0.8*pump[i]-turbine[i])*0.25 for i in n) >=0
    prob += pump[i]>=min_pump*pump_status[i]
    prob += pump[i]<= max_pump*pump_status[i]
    prob += turbine[i] >= min_turb * turbine_status[i]
    prob += turbine[i] <= max_turb * turbine_status[i]

    if i == 1:
        prob += z_pump[i] == pump_status[i]
    else:
        prob+= z_pump[i]>=pump_status[i]-pump_status[i-1]
        prob+= z_pump[i]<=pump_status[i]
        prob+= z_pump[i]<=(1-pump_status[i-1])

    if i == 1:
        prob += z_turb[i] == pump_status[i]
    else:
        prob+= z_turb[i]>=turbine_status[i]-turbine_status[i-1]
        prob+= z_turb[i]<=turbine_status[i]
        prob+= z_turb[i]<=(1-turbine_status[i-1])

其中turbine_statuspump_status应为该特定季度i涡轮机/泵的开/关状态。 z_pumpz_turb应存储启动次数,即从0状态切换到1状态。你知道吗

但是,我在第行得到一个错误:prob += pump[i]>=min_pump*pump_status[i]。不幸的是error info: 96并不是很详细。。。。你知道吗

有人能给我指出正确的方向吗?你知道吗

谢谢你!!你知道吗


Tags: inforstatusrangeminmaxcatprices

热门问题