6个版本

使用旧Rust 2015

0.3.4 2020年4月4日
0.3.3 2018年6月14日
0.3.2 2016年9月4日
0.3.1 2016年8月29日
0.1.1 2016年7月30日

#2121 in 算法


用于generic-bnp

MIT 许可证

115KB
2.5K SLoC

rust-gurobi

Guromi优化器的非官方Rust API。

注意

  • 此封装库不是Guromi官方支持的。
  • 还有很多工作尚未完成。

许可证

版权(c)2016,Yusuke Sasaki

本软件以MIT许可证发布,请参阅LICENSE


lib.rs:

此crate提供Guromi优化器的原始Rust API。

它支持某些类型的数学规划问题(例如,线性规划;LP,混合整数线性规划;MILP等)。

注意

  • 在使用此crate之前,您应安装Guromi并获取许可证。说明可在此处找到此处

  • 确保环境变量GUROBI_HOME设置为Guromi的安装路径(如C:\gurobi652\win64/opt/gurobi652/linux64)。

  • 在Windows上,工具链应该是MSVC ABI(它还需要Visual Studio或Visual C++构建工具)。如果您想使用MinGW-w64/MSYS2工具链的GNU ABI,您应该创建Guromi运行时DLL(例如gurobi65.dll)的导入库并将其放入GUROBI_HOME/lib。创建导入库的步骤如下

    $ pacman -S mingw-w64-x86_64-tools-git
    $ gendef - $(cygpath $GUROBI_HOME)/bin/gurobi65.dll > gurobi65.def
    $ dlltool --dllname gurobi65.dll --def gurobi65.def --output-lib $(cygpath $GUROBI}HOME)/lib/libgurobi65.dll.a
    

示例

extern crate gurobi;
use gurobi::*;

fn main() {
  let env = Env::new("logfile.log").unwrap();

  // create an empty model which associated with `env`:
  let mut model = env.new_model("model1").unwrap();

  // add decision variables.
  let x1 = model.add_var("x1", Continuous, 0.0, -INFINITY, INFINITY, &[], &[]).unwrap();
  let x2 = model.add_var("x2", Integer, 0.0, -INFINITY, INFINITY, &[], &[]).unwrap();

  // integrate all of the variables into the model.
  model.update().unwrap();

  // add a linear constraint
  model.add_constr("c0", &x1 + 2.0 * &x2, Greater, -14.0).unwrap();
  model.add_constr("c1", -4.0 * &x1 - 1.0 * &x2, Less, -33.0).unwrap();
  model.add_constr("c2", 2.0 * &x1 + &x2, Less, 20.0).unwrap();

  // integrate all of the constraints into the model.
  model.update().unwrap();

  // set the expression of objective function.
  model.set_objective(8.0 * &x1 + &x2, Minimize).unwrap();

  assert_eq!(model.get(attr::IsMIP).unwrap(), 1, "Model is not a MIP.");

  // write constructed model to the file.
  model.write("logfile.lp").unwrap();

  // optimize the model.
  model.optimize().unwrap();
  assert_eq!(model.status().unwrap(), Status::Optimal);

  assert_eq!(model.get(attr::ObjVal).unwrap() , 59.0);

  let val = model.get_values(attr::X, &[x1, x2]).unwrap();
  assert_eq!(val, [6.5, 7.0]);
}

依赖项

~420KB