如何理解解决增强拉格朗日问题的代码中出了什么问题?

计算科学 优化 凸优化 约束优化
2021-12-20 06:05:53

我对优化很陌生。所以,对不起,如果我问一个简单的问题。我有十几个变量的问题。我想使用增强拉格朗日来解决问题。我根据方法(在matlab中)编写了一个代码。不幸的是,代码不起作用而且我不知道如何理解出了什么问题?

如何调试增强拉格朗日程序?是否有检查变量更改以了解错误来源的方法?或者您能否提供一些关于如何调试增强拉格朗日代码的提示或见解?

1个回答

很难为这个问题提供有用的答案,因为您没有提供有关您的问题和您已经尝试过的内容的足够详细信息。

在多种条件下,增广拉格朗日方法肯定会渐近收敛到最优解。您应该确保您尝试解决的问题满足这些条件,以便您正在做的事情有一个合理的理论基础。

在增强拉格朗日方法中,您在每次主要迭代中求解一个无约束的最小化问题。如果您用于解决该无约束问题的过程无法正常工作,那么整个方法很容易无法收敛到解决方案。

增强拉格朗日方法利用了一个惩罚参数,该惩罚参数可以在算法的每次主要迭代后进行调整。理论上,如果使用足够大的惩罚参数,该方法可以保证收敛。在实践中,使用过大的惩罚参数会导致难以解决无约束的最小化问题并减慢收敛速度。
从错误的参数值开始(太大或太小)或不正确地调整参数(没有增加足够的惩罚)可能导致收敛缓慢或完全失败。根据我的经验,几乎总是需要进行一些实验来调整惩罚参数,以便在一类新问题上实现良好的收敛。

您还没有说该方法是完全失败还是只是缓慢地收敛到您的问题上。对于习惯于基于牛顿方法的快速二次收敛的用户来说,看到增强拉格朗日方法的较慢收敛可能会令人沮丧。在实践中,您通常只能获得精确到几位数的解决方案。如果您需要精确到 8-10 位的解决方案,那么增强拉格朗日方法可能不是最好的方法。

我对调试的建议是:

  1. 确保你已经得到了你正在考虑的问题类别的理论收敛结果。

  2. 确保您的代码在每次迭代中正确地最小化增广拉格朗日。稍后您可能能够摆脱不精确的解决方案,但对于调试,我只是尝试获得您可以获得的最佳准确性。

  3. 调整惩罚参数,以便您以相当快的速度收敛到可行性。

您显然应该在每次主要迭代后监控解决方案的可行性。假设约束被合理地缩放,简单地计算约束违反的范数通常是一个很好的衡量标准。您还可以跟踪拉格朗日乘数的演变,以查看它们是否收敛到某些固定值。

如果您可以使用其他一些可靠的求解器,您可以先使用该求解器来解决您的问题,这样您就知道最佳解决方案是什么样的。