前言
在工作中遇到两个需求,将两个数学公式用 .NET 的数学库找到数学公式中某个未知数的最优解,我尝试了几个数学库都没有办法完美解决我的需求,直到找到 Optano.Modeling
Optano.Modeling 官网:Optano.Modeling 官网
Optano.Modeling 是什么?
Optano.Modeling 是一个基于 .NET 平台的开源的建模库,用于数学优化和线性规划问题的建模和求解。它提供了一组丰富的功能和 API,使用户能够轻松地定义和解决各种优化问题。
Optano.Modeling 库提供了一个灵活且易于使用的对象导向接口,使您可以通过定义变量、目标函数、约束条件等来构建您的优化模型。它支持多种类型的变量(例如整数、布尔、连续)和多种优化问题(例如线性规划、混合整数规划、二次规划等)。
Optano.Modeling 库还允许用户选择不同的求解器来求解优化问题。它支持多个求解器,包括开源求解器(如 GLPK、CBC)和商业求解器(如Gurobi、CPLEX),根据用户的需求和许可证选择最合适的求解器。
Optano.Modeling 库的使用非常灵活和可扩展,您可以以编程方式使用 C#来构建和求解优化模型。该库提供了丰富的文档和示例代码,以帮助用户更好地理解和使用 Optano.Modeling。
总而言之,Optano.Modeling 是一个功能强大且易于使用的建模库,用于在数学优化和线性规划领域构建和求解优化问题。它为用户提供了灵活性和效率,以解决各种优化挑战。
怎么用 ?
看一下下面的需求
公式:X+Y = A+F-M-G+V
求解目标:在满足约束下,使得 X 最大
约束条件:
52 ≤ Y ≤ 124
X ≥ 23
根据以上,求得 X 、Y
测试数据
A=32
F=68
M=45
G=89
V=301
结果
X=215
Y=52
第一步:导包
有两个选择一个是去 Nuget 官方库 中搜索 OPTANO Modeling
然后在 Visual Studio 的 Nuget 包控制台通过命令下载。
第二种是直接在 Visual Studio 自带的 Nuget 库中下载
需要下载两个包: OPTANO Modeling
简单理解是用来构建函数的,即建模库;Gurobi
是用来求解函数的,即求解器。
第二步:编码
接下来就来到快乐的编码环节了~
namespace MathStore
{
internal class Require
{
public static void Main(string[] args)
{
double A = 32;
double F = 68;
double M = 45;
double G = 89;
double V = 301;
double Sum = A+F-M-G+V;
// 创建优化模型
Model model = new Model();
// 添加变量,这里参数不明白的可以转到定义中去看一下官方注释
var X = new Variable("X", 23, double.PositiveInfinity, VariableType.Continuous); //A
var Y = new Variable("Y", 52, 124, VariableType.Continuous);//B
model.AddVariable(X);
model.AddVariable(Y);
// 添加目标函数,目标函数什么意思,猜一下,就是需要被算出最优解的函数,在我们的需求中是要使 X 最大,那么我们的求解目标就是找到 X 的最优解
Objective objective = new Objective(X);
//Maximize:最大,如果需求是 X 的最小呢?应该引用什么参数?Minimize:最小
objective.Sense = ObjectiveSense.Maximize;
//将目标函数添加进模型中
model.AddObjective(objective);
// 添加约束条件
model.AddConstraint(X+Y == Sum);
model.AddConstraint(Y >= 52);
model.AddConstraint(Y <= 124);
model.AddConstraint(X >= 23);
// 求解线性规划问题
var solver = new GurobiSolver(); // 使用Gurobi作为求解器,也可以选择其他求解器
var solution = solver.Solve(model);
// 输出解决方案
Console.WriteLine($"优化状态: {solution.Status}");
Console.WriteLine($"X 的最优解: {solution.GetVariableValue("A")}");
Console.WriteLine($"Y 的最优解: {solution.GetVariableValue("B")}");
// 在 model 中变量名是从 A 起始的,按照向 model 中添加变量的顺序依次从 A 往后面排
}
}
}
第三步:运行结果
结语
OK,教程到此结束。