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

如何在Rust的good_lp库中定义类似PuLP的容差间隙?

如何在Rust的good_lp库中定义类似PuLP的容差间隙?

嘿,我刚好研究过good_lp库的相关配置,来给你讲讲怎么设置类似PuLP里的容差间隙~

首先得明确,PuLP里的容差间隙(比如MIP的相对间隙)是用来控制求解器停止条件的——当最优解的上下界差距小于你设定的百分比时,求解器就会提前停止,返回当前找到的最优可行解。在good_lp里,这个功能是通过配置底层求解器参数实现的,因为good_lp本身是封装了像CBC、GLPK这类经典求解器的,不同求解器的参数名会略有不同,下面我用默认的CBC求解器举例子:

具体步骤和代码示例

  1. 首先导入CBC求解器的模块,然后创建求解器实例时设置间隙参数
  2. 把原来代码里的default_solver替换成你自定义配置的求解器
use good_lp::{variables, variable, SolverModel, Solution, constraint};
use good_lp::solvers::cbc::CbcSolver; // 导入CBC求解器的相关模块

fn main() {
    // 声明二进制变量
    let mut vars = variables!();
    let x = vars.add(variable().binary());
    let y = vars.add(variable().binary());

    // 配置CBC求解器,设置相对间隙容差(比如0.01代表1%的间隙)
    let custom_solver = CbcSolver::new()
        .with_parameter("ratioGap", "0.01"); // 这个参数对应PuLP里的相对间隙设置

    // 创建模型并使用自定义配置的求解器
    let mut model = vars
        .maximise(2.5 * x - y)
        .using(custom_solver);

    // 补全约束(示例约束)
    model = model.with(constraint!(x + y <= 1));

    // 求解并输出结果
    match model.solve() {
        Ok(solution) => {
            println!("x 的值: {}", solution.value(x));
            println!("y 的值: {}", solution.value(y));
            println!("目标函数最优值: {}", solution.objective_value());
        }
        Err(e) => println!("求解出错啦: {}", e),
    }
}

额外说明

  • 如果你用的是GLPK求解器,相对间隙的参数名是mip_gap,配置的时候要改成GlpkSolver::new().with_parameter("mip_gap", "0.01"),记得先导入good_lp::solvers::glpk::GlpkSolver
  • 除了相对间隙,还可以设置绝对间隙(比如CBC的allowableGap参数),也就是当上下界的绝对差值小于某个数值时停止求解,根据你的实际需求选择就行
  • 要是不确定求解器支持哪些参数,可以去查对应底层求解器的官方文档,good_lp只是把参数直接传递给底层求解器,所以参数名和底层求解器的命令行/API参数是一致的

备注:内容来源于stack exchange,提问作者hallo007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:00:28