[Python] AMPLPY: How to reset/update the parameter after solving the AMPL model?

Discussão em 'Python' iniciado por Stack, Março 12, 2025.

  1. Stack

    Stack Membro Participativo

    This is a Python code segment for solving an optimal power flow problem:

    if self.ini_state:
    solver.read(self.pb_path[0]) # Problem parameters
    solver.param['BaseMVA'] = 1
    solver.param['RefAngle'] = self.ref_angle
    solver.set_data(data=pd.DataFrame(self.params_dict['bus'], index=list(range(1, len(self.params_dict['bus']['bus_Pd']) + 1))), set_name='BUS')
    solver.set_data(data=pd.DataFrame(self.params_dict['branch'], index=list(range(1, len(self.params_dict['branch']['branch_fbus']) + 1))), set_name='BRANCH')
    solver.set_data(data=pd.DataFrame(self.params_dict['gen'], index=list(range(1, len(self.params_dict['gen']['gen_bus']) + 1))), set_name='GEN')
    solver.set_data(data=pd.DataFrame(self.params_dict['boundbus'], index=list(range(1, len(self.params_dict['boundbus']['boundbus_idx']) + 1))), set_name='BOUNDBUS')
    solver.read(self.pb_path[1]) # ACOPF problem
    self.ini_state = False
    else:
    solver.set_data(data=pd.DataFrame(self.params_dict['boundbus'], index=list(range(1, len(self.params_dict['boundbus']['boundbus_idx']) + 1))), set_name='BOUNDBUS')
    self.epoch += 1
    for var in self.sol_dict.keys():
    solver.getVariable(var).setValues(pd.Series(self.sol_dict[var], index=list(range(1, len(self.sol_dict[var]) + 1))))
    solver.option["solver"] = "ipopt"
    solver.option["ipopt_options"] = "warm_start_init_point = yes"
    solver.get_output("solve;")


    After solving, the parameter in self.params_dict['boundbus'] is changed. To improve computational efficiency, I want to update only this parameter instead of reloading the entire problem model. I attempted to do this with:

    solver.set_data(data=pd.DataFrame(self.params_dict['boundbus'], index=list(range(1, len(self.params_dict['boundbus']['boundbus_idx']) + 1))), set_name='BOUNDBUS')


    However, AMPL throws a runtime error: "set BOUNDBUS already defined". Is there a valid way to update the parameter without redefining the entire model?

    Continue reading...

Compartilhe esta Página