Gurobi优化器使用(一)搭建并求解一个优化模型的过程 【C++环境】

  • Gurobi可以解决的问题
  • 文档
  • 实例——通过系数矩阵建模并求解
    • 解释
  • 实例——直接建模并求解
  • 求解结果
  • 如何读取一个已保存的模型

Gurobi可以解决的问题

文档

官方文档
8.1版本C++接口的官方文档

实例——通过系数矩阵建模并求解

当系数已存入到外部的模型文件中需要读取时可以采用该方法建模,否则不推荐这种方式.
待解决的问题如下:

/* 该例子解决下面的凸二次规划问题:minimize x + y + x^2 + x*y + y^2 + y*z + z^2subject to x + 2 y + 3 z >= 4x + y >= 1x, y, z 非负使用预定义的参数矩阵A和Q进行求解(一般在参数已存入外部数据时使用),否则不推荐使用稠密
矩阵的方法。
*/#include "gurobi_c++.h"
using namespace std;static bool dense_optimize(GRBEnv* env,int rows,int cols,double* c, /* 目标函数的线性系数项 */double* Q, /* 目标函数的二次项 */double* A, /* 约束矩阵 */char* sense, /* 约束不等关系(大于,小于) */double* rhs, /* 右端项向量 */double* lb, /* 变量下界 */double* ub, /* 变量上界 */char* vtype, /* 变量类型 ( continuous , binary , etc .) */double* solution,double* objvalP)
{GRBModel model = GRBModel(*env);int i, j;bool success = false;/* Add variables to the model */GRBVar* vars = model.addVars(lb, ub, NULL, vtype, NULL, cols);/* Populate A matrix */for (i = 0; i < rows; i++) {GRBLinExpr lhs = 0;for (j = 0; j < cols; j++)if (A[i * cols + j] != 0)lhs += A[i * cols + j] * vars[j];model.addConstr(lhs, sense[i], rhs[i]);}GRBQuadExpr obj = 0;for (j = 0; j < cols; j++)obj += c[j] * vars[j];for (i = 0; i < cols; i++)for (j = 0; j < cols; j++)if (Q[i * cols + j] != 0)obj += Q[i * cols + j] * vars[i] * vars[j];model.setObjective(obj);model.optimize();model.write(" dense.lp");if (model.get(GRB_IntAttr_Status) == GRB_OPTIMAL) {*objvalP = model.get(GRB_DoubleAttr_ObjVal);for (i = 0; i < cols; i++)solution[i] = vars[i].get(GRB_DoubleAttr_X);success = true;}delete[] vars;return success;
}
int main(int argc,char* argv[])
{GRBEnv* env = 0;try {env = new GRBEnv();double c[] = { 1, 1, 0 };double Q[3][3] = { {1 , 1, 0}, {0, 1, 1}, {0, 0, 1} };double A[2][3] = { {1 , 2, 3}, {1, 1, 0} };char sense[] = { '>', '>' };double rhs[] = { 4, 1 };double lb[] = { 0, 0, 0 };bool success;double objval, sol[3];success = dense_optimize(env, 2, 3, c, &Q[0][0], &A[0][0], sense, rhs,lb, NULL, NULL, sol, &objval);cout << "x: " << sol[0] << " y: " << sol[1] << " z: " << sol[2] << endl;}catch (GRBException e) {cout << " Error code = " << e.getErrorCode() << endl;cout << e.getMessage() << endl;}catch (...) {cout << " Exception during optimization " << endl;}delete env;return 0;
}
}

解释

  1. 构建Gurobi环境

    GRBEnv* env = 0;
    env = new GRBEnv();
    
  2. 建立模型的实例

    GRBModel model = GRBModel(*env);
    
  3. 添加优化变量

    GRBVar* vars = model.addVars(lb, ub, NULL, vtype, NULL, cols);GRBVar* addVars(const double* lb, const double* ub,const double* obj, const char* type,const std::string* name, int len);
    

    注意: 传入的是指针

  4. 添加约束

    model.addConstr(const GRBLinExpr& expr, char sense, double rhs,std::string name="");
    GRBLinExpr lhs = 0;
    

    ① GRBLinExpr是线性表示类,源代码通过运算符重载,使它可以表示为GRBVar* vars的线性组合.
    ② sense是char类型,指约束的不等关系,‘>’
    ③ rhs是不等式右边的项
    ④ 一次只能添加一个约束,可以放到循环里面

  5. 设置目标函数

    GRBQuadExpr obj = 0;
    

    目标函数是二次型,与GRBLinExpr一样的方式,不过obj可以表示为二次。

  6. 添加目标函数,并进行优化

    model.setObjective(obj);
    model.optimize();
    
  7. 保存优化好的模型

    model.write(" dense.lp");
    

    模型文件格式说明

  8. 打印优化结果

    if (model.get(GRB_IntAttr_Status) == GRB_OPTIMAL) {*objvalP = model.get(GRB_DoubleAttr_ObjVal);for (i = 0; i < cols; i++)solution[i] = vars[i].get(GRB_DoubleAttr_X);
    

    打印最优目标值和最优解

  9. 释放空间
    一般定义了指针的话需要手动释放变量和环境

    delete[] vars;
    delete env;
    

实例——直接建模并求解

这种建模方式直接了当.

/* 该例子解决下面的凸二次规划问题:minimize x + y + x^2 + x*y + y^2 + y*z + z^2subject to x + 2 y + 3 z >= 4x + y >= 1x, y, z 非负直接求解
*/#include "gurobi_c++.h"
using namespace std;int main(int argc, char* argv[])
{GRBEnv* env = 0;try {env = new GRBEnv();GRBModel model = GRBModel(* env);// Create VariablesGRBVar x = model.addVar(0, GRB_INFINITY, 1.0, GRB_CONTINUOUS, "x");GRBVar y = model.addVar(0, GRB_INFINITY, 1.0, GRB_CONTINUOUS, "y");GRBVar z = model.addVar(0, GRB_INFINITY, 1.0, GRB_CONTINUOUS, "z");model.setObjective(x + y + x * x + x * y + y * y + y * z + z * z, GRB_MINIMIZE);model.addConstr(x + 2 * y + 3 * z >= 4, "c0");model.addConstr(x +  y >= 1, "c1");// Optimize modelmodel.optimize();cout << x.get(GRB_StringAttr_VarName) << " "<< x.get(GRB_DoubleAttr_X) << endl;cout << y.get(GRB_StringAttr_VarName) << " "<< y.get(GRB_DoubleAttr_X) << endl;cout << z.get(GRB_StringAttr_VarName) << " "<< z.get(GRB_DoubleAttr_X) << endl;cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << endl;}catch (GRBException e) {cout << " Error code = " << e.getErrorCode() << endl;cout << e.getMessage() << endl;}catch (...) {cout << " Exception during optimization " << endl;}delete env;return 0;
}

求解结果

两种方法求解结果是一样的

如何读取一个已保存的模型

以.lp模型为例。

GRBModel model = GRBModel(*env, "dense.lp");GRBVar x = model.getVar(0);
GRBVar y = model.getVar(1);
GRBVar z = model.getVar(2);model.optimize();cout << x.get(GRB_StringAttr_VarName) << " "<< x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " "<< y.get(GRB_DoubleAttr_X) << endl;
cout << z.get(GRB_StringAttr_VarName) << " "<< z.get(GRB_DoubleAttr_X) << endl;
cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << endl;

大部分内容跟上面是类似的,只不过在model构造函数的时候,从filename中读取模型。然后再获得变量值,进行模型优化。值得注意的是,lp文件指保留了模型的信息,并没有保存上一次优化后的结果。因此需要重新优化一下方可显示结果。

Gurobi优化器使用(一)搭建并求解一个优化模型的过程【C++环境】相关推荐

  1. Pytorch优化器全总结(四)常用优化器性能对比 含代码

    目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...

  2. MySQL8.0 · 优化器新特性 · Cost Model, 直方图及优化器开销优化

    2019独角兽企业重金招聘Python工程师标准>>> MySQL当前已经发布到MySQL8.0版本,在新的版本中,可以看到MySQL之前被人诟病的优化器部分做了很多的改动,由于笔者 ...

  3. python中的优化器有哪些_Python中有哪些性能优化方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. 使用什么优化器_在机器学习项目中该如何选择优化器?

    导读 几种流行的优化器的介绍以及优缺点分析,并给出了选择优化器的几点指南. 本文概述了计算机视觉.自然语言处理和机器学习中常用的优化器.此外,你会找到一个基于三个问题的指导方针,以帮助你的下一个机器学 ...

  5. 听六小桨讲AI | 第3期:优化器及其三种形式BGD、SGD以及MBGD

    点击左上方蓝字关注我们 本栏目由百度飞桨工程师联手精心打造,对深度学习的知识点进行由浅入深的剖析和讲解.大家可视它为深度学习百科(面试秘籍也是可以哒),当然也可收藏为深度学习查询手册~ 大家好,我是助 ...

  6. 【机器学习基础】在机器学习项目中该如何选择优化器

    作者:Philipp Wirth   编译:ronghuaiyang 导读 几种流行的优化器的介绍以及优缺点分析,并给出了选择优化器的几点指南. 本文概述了计算机视觉.自然语言处理和机器学习中常用的优 ...

  7. 【Pytorch神经网络理论篇】 10 优化器模块+退化学习率

    1 优化器模块的作用 1.1 反向传播的核心思想 反向传播的意义在于告诉模型我们需要将权重修改到什么数值可以得到最优解,在开始探索合适权重的过程中,正向传播所生成的结果与实际标签的目标值存在误差,反向 ...

  8. 超参数调优河伯、组合优化器CompBO,华为诺亚开源贝叶斯优化库

    视学算法报道 编辑:陈萍.杜伟 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值问题.因其具 ...

  9. PostgreSQL 优化器代码概览

    简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...

  10. 华为诺亚开源贝叶斯优化库:超参数调优河伯、组合优化器CompBO

    ©作者 | 陈萍.杜伟 来源 | 机器之心 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值 ...

最新文章

  1. 未来几年,人工智能就业市场将会如何?
  2. Windows Forms高级界面组件-快捷菜单
  3. npm切换到淘宝镜像
  4. elasticsearch常见属性单词解释
  5. JavaScript实现唯一路径问题的回溯方法的算法(附完整源码)
  6. Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver 驱动问题处理办法
  7. delphi中Label中文显示不全的问题解决办法
  8. 一位00后前端2年经验的成长历程
  9. HTML中的table和div
  10. sql server managerment 给表加说明
  11. 快速开发字段很多的MIS表
  12. 《Web应用基础》课程结业报告
  13. 网站流量统计分析工具,谷歌seo网站流量统计分析工具推荐
  14. python怎样打开csv文件_如何在Python中打开CSV文件?
  15. 微信小程序连锁店如何做
  16. 生活污水处理设备让污水无处躲藏
  17. 万兆单模模块_万兆(10G SFP+)单模光模块的介绍及应用
  18. TS科普19 各种流(如:MP3、H264、H265等)在TS的流类型
  19. Vue2.x - Vue Router
  20. oracle中怎样获取当前月上个月的第一天和最后一天?

热门文章

  1. fp算法例题_机器学习-FPGROWTH算法.pptx
  2. About_CSDN
  3. DevExpress ChartControl 绘制圆滑曲线
  4. 微信打飞机java代码
  5. python模板匹配_python实现模板匹配
  6. C语言 简单的在线电子词典
  7. 迅雷界面引擎Bolt中编译失败的问题
  8. 基于matlab的暴雨强度公式参数推求,小样本流域降雨强度公式和设计降雨分布的推求方法...
  9. 关于videoplayer
  10. Cocos Creator 如何在 VideoPlayer 上面放置 UI 控件