带有有界变量的C#LP/拉格朗日

本文关键字:拉格朗 C#LP 变量 | 更新日期: 2023-09-27 17:57:36

摘要:我该如何解决这个问题

你好,

我正在研究一个混合风格的最大化问题,其中我的变量将由极小值和极大值限定。我的问题的一个代表性例子可能是:

maximize: (2x-3y+4z)/(x^2+y^2+z^2+3x+4y+5z+10)
subj. to: x+y+z=1
          1 < x < 2
         -2 < y < 3
          5 < z < 8
where numerical coefficients and the minima/maxima are given.

我的最后一个项目涉及一个更复杂的问题,类似于上面的问题。问题的结构不会改变——只有系数和输入会改变。因此,在上面的例子中,我将寻找一组函数,这些函数可能允许C#程序快速确定x,然后是y,然后是像这样的z

x = f(given inputs)
y = f(given inputs,x)
z = f(given inputs,x,y)

很想听听你对这件事的看法!

谢谢!

带有有界变量的C#LP/拉格朗日

非线性最小化问题的标准优化方法是Levenberg-Marquardt算法:

  • Levenberg-Marquardt算法

但不幸的是,它并不直接支持您添加的线性约束。已经尝试了许多不同的方法来向Levenberg-Marquardt添加线性约束,并取得了不同的成功。

在这种情况下,我可以推荐的另一种算法是Simplex算法:

  • Nelder–Mead方法

与Levenberg-Marquardt一样,它也处理非线性方程,但处理线性约束,这些约束就像不连续性一样。这可以很好地适用于您上面的案例。

无论哪种情况,与其说这是一个编程问题,不如说这是算法选择问题。文献中充斥着算法,你只需搜索一下就可以找到上述任何一种的C#实现。

您也可以组合算法。例如,您可以使用带有约束的Simplex进行初步搜索,并在没有约束的情况下使用Levenberg-Marquardt对其进行细化。

如果你的问题是想高效地解决线性规划问题,你可以使用Cassowary.net或NSolver。

如果你的问题是有效地实现线性规划算法,你可能想阅读《组合优化:算法和复杂性》,它涵盖了短文《线性规划图解指南》中提供的单纯形算法的大部分细节,但也包括关于椭球算法的信息,这对于更复杂的约束系统可能更有效。

你的问题本身并没有什么特定于C#的东西,但标记它意味着你正在寻找C#的解决方案;因此,查看上面两个工具包的源代码可能会对您很有帮助。