Gurobi:使用Java+Gurobi建立一个小数学模型

2023-11-20

Gurobi:使用Java+Gurobi建立一个小数学模型

现在基本上都流行python+gurobi,java+cplex进行建模。但是由于java相较于python还是具有显著的速度优势,于是,我还是尝试了一下使用java来调用gurobi进行模型求解。
其实,操作都很简单,只是一些语句的区别,在此记录。

按变量进行建模

首先,引入gurobi包,并建立一个model。

import gurobi.*;
...
        GRBEnv env = new GRBEnv();
        GRBModel model = new GRBModel(env);

然后,先像模型中加入变量,语句为:
model.addVar(lb, ub, obj, type, "x");

        GRBVar[] x = new GRBVar[xNumber];
        for (int i = 0; i < xNumber; i++) {
            x[i] = model.addVar(0.0,Double.MAX_VALUE,1.0, GRB.CONTINUOUS, "x"_i));
        }

定义约束:
model.addConstr(lhsExpr, sense, rhsExpr, name);

        GRBLinExpr expr = new GRBLinExpr();
        expr.addTerm(1.0, x[0]);
        expr.addTerm(1.0, x[1]);
        model.addConstr(expr, GRB.LESS_EQUAL, 1.0, "cons1");

最后求解即可

		model.optimize();

按列进行建模

按列建模的方法也与按变量建模相似。只不过,我们将先进行约束相关的操作,最后再将变量加入到模型中。

首先,我们定义存放决策变量和约束的list。

        //定义决策变量
        ArrayList<GRBVar> x = new ArrayList<>();
        //定义约束
        GRBConstr[] cons = new GRBConstr[cons1Number];

接着,设置约束上下界。相关语句为:
model.addRange(expr, lb, ub, name);
注意!这里如果是等式需要设为两个约束,否则为一个空的expr设两个界会出一bug。

        for (int i = 0; i < cons1Number; i++) {
            GRBLinExpr expr = new GRBLinExpr();
            cons[i] = model.addRange(expr,0.0,Double.MAX_VALUE, "cons" + i );
        }

然后,我们开始加入变量,即将列加入模型中:

        GRBColumn column = new GRBColumn();
        column.addTerm(1.0, cons[0]);
        //将该列对应的变量加入model,并将该变量对应存到x中方便取用
        x.add(model.addVar(0.0, Double.MAX_VALUE, 1.0, GRB.CONTINUOUS, column,"x"));

最后,求解model即可。

模型的求解结果

是否有解:
masterPro.get(GRB.IntAttr.Status) == 2

目标函数值:
masterPro.get(GRB.DoubleAttr.ObjVal);

变量值:
x.get(i).get(GRB.DoubleAttr.X);

获取对偶变量的值:
double[] pi = model.get(GRB.DoubleAttr.Pi, cons);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gurobi:使用Java+Gurobi建立一个小数学模型 的相关文章

随机推荐

  • C++中的头文件和源文件的学习

    文章来源 博客园http www cnblogs com lidabo archive 2012 04 17 2454568 html 一 C 编译模式重点内容 通常 在一个C 程序中 只包含两类文件 cpp文件和 h文件 其中 cpp文件
  • Nvidia Apex安装与简单使用

    降低训练精度提高batch大小 512 512的图片在8G的显存上batch只能为1 2 使用了apex后可以增大到10 只支持pytorch 官网地址 NVIDIA apex 官方说支持Ubuntu系统 Windows只是实验性的 但是我
  • 这些mysql基础命令、基础知识还记得吗?(面试,学习,复习都可以)一万三千字总结

    mysql知识清单 详细 互联网通信 一 什么是互联网通信 二 互联网通信角色 三 通信模型 MySql关系型数据库服务器 一 介绍 二 名词解释 三 数据库服务器分类 四 卸载mysql服务器 五 基本信息 六 MySql服务器配置 七
  • Linux 桌面应用程序

    调研 要在Linux下开发具有图形界面的桌面应用程序 我们有许多选择 当然 除了语言方面的考虑外 我们更多的是考虑窗口部件工具箱 以前称为控件库或组件库 的选择 这将在很大程度上影响我们的开发效率 如果考虑到跨平台应用 选择Java的Swi
  • php array_diff 二位数组,PHP比较二维数组,求大神赐教

    一个参与活动名单的二维数组 arr1 array array name gt 张三 phone gt 1354459845 address gt 一街5号 array name gt 李四 phone gt 1323439845 addre
  • eclipse导入项目,项目名出现红叉的情况

    今天用eclipse导入同事发给我的一个项目之后 项目名称上面出现红叉 但是其他地方都没有红叉 仅仅是在项目名称上面有红叉 于是上网查了查资料记下来 1 导入项目之前 请确认工作空间编码已设置为utf 8 window gt Prefere
  • 想写一个安全服务工程师的培训教材或者手册

    最近有个朋友搞了个公司 打算找人接安服项目 让我找点安全培训的教材 看了一大圈的书籍目录感觉都比较片面 或者专注一个方面 对于一些几乎0基础的应届生或实习生来说不太能够在几个月时间内上手项目 csdn 知乎和百度上其他类似网站的0基础培训思
  • 【Shell牛客刷题系列】SHELL2 打印文件的最后5行:优雅的解决方案~

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Linux 欢迎关注专栏 本文知识预告 首先学习用于查看文件尾部内容的tail命令 然后给
  • iPhone: There is no SDK with the name or path iphoneos XXX

    for ever 2010 10 25 环境 MAC OS 10 6 4 老的iPhone 项目 使用最新的 XCode 3 2进行编译 报错 iPhone There is no SDK with the name or path iph
  • vue中组件的划分(重点)

    vue中组件的划分 重点 组件的职能划分 如果要将 Vue 组件按照职能划分 我们可以将其分为两种类型 容器组件和展示组件 容器组件和展示组件的概念来自于 Redux 文档 那么首先什么是容器组件呢 顾名思义 它是一个容器性质的组件 我们可
  • 如何在ubuntu安装powershell

    在Ubuntu上安装PowerShell可以通过以下步骤来完成 1 安装依赖软件 可以使用以下命令安装所需的依赖软件 sudo apt get install curl libunwind8 gettext apt transport ht
  • 使用postman怎么都访问不到项目,也不报错

    使用postman怎么都访问不到项目 也不报错 可能问题1 本地路径没有对应你访问的访问路径 在你的C盘下面的C Windows System32 drivers etc这个路径下找到host文件 你127 0 0 1 对应的是什么路径 你
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 在 spawn 的子进程中保持命令行颜色

    本文首发于我的博客 转载请注明出处 https kohpoll github io blo 最近在用子进程运行 gulpfile js 的时候发现终端上的颜色全部没有了 很是奇怪 经过一些研究 最终解决了问题 同时也总结了一些相关知识 希望
  • 锋利的jQuery(五)--jQuery对表单、表格的操作及更多应用

    5 1表单应用 一个表单有3个基本组成部分 1 表单标签 包含处理表单数据所用的服务器端程序URL以及数据提交到服务器的方法 2 表单域 包含文本框 密码框 隐藏域 多行文本框 复选框 单选框 下拉选择框和文件上传框等 3 表单按钮 包括提
  • 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(2)

    5 爱因斯坦阶梯 题目编号 Exp02 Basic10 GJBook3 04 15 题目名称 爱因斯坦阶梯 问题描述 设有阶梯 不知其数 但知 每步跨2阶 最后剩1阶 每步跨3阶 最后剩2阶 每步跨5阶 最后剩4阶 每步跨7阶 正好到楼顶
  • python文件运行路径设置,python获取程序执行文件路径的方法(推荐)

    1 获取当前执行主脚本方法 sys argv 0 和 file 1 sys argv 一个传给python脚本的指令参数列表 sys argv 0 是脚本的名字 一般得到的是相对路径 用os path abspath sys argv 0
  • Dubbo 默认线程池fixed

    SPI fixed public interface ThreadPool 线程池 param url 线程参数 return 线程池 Adaptive Constants THREADPOOL KEY Executor getExecut
  • linux共享内存面试题,linux系统工程师面试题(附答案)

    1 查看Linux系统当前单个共享内存段的最大值 命令 ipcs m ipcs a 2 用什么命令查询指定IP地址的服务器端口 题意应该是 nmap 和nbtscan 命令来扫吧 3 crontab中用什么命令定义某个程序执行的优先级别 n
  • Gurobi:使用Java+Gurobi建立一个小数学模型

    Gurobi 使用Java Gurobi建立一个小数学模型 按变量进行建模 按列进行建模 模型的求解结果 现在基本上都流行python gurobi java cplex进行建模 但是由于java相较于python还是具有显著的速度优势 于