optimizer.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import time
  2. import pandas as pd
  3. from ..model._base._base_device import BaseDevice
  4. from .._opt.algorithm.sim_config import simulate_config as sim_opt_config
  5. from .._opt.algorithm.main import main as main_opt
  6. from .._opt.boundary.sim_config import simulate_config as sim_config_bound
  7. from .._opt.boundary.main import main as main_bound
  8. from .._opt.algorithm.model.model import SystemModel
  9. def optimizer(
  10. model : BaseDevice,
  11. opt_var_boundary: dict,
  12. opt_var_value : pd.DataFrame,
  13. oth_var_value : pd.DataFrame,
  14. constrains : list
  15. ):
  16. var_name_opt = []
  17. boundary_info = {}
  18. for var_name,var_info in opt_var_boundary.items():
  19. var_name_opt.append(var_name)
  20. boundary_info[var_name] = main_bound(
  21. None,None,None,
  22. opt_var_value.iloc[[0],:].loc[:,[var_name]],
  23. config = sim_config_bound(
  24. opt_var = [var_name],
  25. syn_opt = False,
  26. var_type = True,
  27. lb_static = var_info['lb'],
  28. ub_static = var_info['ub'],
  29. var_precis = var_info.get('precis',1)
  30. )
  31. )
  32. var_name_oth = []
  33. oth_var_info = {}
  34. for var_name in oth_var_value.columns:
  35. var_name_oth.append(var_name)
  36. oth_var_info[var_name] = oth_var_value.iloc[[0],:].loc[:,[var_name]]
  37. opt_config = sim_opt_config(
  38. target = 'Fs',
  39. dir_min = True,
  40. var_opt = var_name_opt,
  41. var_sys = var_name_oth,
  42. diag_model = False,
  43. algorithm = 'soea_DE_best_1_L_templet',
  44. NIND = 1000,
  45. MAXGEN = 200,
  46. constrains = constrains,
  47. allow_neg_opt = False,
  48. )
  49. opt_output = main_opt(
  50. *list(boundary_info.values()),
  51. *list(oth_var_info.values()),
  52. system_model = AirSystem(model=model),
  53. config = opt_config
  54. )
  55. return opt_output
  56. class AirSystem(SystemModel):
  57. def __init__(self,model):
  58. super().__init__()
  59. self.model = model
  60. def predict(self,data:pd.DataFrame) -> pd.DataFrame:
  61. time_start = time.time()
  62. self.PENALTY = {}
  63. self.index = data.index
  64. sys_out = self.model.predict_system(data)
  65. time_end = time.time()
  66. past_time = round(time_end-time_start,2)
  67. self.PAST_TIME.append(past_time)
  68. # print(f'第{len(self.PAST_TIME)}次调用系统模型,本次调用时长为:{past_time}秒 \n')
  69. return sys_out