Python Forum
Energy optimization with pulp
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Energy optimization with pulp
#1
I'm trying to create my first LP simulation but I have some problem with it.

This is my code:
import pulp

# Define the optimization problem  
prob = pulp.LpProblem("Energy_Cost_Minimization", pulp.LpMinimize)  

# Time horizon
T = 24 

# Battery parameters
B_max = 10    # Maximum battery capacity
B_init = 0    # Initial battery level 

# Grid energy cost per unit for each hour  
grid_cost = [0.15, 0.15, 0.14, 0.13, 0.12, 0.12, 0.12, 0.12, 0.14, 0.16,  
             0.18, 0.20, 0.20, 0.20, 0.18, 0.16, 0.14, 0.18, 0.20, 0.20,  
             0.20, 0.18, 0.16, 0.15]  

# Renewable energy supply for each hour 
S = [1, 1, 0.5, 0.5, 1, 2, 3, 4, 5, 5, 5, 4, 4, 3, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1]  

# Predicted energy demand for each hour
#D = [1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 6, 5, 5, 5, 6, 7, 7, 6, 4, 3, 2]  
D = [0.5, 0.5, 0.5, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 3.5, 3.5, 3, 3, 2.5, 2.5,  
     2.5, 3, 3.5, 3.5, 3, 2, 1.5, 1]
# Create decision variables  
G = pulp.LpVariable.dicts("Grid Energy", range(T), lowBound=0)  
B = pulp.LpVariable.dicts("Battery Level", range(T+1), lowBound=0, upBound=B_max)
Surplus = pulp.LpVariable.dicts("Renewable Surplus", range(T), lowBound=0)

# Objective function       
prob += pulp.lpSum([grid_cost[t] * G[t] for t in range(T)])  

# Constraints
for t in range(T):
    
    if t > 0:
        # Battery can only charge from renewable surplus
        #Surplus[t] = max(0, S[t] - D[t])
        prob += Surplus[t] <= S[t] - D[t] # Calculate renewable surplus
        prob += B[t] <= B[t-1] + Surplus[t-1] # Battery charges from surplus
    
    # Meet demand from renewables, battery and grid 
    prob += D[t] <= S[t] + B[t] + G[t] 
    
    # Battery initialization
    if t == 0: 
        prob += B[t] == B_init # Start battery empty
        
# Solve optimization        
prob.solve()    

# Print results
for t in range(T):
    print(f"Hour {t}: Grid Energy = {G[t].varValue} kWh, Battery Level = {B[t].varValue} kWh, Power Consumption = {D[t]} kWh, Renewable Energy Supply = {S[t]} kWh")
This is the result in colab:

Output:
Hour 0: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 1 kWh Hour 1: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 1 kWh Hour 2: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 0.5 kWh Hour 3: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 0.5 kWh Hour 4: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1 kWh, Renewable Energy Supply = 1 kWh Hour 5: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1.5 kWh, Renewable Energy Supply = 2 kWh Hour 6: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2 kWh, Renewable Energy Supply = 3 kWh Hour 7: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 4 kWh Hour 8: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 5 kWh Hour 9: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh Hour 10: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh Hour 11: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 4 kWh Hour 12: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 4 kWh Hour 13: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 3 kWh Hour 14: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 2 kWh Hour 15: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 3 kWh Hour 16: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 4 kWh Hour 17: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 5 kWh Hour 18: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh Hour 19: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 4 kWh Hour 20: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 3 kWh Hour 21: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2 kWh, Renewable Energy Supply = 2 kWh Hour 22: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1.5 kWh, Renewable Energy Supply = 1 kWh Hour 23: Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1 kWh, Renewable Energy Supply = 1 kWh
Grid Energy should be positive when renewable energy and battery aren't enough but it is 0.0 at all hours. Also Battery level should charge only if there is a surplus of renewable energy.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Energy Forecast with SARIMAX PatiencePlease 0 391 Jan-31-2024, 11:53 PM
Last Post: PatiencePlease
  Pulp Linear Programming quest 2 2,393 Nov-10-2020, 09:53 PM
Last Post: quest
  Dijkstra in PuLP optimisation Problem tarrymarufu 2 2,213 Mar-09-2020, 12:46 PM
Last Post: tarrymarufu
  Ifs in PuLP priscila24 0 2,227 Oct-30-2017, 09:02 PM
Last Post: priscila24

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020