Pyomo可以找到一个解决方案,但是它给出以下警告: 警告:将带有警告状态的SolverResults对象加载到 型号=(SecondCD); 来自solver = Ipopt 3.11.1 \ x3a的消息收敛到本地不可行点。问题可能不可行。
我怎么知道问题是不可行的?
这个pyomo模型优化了农场对投入物分配的决策。
model.Crops = Set() # set Crops := cereal rapes maize ;
model.Inputs = Set() # set Inputs := land labor capital fertilizer;
model.b = Param(model.Inputs) # Parameters in CD production function
model.x = Var(model.Crops, model.Inputs, initialize = 100, within=NonNegativeReals)
def production_function(model, i):
return prod(model.x[i,j]**model.b[j] for j in model.Inputs)
model.Q = Expression(model.Crops, rule=production_function)
...
instance = model.create_instance(data="SecondCD.dat")
opt = SolverFactory("ipopt")
opt.options["tol"] = 1E-64
results = opt.solve(instance, tee=True) # solves and updates instance
instance.display()
如果我设置b> = 1,(例如:param b:=土地1劳动1资本1肥料1), pyomo可以找到最优解;
但是如果我将b设置为<1(例如:参数b:=土地0.1劳动力0.1资本0.1肥料0.1),并设置opt.options [“ tol”] = 1E-64,pyomo可以找到解决方案,但是发出警告。
我期望有一个最佳的解决方案,但实际结果给出了上述警告。
答案 0 :(得分:0)
您收到(message from solver=Ipopt 3.11.1\x3a Converged to a locally infeasible point. Problem may be infeasible.
)的消息并不表示该问题必然是不可行的。非线性求解器通常会为您提供一个局部最优值,而到达解决方案的路径是找到“更好的”局部最优值的非常重要的部分。当您尝试另一点时,您找到了可行的解决方案,这证明您的问题是可行的。
现在,在寻找全局最优而不是局部最优时,这会有点困难。一种找出方法是检查您的问题是否凸出。如果是,则意味着将只有一个局部最优,并且该局部最优是全局最优。这可以在数学上完成。请从快速的Google搜索中查看https://math.stackexchange.com/a/1707213/470821和http://www.princeton.edu/~amirali/Public/Teaching/ORF523/S16/ORF523_S16_Lec7_gh.pdf。如果发现问题不是凸出的,则可以尝试证明几乎没有局部最优,并且可以很容易地找到一个好的起点。最后,如果无法做到这一点,则应考虑更高级的技术,并结合其利弊。例如,您可以尝试生成一组初始解决方案,以确保您覆盖问题的整个可行领域。另一种方法是使用元启发式方法来帮助您找到更好的入门解决方案。
此外,我敢肯定Ipopt拥有一些工具来帮助解决这个问题,寻找一个好的起始解决方案来改善最终的局部最优。