C++内点法求解大规模线性规划问题——对标MATLAB中linprog函数

文章目录

  • C++内点法求解大规模线性规划问题——对标MATLAB中linprog函数
    • 1. 项目场景
    • 2. 约束的规范化
    • 3. 输入格式
    • 4. 如何构建模型
    • 5. 如何使用

项目资源链接如下:https://download.csdn.net/download/weixin_46584887/86406561


1. 项目场景

对于如下大规模线性规划问题:

min⁡c1x1+c2x2+⋯+cnxns.t.  a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2…am1x1+am2x2+⋯+amnxn=bmx1,x2,…,xn≥0\begin{array}{rl} \min\ \ &c_1x_1+c_2x_2+\dots+c_nx_n\\ \textrm{s.t.}\ \ &a_{11}x_1+a_{12}x_2+\dots+a_{1n}x_n=b_1\\ &a_{21}x_1+a_{22}x_2+\dots+a_{2n}x_n=b_2\\ &\dots\\ &a_{m1}x_1+a_{m2}x_2+\dots+a_{mn}x_n=b_m\\ &x_1,x_2,\dots,x_n\ge0 \end{array} min  s.t.  ​c1​x1​+c2​x2​+⋯+cn​xn​a11​x1​+a12​x2​+⋯+a1n​xn​=b1​a21​x1​+a22​x2​+⋯+a2n​xn​=b2​…am1​x1​+am2​x2​+⋯+amn​xn​=bm​x1​,x2​,…,xn​≥0​

或者写成如下形式:

min⁡cxs.t. {Ax=bx≽0\min\ \bf{cx}\ \ \textrm{s.t.}\ \left\{\begin{array}{l}\bf Ax=b\\ \bf x\succcurlyeq 0\\ \end{array}\right. min cx  s.t. {Ax=bx≽0​

并且 A∈Rm×n,x∈Rn×1,b∈Rm×1\bf{A}\in R_{m\times n},x\in R_{n\times 1},b\in R_{m\times 1}A∈Rm×n​,x∈Rn×1​,b∈Rm×1​.


2. 约束的规范化

  • 对于缺乏非负约束的变量 xix_ixi​,我们做出如下转化 :

    • xi=xi1−xi2x_i=x_{i1}-x_{i2}xi​=xi1​−xi2​

    • xi1≥0,xi2≥0x_{i1}\ge0,x_{i2}\ge0xi1​≥0,xi2​≥0

  • 对于不等式约束,我们也需要将其松弛为等式约束:

    • ∑j=0naijxj≤bi\sum_{j=0}^{n}a_{ij}x_{j}\le b_i∑j=0n​aij​xj​≤bi​ 或者 ∑j=0naijxj≥bi\sum_{j=0}^{n}a_{ij}x_{j}\ge b_i∑j=0n​aij​xj​≥bi​

    • xn+i±∑j=0naijxj=bi,xn+i≥0x_{n+i}\pm\sum_{j=0}^{n}a_{ij}x_{j}=b_i, x_{n+i}\ge 0xn+i​±∑j=0n​aij​xj​=bi​,xn+i​≥0


3. 输入格式

代码从文本文件中读取数据(data.txt):

  • 该文本文件的第一行包含两个整数, m and n, 分别代表约束个数与变量个数
  • 第二行的 n 个元素代表目标函数中变量前的系数 cic_ici​
  • 接下来 m 行每行包括 n + 1 个元素, 每行的前 n 个元素代表变量前的系数 aija_{ij}aij​,,最后一个元素代表 bib_ibi​

举个例子,对于如下线性规划问题:

max⁡5x1+10x2s.t.8x1+8x2≤1604x1+12x2≤180x1≤15x1,x2≥0\begin{array}{rl} \max&5x_1+10x_2\\ \textrm{s.t.}&8x_1+8x_2\le 160\\ &4x_1+12x_2\le180\\ &x_1\le15\\ &x_1,x_2\ge0 \end{array} maxs.t.​5x1​+10x2​8x1​+8x2​≤1604x1​+12x2​≤180x1​≤15x1​,x2​≥0​

我们首先要将其转换为如下形式:

min⁡−5x1−10x2s.t.8x1+8x2+x3=1604x1+12x2+x4=180x1+x5=15x1,x2,x3,x4,x5≥0\begin{array}{rl} \min&-5x_1-10x_2\\ \textrm{s.t.}&8x_1+8x_2+x_3= 160\\ &4x_1+12x_2+x_4=180\\ &x_1+x_5=15\\ &x_1,x_2,x_3,x_4,x_5\ge0 \end{array} mins.t.​−5x1​−10x2​8x1​+8x2​+x3​=1604x1​+12x2​+x4​=180x1​+x5​=15x1​,x2​,x3​,x4​,x5​≥0​

接着输入文件 data.txt 中的内容应如下:

3 5
-5 -10 0 0 0
8 8 1 0 0 160
4 12 0 1 0 180
1 0 0 0 1 15

应注意的是,在上述情况下获得的求解结果不是特别精确。对于小规模模型的求解,我们可以尝试使用一些整数规划解算器,例如 Google 的 OR-Tools,或者使用单纯形法来求解。

对于大规模线性规划问题(包括整数和浮点数),代码的求解精度是不错的。


4. 如何构建模型

确保你的电脑中有这些编译工具,以 Ubuntu 为例:

sudo apt install build-essential cmake make

接着进入项目目录,执行如下命令:

cd LinprogSolver4C && cmake CMakeLists.txt

可以看见目录中生成了 Makefile 文件,你可以使用 make 工具获得可执行文件:

make

5. 如何使用

在目录中构建出可执行文件之后,其用法如下:

./linprog data.txt # any data paths

在终端中可以得到如下输出:

1LP problem:Iter  Residual        Mu    Alphax    Alphas0  2.70e-01  1.54e+00       ---       ---1  1.24e-03  6.01e-02  1.00e+00  1.00e+002  7.97e-08  3.86e-06  1.00e+00  1.00e+003  3.99e-12  1.93e-10  1.00e+00  1.00e+004  2.06e-16  9.66e-15  1.00e+00  1.00e+00----------------------------Optx:1       7.52        123   2.4e-144   2.6e-145       7.5----------------------------linprog Terminated. Status : 0
[Iters: 4] [Time: 2.82e-03s]

第一行输出的整数含义如下:

0 - optimal

1 - terminated by maxIter

2 - infeasible


GitHub地址:https://github.com/ZhiQiangFeng

C++内点法求解大规模线性规划问题——对标MATLAB中linprog函数相关推荐

  1. matlab中linprog函数解线性规划方程

    线性规划问题,建立线性规划问题模型的基本步骤: 一.明确目标 二.确定问题的决策变量 三.构建目标函数 四.确定约束条件 建立好线性规划方程之后,紧接着而来的就是如何解方程,我们使用 matlab中的 ...

  2. Matlab中 linprog函数的使用(求解线性规划)

    一.首先将线性规划模型标准化为如下形式(注意要化成目标函数为min)   f,x,b,beq,vlb,vub是向量,A和Aeq是矩阵 二.使用linprog求解(参数如下) [x,fval]=linp ...

  3. matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...

    由于自己科研水平较低,记录的各种体会更多的是给自己做个小结,错误之处,欢迎大家指正. 使用MATLAB求解偏微分方程或者方程组,大致有三类方法.第一种是使用MATLAB中的PDE Toolbox,PD ...

  4. 极大似然函数求解_关于极大似然估计的学习(附Matlab中mle函数的求解)

    冒泡~是新的一周辣~温故而知新一下极大似然估计(真是很不容易了) 极大似然估计的基本思想 什么是极大似然?官方上的较清楚的解释是:利用已知的样本的结果,在使用某个模型的基础上,反推最有可能导致这样结果 ...

  5. matlab中solver函数_Simulink求解器(Solver)相关知识

    更多精彩内容参见专业MATLAB技术交流平台--MATLAB技术论坛http://www.matlabsky.com 1.变步长(Variable-Step)求解器 可以选择的变步长求解器有:ode4 ...

  6. matlab函数画图创建gui,如何在MATLAB中的函数内创建GUI?

    build a GUI有多种方法,例如使用App Designer,GUIDE或以编程方式创建它(我将在下面说明此选项).了解GUI组件和 options available for sharing ...

  7. 记录一下MATLAB中ode45函数求解非刚性微分方程

    首先看一下MATLAB的官方例子 vdp1.m: function dydt = vdp1(t,y) %VDP1 Evaluate the van der Pol ODEs for mu = 1 % ...

  8. 非线性规划求解_突破 | 杉数求解器COPT首发求解内点法

    ↑↑↑↑↑点击上方蓝色字关注我们! 『运筹OR帷幄』转载 作者:杉数科技 北京2020年10月26日,杉数优化求解器COPT公布国内首个线性规划内点法,这是国内运筹学的又一大突破.其性能与单纯形.大规 ...

  9. 内点法最优潮流matlab程序

    内点法最优潮流matlab程序 一.概述最优潮流问题 1.最优潮流和基本潮流的比较潮流计算可以归结为针对一定的扰动变量p(负荷情况),根据给定的控制变量u(如发电机的有功出力.无功出力或节点电压模值等 ...

最新文章

  1. 你所知道的Java单例模式并不是单例模式
  2. 关于《计算机程序的构造和解释》
  3. 可视化界面编程idea_BAT 的程序员用了这些 IDEA 插件, 志玲姐姐天天鼓励, 工作效率提高 320%...
  4. Vim使用技巧:撤销与恢复撤销
  5. Java Socket编程总结
  6. 阿里HBase高可用8年抗战回忆录
  7. Windows下 ffmpeg + labelImg 提取视频帧 得到图片集 并 标注图片 来 构造数据集
  8. web项目移动端在线预览(excel在线预览)
  9. VS2015环境下Crystal Reports(水晶报表)的安装使用
  10. UE4学习笔记(3)——World Composition无缝拼接地图实现
  11. 微信小程序自定义tab切换组件
  12. 输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  13. 瀚高数据库在Linux上安装,瀚高数据库和postgresql并存,安装瀚高数据库问题的一种解决方案(APP)...
  14. 盘古开源:汽车芯片短缺怎样缓解?工信部回应热点问题
  15. Android底部菜单栏(图片+文字)
  16. 微信小程序 image-cropper 还原按钮控制
  17. 2018辽大计算机拟录取,四川大学计算机学院2018年硕士研究生招生拟录取名单及成绩公示...
  18. 几何校正(image to image)
  19. 寻址方式(有效地址的计算)
  20. 张飞硬件课程第六部:开关电源(上)

热门文章

  1. MT4-EA自动化交易研究笔记(2022-04-28)
  2. 文本编辑器 Notepad
  3. 关于css中after和before伪类的用法
  4. 宁盾动态密码案例1: 通过dKey动态口令牌提升ERP登录安全
  5. 每日一诗词 —— 如果生活不够慷慨
  6. Vite创建的Vue3.0项目热更新失效,写的代码没效果
  7. python堆栈溢出的原因_堆栈溢出一般是什么原因
  8. java pattern堆栈溢出_堆栈溢出错误与正则表达式进行解析
  9. TableEditnbsp;UI_10
  10. 【后台定位】Android13后台定位方案