今天在学用KKT条件,算了电价导出,发现每个节点的电价都变-300了,给我弄迷糊了,怎么我用电还得电网给我贴钱(虽然上网查说确实会有这种情况?但总之在我这个模型里不太正常)。查了目标函数值,发现比较大,而且有几个变量取值都跑到边界上了,隐约感觉是边界条件限制得太紧了。加了个约束让目标函数值小于一个比当前求出的结果更小的值,让模型infeasible,输出ilp文件:
mPDN.update()
mPDN.Params.NonConvex = 2
mPDN.setObjective(relax_sum, GRB.MINIMIZE)
mPDN.setParam('DualReductions', 0)
mPDN.optimize()
print('PDN status: ', mPDN.Status)
if mPDN.Status == 3: # model is infeasible
mPDN.computeIIS()
mPDN.write("modelTestPDN.ilp")
if mPDN.Status == 2:
relax_sum_value = mPDN.ObjVal
(注意mPDN.setParam('DualReductions', 0)这句尽量只在模型infeasible or unbounded时再写,如果feasible就赶紧注释掉,不然会运行很慢,具体原因可以看我之前的记录gurobi求解时间过长)
看ilp文件发现,一堆free的边界中有几个>=-100000的:
free的边界意思是即使这些变量上下限都无穷,模型也不可解,我们可以排除它们。找到这几个>=的,发现这些都是用KKT时的对偶变量,那应该是说这些对偶变量的下限限制了模型的求解。因此我们去把这几个变量的下限改宽一点就好啦,解决!