从本期开始阅读开源求解器coin_or的源码。整体项目介绍见https://blog.csdn.net/kittyzc/article/details/100182189
第一篇从clp开始。

1. 上手

1.1 快速使用

首先是简单的调用测试,在mac上首先安装clp的库:brew install coin-or-tools/coinor/clp,然后新建项目进行调用,各项配置如下:

使用这种方法没有办法debug细节。

1.2 命令行方式

>>> Clp
>>> Clp:import p0033.mps
>>> Clp: dualS
>>> Clp: solu sol.txt

或者干脆写成一行:

>>> clp p0033.mps -primalS
Coin LP version 1.17.3, build Dec  4 2020
command line - clp p0033.mps -primalS
At line 15 NAME          P0033
At line 16 ROWS
At line 34 COLUMNS
At line 109 RHS
At line 118 BOUNDS
At line 152 ENDATA
Problem P0033 has 16 rows, 33 columns and 98 elements
Model was imported from ./p0033.mps in 0.000231 seconds
Presolve 15 (-1) rows, 32 (-1) columns and 97 (-1) elements
0  Obj 0 Primal inf 18.49249 (10) Dual inf 5.5987499e+11 (32)
26  Obj 2520.5717
Optimal - objective value 2520.5717
After Postsolve, objective 2520.5717, infeasibilities - dual 0 (0), primal 0 (0)
Optimal objective 2520.571739 - 26 iterations time 0.002, Presolve 0.00

关键词清单如下:

allS(lack) barr(ier) basisI(n) basisO(ut) directory dualS(implex)either(Simplex) end exit export gsolu(tion) guess import max(imize) min(imize)para(metrics) primalS(implex) printM(ask) quit restoreS(olution) saveS(olution)solu(tion) solv(e) stat(istics) stop

2. 基本函数

最基本的结构如下:

2.1 获取结果

调用求解的函数为primal(),求解后的信息可以通过下列函数获取:

2.2 通用求解配置

2.3 单纯形法求解配置

2.4 presolve

调用方法如下,首先加ClpPresolve.hpp

2.5 状态函数


调用和设置函数如下:

// Get row status...
Status status=model.getRowStatus(sequenceNumber)
// ... or get column status.
Status status=model.getColumnStatus(sequenceNumber)
// Set row status to basic (for example)...
model.setRowStatus(sequenceNumber,ClpSimplex::basic)
// ... or column status to basic.
model.setColumnStatus(sequenceNumber,ClpSimplex::basic)

3. 进阶函数

3.1 pivot选项

在prime simplex中,任何非基变量都可以用作pivot;在dual simplex中,任何基变量都可以用于pivot。
对于dual simplex,基础类叫做ClpDualRowPivot,实现的两个instances是ClpDualRowDantzig 和 ClpDualRowSteepest。
调用方法如下:

ClpDualRowSteepest steep(1); // 0 uninitialized, 1 compute weights
model.setDualRowPivotAlgorithm(steep);

3.2 参数矩阵

如果全是正负1,可以用ClpPlusMinusOneMatrix。建立一个CoinPackedMatrix的instance:matrix,调用方法如下:

ClpPlusMinusOneMatrix plusMinus(matrix);
assert (plusMinus.getIndices()); // would be zero if not +- one
model.loadProblem(plusMinus, lowerColumn,upperColumn, objective, lower,upper);

对于网络流问题,每一列只有一个参数,可以用ClpNetworkMatrix,调用方法如下:

ClpNetworkMatrix network(numberColumns,head,tail);
model.loadProblem(network,  lowerColumn, upperColumn, objective,  lower, upper);

此时clp会使用网络流的方法去求解。

3.3 打印日志

如果什么都不想打印,可以设置model.setLogLevel(int value)中的value为0。
也可以自定义文件日志:

FILE * fp; // assumed open
CoinMessageHandler handler(fp);
model.passInMessageHandler(&handler);

4. 示例文件说明

按照说明文档进行分类说明:

4.1 基本示例文件

  • MINIMUMCPP:读取mps文件并求解
  • DEFAULTSCPP:参数设置与读取示例,包括求解参数、结果参数;如何设置warm start;
/* Status of problem:0 - optimal1 - primal infeasible2 - dual infeasible3 - stopped on iterations etc4 - stopped due to errors
*/
std::cout << "Model status is " << model.status()
  • DRIVERCPP:设置SolveType、开启presolve
ClpSolve solvectl;
solvectl.setSolveType(ClpSolve::useDual);
# solvectl.setSolveType(ClpSolve::useBarrier);
solvectl.setPresolveType(ClpSolve::presolveOn);
model.initialSolve(solvectl);
  • NETWORKCPP:如何读取非mps文件
ClpSimplex  model;
CoinPackedMatrix matrix;
int * lengths = NULL;
matrix.assignMatrix(true, numberRows, numberColumns, 2 * numberColumns, element, row, start, lengths);
ClpNetworkMatrix network(matrix);
model.loadProblem(network, lowerColumn, upperColumn, objective,lower, upper);
  • TESTBARRIERCPP:使用barrier方法的例子
ClpInterior  model;
int status = model.readMps( "../p0033.mps", true);
ClpCholeskyDense * cholesky = new ClpCholeskyDense();
model.setCholesky(cholesky);
model.primalDual();
// crossover的后处理算法,保证用内点法求解到的是一个顶点,而且是最近的那个顶点。
ClpSimplex model2(model);
model2.createStatus();
model2.primal(1);

4.2 其他示例文件

  • DUALCUTSCPP:cut的基本使用方法
  • DECOMPOSECPP:Dantzig-Wolfe decomposition的示例。
  • SPRINTCPP:求解long,thin的模型。

运筹系列77:开源线性规划软件clp使用简介相关推荐

  1. 简账(开源记账软件)-前端环境简介及部署

    文章目录 简账(开源记账软件)-前端环境简介及部署 前言 一.前端主要技术栈简介 具体涉及的技术如下所示: Q&A 二.环境部署 1. 安装nodejs 2. 从Github上下载代码 3. ...

  2. 运筹系列2:线性规划两阶段法python代码

    提示:本文参考了scipy的linprog源码,对源码感兴趣的小伙伴可以直接去读源码,注释真的是非常详尽了,比代码都长. 1. 补充问题 上一节中的代码在运行时还有很多细节没有处理,这里补充两个比较重 ...

  3. 这13个开源GIS软件,你了解几个?【转】

    泰伯网有看点的空间地理信息资讯都在这,你还在等什么? 这些开源GIS软件,你了解几个?本文内容部分来源于一份罗列了关于GIS软件应用的文章,笔者将其编译整合. 地理信息系统(Geographic In ...

  4. 我开源的软件只能我拿来赚钱

    文 | 一君 出品 | OSC开源社区(ID:oschina2013) 贵司为 MySQL 掏过钱吗?或者说,你使用的是 MySQL Enterprise Edition 类的产品还是 MySQL C ...

  5. 开源之旅之开源企业软件采购指南

    开源之旅之开源企业软件采购指南 ( 2006-02-06 10:31:09)   [导读]:从开源数据库.应用服务器,到开源的Web服务器,我们已经带您领略开源软件世界的旖旎风光.此次的"开 ...

  6. 开源GIS软件初探(转载)

    到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不错 ...

  7. 五款开源图形处理软件

    开放源码社区一直因为缺少以用户为中心的应用软件而饱受诟病.从一个每天都使用开源桌面和服务环境的用户角度来看,我也支持很多开源应用不如商业解决方案华丽的抱怨,但讽刺的是,同时也存在一些优秀的开源图形应用 ...

  8. 五款开源图像处理软件

    开放源码社区一直因为缺少以用户为中心的应用软件而饱受诟病.从一个每天都使用开源桌面和服务环境的用户角度来看,我也支持很多开源应用不如商业解决方案华丽的抱怨,但讽刺的是,同时也存在一些优秀的开源图形应用 ...

  9. 不可错过的五款开源图形处理软件

    开放源码社区一直因为缺少以用户为中心的应用软件而饱受诟病.从一个每天都使用开源桌面和服务环境的用户角度来看,我也支持很多开源应用不如商业解决方案华丽的抱怨,但讽刺的是,同时也存在一些优秀的开源图形应用 ...

  10. Zilliz 融资 4300 万美元,创全球开源基础软件 B 轮融资新纪录

    11 月 13 日, AI 非结构化数据处理和分析软件公司 Zilliz 宣布完成 4300 万美元 B 轮融资.本轮融资由高瓴创投领投,挚信资本和 Pavilion Capital 跟投, A 轮领 ...

最新文章

  1. java.lang.IllegalArgumentException: column ‘_id‘ does not exist
  2. linux 占用缓存前10_Linux 中的零拷贝技术
  3. 用 WEKA 进行数据挖掘,第 3 部分: 最近邻和服务器端库
  4. 全球与中国氢燃料电池液冷泵市场发展现状调查与投资前景预测报告2022-2028年版
  5. tcp/ip客户端与服务器
  6. cocos 修改层级_cocos creator 场景如何透明,多个canvas层级显示
  7. 超详细设置 Idea 类注释模板和方法注释模板
  8. Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程
  9. ArcEngine在个人地理数据库下创建要素类
  10. 并查集:POJ No1703 Find them, Catch them
  11. 《Spring 揭秘》读书笔记
  12. visual studio 2017 installer 安装包制作过程出现的问题---无法注册模块 HRESULT -2147024769 请与您的技术支持人员联系...
  13. 《老路用得上的商学课》26-30学习笔记
  14. VS-code输入感叹号没有提示
  15. stc12c5a60s ds1302时钟
  16. #读书笔记—《自控力》第一章
  17. PS学习之动态表情制作
  18. Shim Polifill区别
  19. 链家网页爬虫_爬虫小技巧——以最简单的方式爬取链家房源信息
  20. MarkDown图床助手: 截图-传图-生成url 一步到位

热门文章

  1. QFIL的烧录、读写
  2. 【黑苹果】戴尔DELL Vostro 14 5490+i5-10210U和i7-10510U+OpenCore+macos 10.15.4 efi文件下载
  3. Python(PyCharm)的下载安装汉化(2022)
  4. Hoverfly - 微服务虚拟化示例
  5. MacOS:Shell工具-Royal TSX
  6. STM32+FreeRtos 移植letter-shell工具
  7. 如何实现一个拍照搜题功能
  8. 2016年移动广告聚合平台浅析
  9. StyTr^2:Image Style Transfer with Transformers
  10. 提高Visio制图效率的小技巧——Visio制图总结