摘要:我将如何解决此问题?
你好,
我正在研究混合风格的最大化问题,其中我的变量将受最小值和最大值的限制。我的问题的一个代表性例子可能是:
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)
很想听听你对这个的想法!
谢谢!
答案 0 :(得分:2)
针对您的问题类型(非线性最小化)的标准优化方法是Levenberg-Marquardt算法:
但遗憾的是它并不直接支持您添加的线性约束。已经尝试了许多不同的方法来为Levenberg-Marquardt添加线性约束,并取得了不同的成功。
我在这种情况下推荐的另一种算法是Simplex算法:
与Levenberg-Marquardt一样,它也适用于非线性方程,但处理的线性约束就像不连续一样。这可能适合您的情况。
在任何一种情况下,这都不是算法选择问题的编程问题。文献中充斥着算法,您可以通过一些搜索找到上述任何一种的C#实现。
您还可以组合算法。例如,您可以使用带有约束的Simplex进行初步搜索,并使用Levenberg-Marquardt对其进行优化,而不受约束。
答案 1 :(得分:0)
如果您的问题是要有效解决线性编程问题,可以使用Cassowary.net或NSolver。
如果您的问题是有效地实施线性编程算法,您可能需要阅读Combinatorial Optimization: Algorithms and Complexity,其中涵盖了简短文本An Illustrated Guide to Linear Programming中提供的大部分细节中的Simplex算法,但也包含有关椭球算法,对于更复杂的约束系统可以更有效。
对于你的问题,没有任何内在的C#特定,但用它标记它意味着你正在寻找C#中的解决方案;因此,查看上述两个工具包的源代码可能对您有用。