如何知道优化问题是否不可行? Pyomo 警告:问题可能不可行
How to know if the optimization problem is infeasible or not? Pyomo Warning: Problem may be infeasible
Pyomo 可以找到解决方案,但它会给出以下警告:
警告:将具有警告状态的 SolverResults 对象加载到
型号=(第二CD);
message from 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, (e.g.: param b := land 1 labor 1 capital 1 fertilizer 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.1\x3a Converged to a locally infeasible point. Problem may be infeasible.
) 并不意味着该问题必然不可行。 non-linear 求解器通常会为您提供局部最优解,而获得解的路径是找到 "better" 局部最优解的一个非常重要的部分。当你用另一个点尝试时,你找到了一个可行解,那就证明你的问题是可行的。
现在,在寻找全局最优而不是局部最优时,这有点困难。找出答案的一种方法是检查您的问题是否是凸的。如果是,就意味着只会有一个局部最优,而这个局部最优就是全局最优。这可以用数学方法来完成。通过快速 Google 搜索查看 https://math.stackexchange.com/a/1707213/470821 and http://www.princeton.edu/~amirali/Public/Teaching/ORF523/S16/ORF523_S16_Lec7_gh.pdf)。如果您发现您的问题不是凸的,那么您可以尝试证明局部最优值很少,并且可以通过良好的起点轻松找到它们。最后,如果无法做到这一点,您应该考虑更先进的技术,它们各有利弊。例如,您可以尝试生成一组起始解决方案,以确保涵盖问题的整个可行领域。另一种方法是使用 meta-heuristics 方法来帮助您找到更好的起始解决方案。
另外,我相信 Ipopt 有一些工具可以帮助解决这个问题,即找到一个好的起始解决方案来改进最终的局部最优解。
Pyomo 可以找到解决方案,但它会给出以下警告: 警告:将具有警告状态的 SolverResults 对象加载到 型号=(第二CD); message from 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, (e.g.: param b := land 1 labor 1 capital 1 fertilizer 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.1\x3a Converged to a locally infeasible point. Problem may be infeasible.
) 并不意味着该问题必然不可行。 non-linear 求解器通常会为您提供局部最优解,而获得解的路径是找到 "better" 局部最优解的一个非常重要的部分。当你用另一个点尝试时,你找到了一个可行解,那就证明你的问题是可行的。
现在,在寻找全局最优而不是局部最优时,这有点困难。找出答案的一种方法是检查您的问题是否是凸的。如果是,就意味着只会有一个局部最优,而这个局部最优就是全局最优。这可以用数学方法来完成。通过快速 Google 搜索查看 https://math.stackexchange.com/a/1707213/470821 and http://www.princeton.edu/~amirali/Public/Teaching/ORF523/S16/ORF523_S16_Lec7_gh.pdf)。如果您发现您的问题不是凸的,那么您可以尝试证明局部最优值很少,并且可以通过良好的起点轻松找到它们。最后,如果无法做到这一点,您应该考虑更先进的技术,它们各有利弊。例如,您可以尝试生成一组起始解决方案,以确保涵盖问题的整个可行领域。另一种方法是使用 meta-heuristics 方法来帮助您找到更好的起始解决方案。
另外,我相信 Ipopt 有一些工具可以帮助解决这个问题,即找到一个好的起始解决方案来改进最终的局部最优解。