带有有界变量的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)
很想听听你对这件事的看法!
谢谢!
非线性最小化问题的标准优化方法是Levenberg-Marquardt算法:
- Levenberg-Marquardt算法
但不幸的是,它并不直接支持您添加的线性约束。已经尝试了许多不同的方法来向Levenberg-Marquardt添加线性约束,并取得了不同的成功。
在这种情况下,我可以推荐的另一种算法是Simplex算法:
- Nelder–Mead方法
与Levenberg-Marquardt一样,它也处理非线性方程,但处理线性约束,这些约束就像不连续性一样。这可以很好地适用于您上面的案例。
无论哪种情况,与其说这是一个编程问题,不如说这是算法选择问题。文献中充斥着算法,你只需搜索一下就可以找到上述任何一种的C#实现。
您也可以组合算法。例如,您可以使用带有约束的Simplex进行初步搜索,并在没有约束的情况下使用Levenberg-Marquardt对其进行细化。
如果你的问题是想高效地解决线性规划问题,你可以使用Cassowary.net或NSolver。
如果你的问题是有效地实现线性规划算法,你可能想阅读《组合优化:算法和复杂性》,它涵盖了短文《线性规划图解指南》中提供的单纯形算法的大部分细节,但也包括关于椭球算法的信息,这对于更复杂的约束系统可能更有效。
你的问题本身并没有什么特定于C#的东西,但标记它意味着你正在寻找C#的解决方案;因此,查看上面两个工具包的源代码可能会对您很有帮助。