Pyomo调用Gurobi求解器报错:多目标定义问题求助
问题排查与解决:Pyomo多目标函数报错
错误原因
你遇到的ValueError: More than one active objective defined是因为这段代码:
model.obj = Objective(model.T, rule=object_rule, sense=maximize)
当给Objective()传入索引集合model.T时,Pyomo会为集合里的每个时间周期a生成独立的目标函数obj[1]、obj[2]...,而线性规划求解器(包括Gurobi)只允许一个活跃目标函数,因此无法生成合法的LP文件。你的核心需求是最大化全周期总发电量,而非每个周期单独设目标,所以需要调整目标规则的定义。
修正代码
步骤1:修改目标规则为求和形式
将带索引的规则改为对所有时间周期的发电量求和:
def object_rule(model): # 对所有时间周期的发电量求和 return sum(K * model.Q[a] * (model.H[a] + model.H[a + 1]) / 2 * 8760 * 3600 / 1000 for a in model.T) # K为系数,Q为流量,H为水头,a代表时间周期
步骤2:重新定义Objective
去掉索引集合model.T,直接使用无索引的目标规则:
model.obj = Objective(rule=object_rule, sense=maximize)
额外检查
- 确保模型中没有其他已定义的Objective对象,如果之前定义过
model.obj或其他目标,需删除以避免重复。 - 确认
model.T集合的范围,保证a + 1不会超出索引边界(比如model.T是1到N时,a最大取N-1,否则会出现索引错误)。
内容的提问来源于stack exchange,提问作者dut_old_fish
相关产品推荐
相关产品推荐

