具有有界变量的C#LP / Lagrange

时间:2011-05-25 21:10:30

标签: c# math mathematical-optimization linear-programming

摘要:我将如何解决此问题?

你好,

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

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)

很想听听你对这个的想法!

谢谢!

2 个答案:

答案 0 :(得分:2)

针对您的问题类型(非线性最小化)的标准优化方法是Levenberg-Marquardt算法:

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

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

与Levenberg-Marquardt一样,它也适用于非线性方程,但处理的线性约束就像不连续一样。这可能适合您的情况。

在任何一种情况下,这都不是算法选择问题的编程问题。文献中充斥着算法,您可以通过一些搜索找到上述任何一种的C#实现。

您还可以组合算法。例如,您可以使用带有约束的Simplex进行初步搜索,并使用Levenberg-Marquardt对其进行优化,而不受约束。

答案 1 :(得分:0)

如果您的问题是要有效解决线性编程问题,可以使用Cassowary.netNSolver

如果您的问题是有效地实施线性编程算法,您可能需要阅读Combinatorial Optimization: Algorithms and Complexity,其中涵盖了简短文本An Illustrated Guide to Linear Programming中提供的大部分细节中的Simplex算法,但也包含有关椭球算法,对于更复杂的约束系统可以更有效。

对于你的问题,没有任何内在的C#特定,但用它标记它意味着你正在寻找C#中的解决方案;因此,查看上述两个工具包的源代码可能对您有用。