我有以下代码:
for v in model.component_objects(Var, active=True):
varobject = getattr(model, str(v))
for index in varobject:
if isinstance(varobject[index].domain, IntegerSet) or isinstance(varobject[index].domain, BooleanSet):
varobject[index].fixed = True
results = opt.solve(model, tee=True) variables
整数变量在首次运行后已固定,因此可以获取对偶变量。问题在于,对于一个约束,我得到的对偶变量的值与对于相同模型和数据使用gams所得到的对偶变量的值不同。即使我为不同的变量获得了相同的值。有人知道我做错了什么吗?预先感谢!
生成输出的函数:
def generate_output(df, file, variable, indices, column_name):
writer = pd.ExcelWriter(file, engine='xlsxwriter')
df_copy = df[(df[list({'variable_name': variable})] == pd.Series({'variable_name': variable})).all(axis=1)].drop('variable_name', 1)
mindex = pd.MultiIndex.from_tuples(df_copy['variable_index'], names=indices)
df_copy = pd.DataFrame(df_copy[['value']].values, index=mindex, columns=[column_name]).unstack('hour').reset_index()
df_copy.to_excel(writer, 'Tabelle1')
writer.save()
wb = op.reader.excel.load_workbook(file)
sh = wb['Tabelle1']
sh.delete_rows(3, 1)
wb.save(file)
答案 0 :(得分:0)
Solver惯例差异可能在起作用,或者公差值略有差异。
要对此进行测试,如果将Pyomo模型与GAMS求解器一起使用,会得到相同的结果吗? SolverFactory('gams').solve(model, tee=True, solver=???)
答案 1 :(得分:0)
我在对偶变量的值上遇到了类似的问题。
我对比了使用Xpress求解器(opt = SolverFactory(“ amplxpress”))和Gurobi求解器(opt = SolverFactory(“ gurobi”))从Fico Xpress客户端/终端和pyomo模型获得的结果。
在Fico Xpress中,与相等约束关联的对偶是> = 0,与> =约束关联的对偶是> = 0,而与<=约束关联的对偶是<= 0。
在Pyomo中,我发现与等式约束相关的对偶仍然> = 0,但是与不等式约束相关的对偶(> = 0或<= 0)总是<= 0。
我期望的相等约束的对偶差异不大(差异的大小可能取决于模型),而我期望的不平等约束的对偶差异很大(在幅度和符号上都存在很大差异), 可能不会表示来自pyomo的对偶必然不正确。
我正在使用与不平等约束相关的对偶作为价格(应为> = 0)来计算一些收入/利润,其中我在Fico Xpress中使用的方程式基于非负对偶。由于pyomo为我提供了非正对偶,因此即使pyomo的对偶值与Fico Xpress完全不同,我也可以对方程进行运算并获得相同的结果。
与模型关联的对偶可能具有特定的物理含义,您是否在处理对偶值之前就通过对偶进行操作来检查想要得到的结果的正确性?