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

如何使用OR-Tools和C#修改已创建线性变量的类型?

在OR-Tools C#封装中修改变量类型的方案

在OR-Tools的C#封装里,无法直接修改已创建变量的类型(比如从整数变量转为连续变量)。Variable对象的类型是在初始化时确定的,一旦创建就无法变更。不过可以通过以下两种替代方案实现类似需求:

方案1:创建新变量并替换约束中的引用

如果已经创建了整数变量并添加到约束中,可以创建一个新的连续变量,将原约束里的旧变量系数置为0,再添加新变量的系数,最后移除旧变量避免混淆。

示例代码:

using Google.OrTools.LinearSolver;

class VariableRelaxationExample
{
    static void Main()
    {
        // 初始化求解器(这里用GLOP,若需整数规划可切换为CBC等)
        Solver solver = Solver.CreateSolver("GLOP");
        if (solver == null) return;

        // 1. 创建初始整数变量
        Variable xInt = solver.MakeIntVar(0.0, 10.0, "x_int");
        System.Console.WriteLine($"初始变量类型: {xInt.VarType()}"); // 输出INTEGER

        // 2. 添加包含该变量的约束
        Constraint constraint = solver.MakeConstraint(-double.MaxValue, 15.0, "max_limit");
        constraint.SetCoefficient(xInt, 2.0);

        // 3. 松弛为连续变量:创建新的连续变量
        Variable xContinuous = solver.MakeNumVar(0.0, 10.0, "x_continuous");

        // 4. 替换约束中的变量引用
        constraint.SetCoefficient(xInt, 0.0); // 移除旧变量的系数
        constraint.SetCoefficient(xContinuous, 2.0); // 添加新变量的系数

        // 可选:移除旧变量,避免模型中存在冗余变量
        solver.RemoveVariable(xInt);

        // 5. 验证新变量类型并求解
        System.Console.WriteLine($"松弛后变量类型: {xContinuous.VarType()}"); // 输出CONTINUOUS

        // 设置目标函数
        Objective objective = solver.Objective();
        objective.SetCoefficient(xContinuous, 1.0);
        objective.SetMaximization();

        Solver.ResultStatus status = solver.Solve();
        if (status == Solver.ResultStatus.OPTIMAL)
        {
            System.Console.WriteLine($"最优解: x = {xContinuous.SolutionValue()}");
        }
    }
}

方案2:提前通过参数控制变量类型

如果可以提前预判是否需要松弛变量,建议在初始化时用参数直接控制变量类型,这样无需后续修改,代码更简洁。

示例代码:

using Google.OrTools.LinearSolver;

class ParameterizedVariableExample
{
    static void Main()
    {
        Solver solver = Solver.CreateSolver("GLOP");
        if (solver == null) return;

        // 用参数控制是否松弛为连续变量
        bool relaxToContinuous = true; // 改为false则创建整数变量
        Variable x;

        if (relaxToContinuous)
        {
            x = solver.MakeNumVar(0.0, 10.0, "x");
        }
        else
        {
            x = solver.MakeIntVar(0.0, 10.0, "x");
        }

        System.Console.WriteLine($"当前变量类型: {x.VarType()}");

        // 后续构建约束、目标函数逻辑保持一致
        Constraint constraint = solver.MakeConstraint(-double.MaxValue, 15.0, "max_limit");
        constraint.SetCoefficient(x, 2.0);

        Objective objective = solver.Objective();
        objective.SetCoefficient(x, 1.0);
        objective.SetMaximization();

        Solver.ResultStatus status = solver.Solve();
        if (status == Solver.ResultStatus.OPTIMAL)
        {
            System.Console.WriteLine($"最优解: x = {x.SolutionValue()}");
        }
    }
}

内容的提问来源于stack exchange,提问作者José Joaquim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:01:12