wgz_decision/models/module.py

105 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class EC:
def __init__(self, params):
self.current_power = None
self.hydrogen_produce = params['hydrogen_produce']
self.power_max = params['power_max']
self.power_min = params['power_min']
self.ramp = params['ramp']
self.lifetime = params['lifetime']
self.equipment_cost = params['equipment_cost']
self.electrolysis_efficiency = params['electrolysis_efficiency']
self.carbon_reduce = params['carbon_reduce']
def step(self, action_ec):
output = self.current_power + action_ec * self.ramp
output = max(self.power_min, min(self.power_max, output)) if output > 0 else 0
self.current_power = output
def get_cost(self, price):
# 成本 = 设备费用 / 生命周期 * 电价 * (用电量 / 最大用电量)
return self.equipment_cost / self.lifetime * price * self.current_power / self.power_max
def get_hydrogen(self):
return self.current_power * self.electrolysis_efficiency * self.hydrogen_produce
def get_heat(self):
return self.current_power * (1 - self.electrolysis_efficiency)
def less_carbon(self):
return self.current_power * self.carbon_reduce
def reset(self):
self.current_power = 0
class HST:
def __init__(self, params):
self.current_soc = None
self.hydrogen_charge = None
self.capacity = params['capacity']
self.min_soc = params['min_soc']
self.max_soc = params['max_soc']
self.lifetime = params['lifetime']
self.equipment_cost = params['equipment_cost']
self.charge_efficiency = params['charge_efficiency']
self.generate_efficiency = params['generate_efficiency']
self.lower_heating_value = params['lower_heating_value']
'''
储氢罐的充气速率 = 电解水制氢速率 (电解水制氢放的热会满足热水需求?
如何控制上述待补充
储氢罐的放气速率 = 供电 (电价低时多电解,电价高时释放)
'''
def step(self, action_hst):
energy = action_hst * self.capacity
updated_soc = max(self.min_soc, min(self.max_soc, (self.current_soc * self.capacity + energy) / self.capacity))
self.hydrogen_charge = (updated_soc - self.current_soc) * self.capacity
self.current_soc = updated_soc
def get_power(self):
if self.hydrogen_charge > 0:
return self.hydrogen_charge * self.charge_efficiency * self.lower_heating_value * self.generate_efficiency
else:
return 0
def get_heat(self):
if self.hydrogen_charge < 0:
return self.hydrogen_charge * self.charge_efficiency * (1 - self.generate_efficiency)
else:
return 0
def get_cost(self):
cost = self.equipment_cost / self.lifetime * abs(self.hydrogen_charge)
return cost
def reset(self):
self.current_soc = 0.1
class Grid:
def __init__(self):
self.delta = 1
self.carbon_increace = 0.9
# self.trade_energy = None
def get_cost(self, price, trade_energy):
return price * trade_energy * self.delta
def get_carbon(self, trade_energy):
return trade_energy * self.carbon_increace
# def step(self, action_grid, ec_power_max):
# self.trade_energy = (action_grid + 1) / 2 * ec_power_max # 反标准化
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