refactor: optimize code for better performance and readability

This commit is contained in:
chenxiaodong 2024-07-18 10:24:55 +08:00
parent 8d41feb855
commit a6232f24c8
5 changed files with 8845 additions and 11 deletions

8761
data.csv Normal file

File diff suppressed because it is too large Load Diff

View File

@ -162,7 +162,6 @@ class ESSEnv(gym.Env):
wind = wind_df['wind_speed'].to_numpy(dtype=float)
'''重新设计价格和发电量以及需求的大小'''
def process_elements(elements, transform_function, add_function):
for element in elements:
transformed_element = transform_function(element)

73
llm_connect.py Normal file
View File

@ -0,0 +1,73 @@
import pandas as pd
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai.chat_models import ChatOpenAI
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
def read_txt_file(file_path: str) -> str:
with open(file_path, "r", encoding='ISO-8859-1') as file:
content = file.read()
return content
def read_csv_file(file_path: str) -> pd.DataFrame:
return pd.read_csv(file_path)
def format_csv_data(df: pd.DataFrame, start: int, end: int) -> str:
formatted_data = []
for index, row in df.iloc[start:end].iterrows():
formatted_data.append(
f"时刻{index + 1}: Sp={row['price']}, Sl={row['load']},"
f"St={row['temperature']}, Si={row['irradiance']}, Sw={row['wind_speed']}"
)
return "\n".join(formatted_data)
system_content = read_txt_file('./llm.txt')
df = read_csv_file('./data.csv')
llm = ChatOpenAI(
streaming=True,
verbose=True,
openai_api_key="none",
# openai_api_base="http://0.0.0.0:5049/v1/models",
openai_api_base="http://localhost:8000/v1",
model_name="Qwen1.5-32b-int4"
)
prompt = ChatPromptTemplate.from_messages(
[
("system", system_content,),
MessagesPlaceholder(variable_name="history"),
("human", "{input}"),
]
)
runnable = prompt | llm
store = {}
with_message_history = RunnableWithMessageHistory(
runnable,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
num_hours = len(df)
for i in range(num_hours):
start = i
end = start + 1
csv_data_chunk = format_csv_data(df, start, end)
result = with_message_history.invoke(
{"input": f"数据如下:\n{csv_data_chunk}\n只返回json格式的五个决策数据{{[x1 x2 x3 x4 x5]}}"},
config={
"configurable": {"session_id": "cxd"}
},
)
print(f"Hour {i + 1}:\n{result.content}\n")

View File

@ -16,10 +16,11 @@ class DG:
self.ramping_down = parameters['ramping_down']
def step(self, action_gen):
output_change = action_gen * self.ramping_up # constrain the output_change with ramping up boundary
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)) # meet the constraint
# 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
@ -73,22 +74,23 @@ class Solar:
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.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']
self.change_percent = parameters['C_per']
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.current_power = max((1 + self.change_percent * action_voltage) * self.base_voltage * current, 0)
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):
@ -114,7 +116,7 @@ class Wind:
self.opex_cofficient = parameters['opex_cofficient']
def step(self, wind_speed):
constant = 0.5 * self.air_density * self.rotor_radius ** 2 * self.power_coefficient * self.generator_efficiency
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:

View File

@ -8,7 +8,6 @@ solar_parameters = {
'O_c': 0.001, # 变动成本系数 (元/千瓦时)
'I_ref': 1000, # 参考辐照度 (W/m²)
'T_ref': 25, # 参考温度 (°C)
'C_per': 0.1 # 电压改变百分比
}
wind_parameters = {
@ -37,13 +36,13 @@ battery_parameters = {
dg_parameters = {
'gen_1': {'a': 0.0034, 'b': 3, 'c': 30,
'power_output_max': 150, 'power_output_min': 10,
'ramping_up': 100, 'ramping_down': 100, 'min_up': 2, 'min_down': 1},
'ramping_up': 100, 'ramping_down': 100},
'gen_2': {'a': 0.001, 'b': 10, 'c': 40,
'power_output_max': 375, 'power_output_min': 50,
'ramping_up': 100, 'ramping_down': 100, 'min_up': 2, 'min_down': 1},
'ramping_up': 100, 'ramping_down': 100},
'gen_3': {'a': 0.001, 'b': 15, 'c': 70,
'power_output_max': 500, 'power_output_min': 100,
'ramping_up': 200, 'ramping_down': 200, 'min_up': 2, 'min_down': 1}
'ramping_up': 200, 'ramping_down': 200}
}