如何知道优化问题是否不可行?Pyomo警告:问题可能不可行



Pyomo可以找到解决方案,但它给出了以下警告: 警告:将具有警告状态的求解器结果对象加载到 模型=(第二光盘); 来自求解器的消息=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,(例如:参数 b := 土地 1 劳动力 1 资本 1 肥料 1), Pyomo可以找到最佳解决方案;

但是如果我将 b 设置为 1 <(例如:参数 b := 土地 0.1 劳动力 0.1 资本 0.1 肥料 0.1),并设置 opt.options["tol"] = 1E-64,Pyomo 可以找到解决方案,但给出了警告。

我期望一个最佳解决方案,但实际结果给出了上述警告。

您收到的消息(message from solver=Ipopt 3.11.1x3a Converged to a locally infeasible point. Problem may be infeasible.)并不意味着该问题一定是不可行的。非线性求解器通常会为您提供局部最优,而获得求解的路径是找到"更好"的局部最优的非常重要的部分。当你尝试另一点时,你找到了一个可行的解决方案,这证明了你的问题是可行的。

现在,在寻找全局最优而不是局部最优时,这有点困难。找出答案的一种方法是检查您的问题是否是凸的。如果是,则意味着只有一个局部最优,并且这个局部最优是全局最优。这可以通过数学方式完成。请参阅快速谷歌搜索中的 https://math.stackexchange.com/a/1707213/470821 和 http://www.princeton.edu/~amirali/Public/Teaching/ORF523/S16/ORF523_S16_Lec7_gh.pdf)。如果你发现你的问题不是凸的,那么你可以尝试证明局部最优很少,并且可以通过良好的起点轻松找到它们。最后,如果无法做到这一点,您应该考虑更高级的技术,所有这些都有其优点和缺点。例如,您可以尝试生成一组起始解决方案,以确保涵盖问题的整个可行领域。另一个是使用元启发式方法来帮助您找到更好的起始解决方案。

此外,我相信 Ipopt 有一些工具可以帮助解决这个问题,即找到一个好的起始解决方案来改善生成的局部最优值。

最新更新