from .._utils.config_info import ConfigInfo def main(config:dict) -> list: config_info = ConfigInfo(config) constrains_range = config_info.get_property('constrains_range',default=None) constrains_dyn = config_info.get_property('constrains_dyn',default=None) constrains_fml = config_info.get_property('constrains',default=None) all_constrains = [] all_constrains += get_range_constrains(constrains_range) all_constrains += get_dyn_change_constrains(constrains_dyn) all_constrains += get_formula_constrains(constrains_fml) print('-'*20+'约束条件'+'-'*20) for idx,constrains in enumerate(all_constrains): print('-'*20+ str(idx) +'-'*20) print(constrains) return all_constrains def get_range_constrains(range_constrains:list): constrains = [] if range_constrains is None: return constrains for obj_var in range_constrains: var_name_raw = obj_var['var_name'] var_name = '{' + var_name_raw + '}' ub = obj_var.get('ub') lb = obj_var.get('lb') if ub is not None and ub != '': constrains.append(f'#表单边界性约束# {var_name}-({ub})<0') if lb is not None and lb != '': constrains.append(f'#表单边界性约束# ({lb})-{var_name}<0') return constrains def get_dyn_change_constrains(config): # (以下变化是指优化前后的变化) # 目标变量 变化值 d_p # 目标状态 值 S (0/1) # 环境状态 变化值 d_S (0/1) # 当环境点位出现变化时,允许目标点位有大范围的变化(c_w),否则只允许小范围变化(c_n) # d_S * ( c_w - c_n ) + c_n < d_p < d_S * ( c_w - c_n ) + c_n # 当目标点位状态为0时,允许目标点位有最大范围的变化,从而减小约束对于可行解数量的负面影响 # D_s = d_S + ( 1 - S ) * 100 # D_s * ( c_w - c_n ) + c_n < d_p < D_s * ( c_w - c_n ) + c_n return [] def get_formula_constrains(constrains_fml:list): constrains = [] if constrains_fml is None: return constrains constrains = [cst['constrain'] for cst in constrains_fml if cst is not None] return constrains