简体   繁体   English

PYTHON,if 语句只满足第一个条件。 纸浆

[英]PYTHON, if-statement meets only first condition. PuLP

I am trying to use PuLP to optimize a system, minimizing the cost of it.我正在尝试使用 PuLP 来优化系统,将其成本降至最低。 I am using multiple If's and the problem is that it always meets the first condition.我正在使用多个 If,问题是它总是满足第一个条件。 Here is my code.这是我的代码。 I hope someone can help me, as I am just starting to learn about this language.我希望有人能帮助我,因为我刚刚开始学习这门语言。

import numpy as np
import pandas as pd
from pulp import *

idx = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
d = {
'day': pd.Series(['01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14'], index=idx),
'hour':pd.Series(['00:00:00', '01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00', '06:00:00', '07:00:00', '08:00:00', '09:00:00', '10:00:00', '11:00:00', '12:00:00', '13:00:00', '14:00:00', '15:00:00', '16:00:00', '17:00:00', '18:00:00', '19:00:00', '20:00:00', '21:00:00', '22:00:00', '23:00:00'], index=idx),
'output':pd.Series([0,0,0,0.087,0.309,0.552,0.682,0.757,0.783,0.771,0.715,0.616,0.466,0.255,0.022,0,0,0,0,0,0,0,0,0], index=idx)}
cfPV = pd.DataFrame(d)


idx = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
d1 = {
'day': pd.Series(['01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14', '01/01/14'], index=idx),
'hour':pd.Series(['00:00:00', '01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00', '06:00:00', '07:00:00', '08:00:00', '09:00:00', '10:00:00', '11:00:00', '12:00:00', '13:00:00', '14:00:00', '15:00:00', '16:00:00', '17:00:00', '18:00:00', '19:00:00', '20:00:00', '21:00:00', '22:00:00', '23:00:00'], index=idx),
'output':pd.Series([0.528,0.512,0.51,0.448,0.62,0.649,0.601,0.564,0.541,0.515,0.502,0.522,0.57,0.638,0.66,0.629,0.589,0.544,0.506,0.471,0.448,0.438,0.443,0.451], index=idx)}
cfWT = pd.DataFrame(d1)


prob = LpProblem ("System", LpMinimize)

CPV = LpVariable ("PVCapacity",0) #PV Capacity in kW
CWT = LpVariable ("WTurCapacity",0) #WT Capacity in kW
CBA = LpVariable ("BatteryCapacity",0) #Battery Capacity kW

prob+= 63.128*CPV + 88.167*CWT + 200*CBA, "TotalCostSystem"

xEne = 0
xREin = 0
xBin = 0
xBout = 0
SOCB = 0
xPEMin = 0
xOvEn = 0
xSum = 0

CPEM = 230

for i in idx:

    xEne = (CPV*cfPV['output'][i]+CWT*cfWT['output'][i])

    #Low limit for Variables
    prob += (CPV*cfPV['output'][i]+CWT*cfWT['output'][i]) >= 0
    prob += xREin >= 0
    prob += xBin >= 0
    prob += xBout >= 0
    prob += SOCB >= 0
    prob += xPEMin >= 0
    prob += xOvEn >= 0
    prob += xSum >= 0
    prob += CBA >= SOCB
    prob += xBin <= (CBA - SOCB)
    prob += xBout <= SOCB

    #Cases

    #Case 1 xEne > CPEM
    if xEne >= CPEM:

        xREin = CPEM
        xBout = 0
        xOvEn = xEne - CPEM 

        #Case 1.1 xOvEn < CBA - SOCB
        if (value(xOvEn) <= (CBA - value(SOCB))): 
            xBin = xOvEn

        #Case 1.2 xOvEn > CBA -SOCB
        else: 
            xBin = CBA - SOCB 

    #Case 2 xEne < CPEM
    else:
        xREin = xEne
        xBin = 0 
        xOvEn = 0

        #Case 2.1 SOCB > CPEM - xREin
        if (value(SOCB) >= (CPEM - value(xREin))):
            xBout = (CPEM - xREin)

        #Case 2.2 SOCB < CPEM - xREin 
        else:

            xBout = SOCB 

    SOCB = SOCB + xBin - xBout
    xPEMin = xREin + xBout 

    xSum += xPEMin

prob += xSum >= 5000


prob.writeLP("PVWTBattSyste.lp")

prob.solve()

The solution given always meets first condition.给出的解决方案总是满足第一个条件。 Also, when the condition is not met (changing CPEM to 50000000000000, for example) the if works as it is true.此外,当不满足条件时(例如,将 CPEM 更改为 50000000000000),if 会正常工作。

Thank you in advance!先感谢您!

You should use elif statement to differentiate one if elif else one from another.您应该使用elif语句来区分一个if elif else和另一个。 Also this have the effect of a switch case used in other languages.这也具有在其他语言中使用的 switch case 的效果。 But on the other hand, are you using indentation at all?但另一方面,您是否完全使用缩进? Like seriuosly Python is all about indentation.就像严肃的 Python 都是关于缩进的。

Also you have one else statement without an if statemt你还有一个没有 if 语句的else语句

#Case 1.2 xOvEn > CBA -SOCB
else: 
    xBin = CBA - SOCB 

#Case 2 xEne < CPEM
else:
    xREin = xEne
    xBin = 0 
    xOvEn = 0

In other words, without indentation your program is just jumping an empty if to the next line.换句话说,如果没有缩进,您的程序只是将一个空的if跳转到下一行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM