You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中使用Google OR-Tools实现线性规划的SUM运算

在C#中使用Google OR-Tools实现线性规划的SUM运算

嘿,我来帮你搞定这个问题!Google OR-Tools的线性规划求解器提供了很直观的方式来添加SUM类的约束,下面我会一步步带你实现,再配上具体的代码示例。

第一步:准备工作

首先你得在项目里安装Google OR-Tools的NuGet包。打开NuGet包管理器,搜索Google.OrTools.LinearSolver并安装最新稳定版就行。

第二步:核心实现步骤

我们用一个简单的线性规划场景来举例:假设你有3个非负变量x0、x1、x2,需要满足它们的和等于10,同时最大化3*x0 + 2*x1 + x2的目标值。

1. 初始化求解器

首先创建线性规划求解器实例,OR-Tools支持多种后端求解器(比如GLOP、SCIP),这里我们用GLOP(适合线性规划的开源求解器):

using Google.OrTools.LinearSolver;

// 创建求解器实例
Solver solver = Solver.CreateSolver("GLOP");
if (solver == null)
{
    Console.WriteLine("无法创建求解器!");
    return;
}

2. 创建决策变量

定义我们的非负连续变量:

// 创建3个非负连续变量,范围0到无穷大
Variable x0 = solver.MakeNumVar(0.0, double.PositiveInfinity, "x0");
Variable x1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "x1");
Variable x2 = solver.MakeNumVar(0.0, double.PositiveInfinity, "x2");

Console.WriteLine($"创建了 {solver.NumVariables()} 个变量");

3. 添加SUM约束

这是关键部分!要实现变量的和等于10,有两种常用方式:

方式一:使用solver.MakeSum()快速构建求和约束

直接把变量列表传入MakeSum,然后设置等于目标值:

// 添加约束:x0 + x1 + x2 = 10
Constraint sumConstraint = solver.MakeConstraint(10.0, 10.0, "sum_constraint");
sumConstraint.SetCoefficient(x0, 1.0);
sumConstraint.SetCoefficient(x1, 1.0);
sumConstraint.SetCoefficient(x2, 1.0);

方式二:通过线性表达式构建求和(更灵活,适合带系数的情况)

如果你的SUM需要带系数(比如2*x0 + 3*x1 + x2 <= 15),可以用LinearExpr.Sum()或者手动构建线性表达式:

// 带系数的求和约束:2*x0 + 3*x1 + x2 <= 15
LinearExpr sumExpr = LinearExpr.Sum(new[] {
    LinearExpr.Mul(2.0, x0),
    LinearExpr.Mul(3.0, x1),
    x2
});
solver.Add(sumExpr <= 15.0, "weighted_sum_constraint");

4. 设置目标函数

接下来定义我们要最大化的目标:

// 设置目标函数:最大化3*x0 + 2*x1 + x2
Objective objective = solver.Objective();
objective.SetCoefficient(x0, 3.0);
objective.SetCoefficient(x1, 2.0);
objective.SetCoefficient(x2, 1.0);
objective.SetMaximization();

5. 求解并输出结果

最后调用求解器,获取结果:

// 求解
Solver.ResultStatus resultStatus = solver.Solve();

// 检查求解状态并输出结果
if (resultStatus == Solver.ResultStatus.OPTIMAL)
{
    Console.WriteLine("找到最优解!");
    Console.WriteLine($"目标值 = {solver.Objective().Value():F2}");
    Console.WriteLine($"x0 = {x0.SolutionValue():F2}");
    Console.WriteLine($"x1 = {x1.SolutionValue():F2}");
    Console.WriteLine($"x2 = {x2.SolutionValue():F2}");
}
else
{
    Console.WriteLine("未找到最优解,求解状态:" + resultStatus);
}

额外技巧:批量处理变量求和

如果你有大量变量(比如存在列表里),可以用循环批量添加系数,避免重复代码:

List<Variable> variables = new List<Variable> { x0, x1, x2 };
Constraint batchSumConstraint = solver.MakeConstraint(5.0, 15.0, "batch_sum");
foreach (var var in variables)
{
    batchSumConstraint.SetCoefficient(var, 1.0);
}

这样就搞定啦!你可以根据自己的实际需求调整变量类型(整数变量用MakeIntVar)、约束条件和目标函数。

内容的提问来源于stack exchange,提问作者Hudson Assis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:19:13