building-agents/module.py

159 lines
5.7 KiB
Python

import numpy as np
class DG:
"""simulate a diesel generator"""
def __init__(self, parameters):
self.current_output = None
self.name = parameters.keys()
self.a_factor = parameters['a']
self.b_factor = parameters['b']
self.c_factor = parameters['c']
self.power_output_max = parameters['power_output_max']
self.power_output_min = parameters['power_output_min']
self.ramping_up = parameters['ramping_up']
self.ramping_down = parameters['ramping_down']
def step(self, action_gen):
output_change = action_gen * self.ramping_up
output = self.current_output + output_change
if output > 0:
# output = max(self.power_output_min, min(self.power_output_max, output))
output = max(0, min(self.power_output_max, output))
else:
output = 0
self.current_output = output
def get_cost(self, output):
cost = (self.a_factor * pow(output, 2) + self.b_factor * output + self.c_factor)
return cost
def reset(self):
self.current_output = 0
class Battery:
"""simulate a battery"""
def __init__(self, parameters):
self.current_capacity = None
self.energy_change = None
self.capacity = parameters['capacity']
self.min_soc = parameters['min_soc']
self.max_soc = parameters['max_soc']
self.degradation = parameters['degradation']
self.holding = parameters['holding']
self.max_charge = parameters['max_charge']
# self.max_discharge = parameters['max_discharge']
self.efficiency = parameters['efficiency']
def step(self, action_battery):
energy = action_battery * self.max_charge
current_energy = self.current_capacity * self.capacity
updated_capacity = np.maximum(self.min_soc, np.minimum(self.max_soc, (current_energy + energy) / self.capacity))
# if charge, positive, if discharge, negative
self.energy_change = (updated_capacity - self.current_capacity) * self.capacity
self.current_capacity = updated_capacity # update capacity to current state
def get_cost(self, energy_change, energy_hold): # cost depends on the energy change
cost = abs(energy_change) * self.degradation + energy_hold * self.holding
return cost
def SOC(self):
return self.current_capacity
def reset(self):
self.current_capacity = np.random.uniform(0.2, 0.8)
class Solar:
"""simulate a solar panel"""
def __init__(self, parameters):
self.current_power = None
self.base_voltage = parameters['V_b']
self.adjusted_voltage = self.base_voltage
self.sc_current = parameters['I_sc0']
self.oc_voltage = parameters['V_oc0']
# self.s_resistance = parameters['R_s']
self.sh_resistance = parameters['R_sh']
self.temper_coefficient = parameters['T_c']
self.opex_cofficient = parameters['O_c']
self.refer_irradiance = parameters['I_ref']
self.refer_temperature = parameters['T_ref']
def step(self, temperature, irradiance, action_voltage=0):
I_sc = self.sc_current * (irradiance / self.refer_irradiance)
V_oc = self.oc_voltage + self.temper_coefficient * (temperature - self.refer_temperature)
current = I_sc - (V_oc / self.sh_resistance)
self.adjusted_voltage = self.adjusted_voltage * (1 + action_voltage)
self.current_power = max(self.adjusted_voltage * current, 0)
return self.current_power
def get_cost(self, current_power):
cost = current_power * self.opex_cofficient
return cost
def reset(self):
self.current_power = 0
class Wind:
"""simulate a wind turbine"""
def __init__(self, parameters):
self.current_power = None
self.cutin_speed = parameters['cutin_speed']
self.cutout_speed = parameters['cutout_speed']
self.rated_speed = parameters['rated_speed']
self.air_density = parameters['air_density']
self.rotor_radius = parameters['rotor_radius']
self.power_coefficient = parameters['power_coefficient']
self.generator_efficiency = parameters['generator_efficiency']
self.opex_cofficient = parameters['opex_cofficient']
def step(self, wind_speed):
constant = 0.5 * self.air_density * np.pi * self.rotor_radius ** 2 * self.power_coefficient * self.generator_efficiency
if self.cutin_speed <= wind_speed < self.rated_speed:
self.current_power = constant * wind_speed ** 3 / 1e3
elif self.rated_speed <= wind_speed < self.cutout_speed:
self.current_power = constant * self.rated_speed ** 3 / 1e3
else:
self.current_power = 0
return self.current_power
def gen_cost(self, current_power):
cost = current_power * self.opex_cofficient
return cost
def reset(self):
self.current_power = 0
class Grid:
"""simulate a grid"""
def __init__(self):
self.on = True
self.delta = 1
if self.on:
self.exchange_ability = 100
else:
self.exchange_ability = 0
def get_cost(self, current_price, energy_exchange):
return current_price * energy_exchange * self.delta
def retrieve_past_price(self):
result = []
# 过去24小时的价格起始、结束索引
start_index = max(0, 24 * (self.day - 1) + self.time - 24)
end_index = 24 * (self.day - 1) + self.time
past_price = self.price[start_index:end_index]
result.extend(past_price)
# current_day_price = self.price[24 * self.day:24 * self.day + self.time]
# result.extend(current_day_price)
return result