1

Pyomo 可以找到解决方案,但它给出了以下警告:警告:将具有警告状态的 SolverResults 对象加载到模型 =(SecondCD)中;来自求解器的消息=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 可以找到解决方案,但会发出警告.

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

4

1 回答 1

0

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

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

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

于 2019-06-18T16:18:12.703 回答