-
2021-04-18 12:45:33
MATLAB 求解线性规划(含整数规划和0-1 规划)问题
线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约
束的,变量范围为有理数的线性规划。如:
max z 7x 12 y
9x 4y 300
4x 5y 200
s.t
3x 10y 300
x , y 0
对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。
但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具
求解这一类线性规划问题。
最著名,同时也是最强大的数学最优化软件是LINGO/LINDO 软件包,它能
够求解多种的数学规划问题,同时还提供了多种的分析能力。但LINGO 软件并
不容易上手,同时,应用LINGO 的场合一般是大规模的线性规划问题,小小的
线性规划完全可以不使用它。一个更受科研人员欢迎的数学软件是 MATLAB ,
它以功能强大而称著,并有数学软件中的“航空母舰”之称。我们这里就是要学
习使用MATLAB 软件求解线性规划 (含整数规划和0-1 规划)问题。
为了使得不熟悉MATLAB 的人员也能够使用MATLAB 进行线性规划问题
求解,本文将对MATALB 中使用到的函数和过程以及结果进行详细的分析,最
后会对每一个问题都给出一个可以完全“套用”的MATLAB 程序。
我们首先从上面的线性规划问题开始,为了便于表达,将上面的式子写成矩
阵形式:
max z 7x 12y
9 4 300
x
4 5 200
s.t y
3 10 300
x , y 0
于是约束就表达为了一个Ax b 不等式。
求解MATLAB 线性规划时,最常用的函数是linprog 函数,下面来介绍一下这个
函数的使用。
打开MATLAB 帮助文档 (PS:帮助文档的内容是最全的,只要你的英文过了专业8
级),可以看到linprog 函数求解的是具有如下标准形式的线性规划:
min f Tx
x
A X b
s.t Aeq X beq
lb x ub
公式中各符号的意义是自明的,在这里简单介绍下,首先MATLAB 中求解的
是目标函数是最小值的问题,但如果我们的目标函数是求最大值,可以通过对目
标函数中每一项中乘以-1,将求最大值问题转化为求最小值问题;A,b 分别为
不等式约束中的系数矩阵。Aeq 和beq 分别为等式约束中的系数矩阵,lb,和ub
分别为每个变量的上下区间;最后f 为目标函数中各变量的系数矩阵。
现在,是时候动动手,使用MATLAB 编写代码求解这个线性规划了。MATLAB
代码如下所示:
f=[-7,-12];
A=[9 4;4 5;3 10];
b=[300;200;300];
lb=zeros(2,1);% 生成一个2行1列的全1矩阵
[x,fval]=linprog(f,A,b,[],[],lb,[])
我们来解释下linprog 函数中每参数的意义,linprog 中的一个原型如下:
[x,fval,exitflag] = linprog(f,A,b,Aeq,beq,lb,ub)
这7 个参数的意义和上面f、A、b 的意义是一样的。f 为目标函数的系数矩阵,
A 为线性规划不等式约束的变量系数矩阵,b 为不等式约束的资源数(如上面的
[300;200;300]),这是一个N 行1 列的矩阵,N 为变量的个数。Aeq 和beq 是相
应等式约束的变量系数矩阵和资源数(很明显,上面的例子中并没有等式约束)。
lb 和ub 分别为保变量的上下区间。在上面的例子中,x 和y 和最小值都为0 但
都无最大值约束。而
更多相关内容 -
MATLAB非线性规划求解软件包,采用SQP算法,实测可用,包括使用手册。
2022-05-07 21:30:30MATLAB非线性规划求解软件包,采用SQP算法,实测可用,包括使用手册。 -
matlab精度检验代码-RK-Opt:用于设计ODE数值求解器的软件包
2021-05-21 21:46:38matlab精度检验代码RK-Opt:用于设计数字ODE求解器的软件包 请参阅完整的文档。 RK-Opt是MATLAB代码的集合,用于设计优化的数字ODE求解器。 主要重点是Runge-Kutta方法,但是某些例程处理其他类型的方法。 它主要由... -
基于吴方法的孤波自动求解软件包及其应用.
2015-03-21 09:21:29基于吴方法的孤波自动求解软件包及其应用. -
qpmad:ROS兼容的基于本征的Goldfarb-Idnani二次规划求解器
2021-05-27 11:48:29该软件包与ROS兼容。 求解器针对性能进行了优化,因此,如下所述,一些计算将被省略。 请参阅以与qpOASES和eiQuadProg进行比较。 内容 链接 Doxygen: : GitHub: : CI: : //travis-ci.org/asherikov/qpmad ... -
fd3d:麦克斯韦方程组的迭代FDFD求解器,用于解决大型3D问题
2021-05-06 14:38:26它允许MaxwellFDFD的用户在较大的3D域中求解频域Maxwell方程。 FD3D使用迭代方法来避免直接方法的大量内存需求。 有关安装说明,请参见INSTALL.md 。 目录结构 FD3D根目录包含以下子目录: bin/ 从src /中的源... -
LQR-ROS:通过求解离散时间代数Riccati方程来实现LQR的ROS软件包
2021-05-18 00:15:43LQR-ROS 通过求解离散时间代数Riccati方程来实现LQR的ROS软件包。 -
clawpack:求解偏微分方程双曲系统的软件包
2021-05-24 13:14:15安装Python Clawpack工具 使用以下命令足以启动并运行PyClaw,VisClaw和其他程序包的Python接口: pip install clawpack 如果要以允许同时使用Fortran代码(Classic,AMRClaw和GeoClaw)的方式安装clawpack,请... -
Pavito.jl:凸混合整数非线性规划(MINLP)的基于梯度的外部逼近求解器
2021-05-26 17:15:28Pavito是用编写的混合整数凸规划(MICP)求解程序包。 MICP问题是凸的,除了一些变量采用二进制或整数值的限制之外。 Pavito通过构造凸可行集的顺序多面外逼近来解决MICP问题,类似于 。 Pavito通过... -
NLSolversBase.jl:JuliaNLSolvers中用于优化和方程求解器软件的基本软件包
2021-02-04 02:12:56NLSolversBase.jl:JuliaNLSolvers中用于优化和方程求解器软件的基本软件包 -
Excel与Google Sheets中实现线性规划求解
2019-01-22 00:07:49很久没更新过APS系列文章了,这段时间项目工作确实非常紧,所以只能抽点时间学习一下运筹学的入门...与此同时,除了继续使用Optaplanner来做我们的规划类项目外,还花点时间去研究了一下Google OR-Tools开源规划引...很久没更新过APS系列文章了,这段时间项目工作确实非常紧,所以只能抽点时间学习一下运筹学的入门知识,算是为以后的APS项目积累点基础。看了一些运筹学的书(都是科普级别的)发现原来我目前面对的很多排产、排班、资源分配和路线规划问题,都是运筹学上的典型案例。与此同时,除了继续使用Optaplanner来做我们的规划类项目外,还花点时间去研究了一下Google OR-Tools开源规划引擎,这是Google旗下的一个开源求解器,接下来我会专门写一些关于Google OR-Tools应用的文章,并与Optaplanner作些关联对比。
本篇先向大家展示一下两个规划工具,在求解线性规划问题上的应用方法,分别是Microsoft Office的Excel里的”规划求解”组件和Google Dos中的Spreadsheet上提供的Linear Optimization插件。这两个工具都可以作为规划问题的求解器。因为它们是以插件或软件功能形式提供的,在灵活性和扩展性方面限制还是比较大,但是因为不涉及软件开发的技能,普通用户都能很好地应用它们来解决一些现实业务中遇到的规则问题。
因为Google的Linear Optimization是Google文件服务中的Spreadsheet(Google提供的类似于Excel的电子表格程序),因为目前国内的网络情况(你懂的),访问它需要自己想办法,我们公司总部不在中国境内,所以我们的办公网络经过注册,是可以合法访问外界的;关于网方面不在本篇中讨论,大家自己科学解决就可以了。
规划问题
下面先给出本次我们需要求解的线性规划问题,其实在Optaplanner相关的文章中,详细介绍过关于NPC问题,普通线性规划问题很多并不是NPC问题,因为对于线性规划模型,还是有例如单纯形法等算法推算它的最优解的,而不是所有规划问题的时间复杂度都是O(a^n)或O(n!)的,大家要理解清楚两者的关系。
我们要求解的问题跟很多运筹学教材或科普书籍上的例子一样,也是最简单的在确定的条件约束下,求最大利润下的产品生产方案问题。例如一家工厂生产两种产品,产品A与产品B,均需使用到三种资源,资源1、资源2和资源3。其中生产一件产品A,需要5个单位的资源1,4个单位的资源2,3个单位的资源3。生产一件产品B需要3个单位的资源1,8个单位的资源2,5个单位的资源3。一个产品A的利润是20,一个产品B的利润是25。库存中三种资源的存量为:280单位的资源1,580单位的资源2,360单位的资源3.见下表:
求:两种产品分别生产多少件,才能令到总利润最大?此时的利润是多少?
以上问题是典型的线性规划问题,运筹学的同学可以通过单纯形法进行求解,但是这种方法对于没有运筹学背景的普通工程师来说,困难还是不小。即使我们学会这种办法,但遇到更复杂问题的时候,对我们来说其挑战还是相当大。因此,目前市上,或开源世界里,提供了很多解决此类规划问题的开源软件。但对于非IT人员来说,没有软件开发背景,很难利用这些开源软件工具写程序求解。因此,一些知名的办公软提供了相关的特性,让非IT专业人员直接使用其规划功能,输入数据即可快速求得答案。对各行业的生产、管理活动提供了极大的帮助。下面我们就以Excel和Google Spreadsheet两种工具中的规划求解功能,尝试求解上述问题。
对问题进行数学建模
要解决上述问题,就需要对问题进行线性规划建模,建立数学模型,以数学工具对问题的约束和目标进行归纳、抽象,用数学语言表达问题的本质意义。对于上面的问题我们的建模如下:假设产品A生产x件,产品B生产y件,才能让利润最大化。那么我们通过对问题的约条件和规划目标的分析,可以得出以下数学模型。
该模型表示:生产产品A和产品B所需的三种资源的总量,均不能超过每种资源的库存量;并且产品件数量必须是大于等于0的整数。规划的目标函数是找出两种产品的利润之和的最大值,并计算出获得该利润时,两种产品的产量分别是多少。
对于线性规划问题,其实可以通过单纯形法、对模型进行求解,从而得出z最大时的x与y的值。但此方法需要一定的数学知识,此范围的知识不在本文的讨论范围内,以后若有机会,我再简单介绍一下通过单纯形法对此模型求解步骤。但本人也不是运筹专业出身,估计也只是班门弄斧;因此,大家可以上网寻找更专业的运筹学资源,了解规划模型的解法。本文通过Excel下的规划求解功能,以及Google下的Spreadsheet中的Linear Optimization插件,对该规划模型进行求解,从而取得该生产安排问题的解。
Microsoft Excel规划求解
Excel提供了一个非常强大的组件用于解决此类规划问题,目前我还只尝试过线性规划问题,根据其资料显示,非线性规划也是可以解的。以后若有机会尝试一下基它规划问题再分享给大家。下面逐一展示这组件具体用法给大家。
第一步:添加“规则求解”组件
因为规则求解功能默认不会出现在Excel的常用工具栏中,因此,需要从加载项目中把它加载出来才能使用。在Excel菜单栏中,选择【文件】->【选项】,在弹出的【Excel选项】窗口中,选择【加载项】页签,在列表中的【非活动应用程序加载项】(意思是说Excel目前有这些功能可以用,但还没有加载进去,所以不会显示在工具栏中)的其下方找到【规则求解加载项】,如下图.
在列表下方的【管理(A)】下拉框中选择【Excel加载项】,点击【“转到...】按钮,会弹加载项窗口,如下图。在【可用加载宏(A)】列表中,选中【规划求解加载项】,点击确定,窗口关闭。
在Excel的【数据】工具栏的最右则,你会看到【规划求解】的图标,即是刚才我们操作完成后加载进来的组件,如下图。
事实上它是Microsoft提供的一个求解器,该组件对应的文件在C:\Program Files (x86)\Microsoft Office\root\Office16\Library\SOLVER此文件夹下。该文件夹下有两个文件,分别是SOLVER.XLAM和SOLVER32.DLL, SOLVER.XLAM是一个Excel的宏文件,用于实现Excel对求解器核心SOLVER32.DLL的调用,因此SOLVER32.DLL应该就是这个求解器的核心程序动态连接库。
第二步:将问题填入Excel表并建立各变量之间的关系
完成规划求解组件加载后,下面就可以将数学模型的各个常量、变量和约束关系填入Excel单元格中;先将两种产品和三种资源对应的使用数量建立一张二维表,如下表。
通过Excel及规划求解组件解答此问题步骤如下:
1.填入常量:上表中,产品A对资源1、资源2和资源3的要求量分别是5,4,3(即B2,B3,B4的值),其单件利润为20(B5)。 同样方法将产品B对应的数量填入C2- C5单元格中。另外,对于三种资源的库存量,将其值填 入D2 - D4中。自此,模型中涉及的常量已经全部填写时表格。
2.根据数学模型,定义运算关系:本模型中,我们的目标是求得当z最大时变量x,y的值(x,y在运筹学的规划模型中被称为 决策变量;在Optaplanner中,它们被称作规划变量)。在Excel中每一个决策变量需要确定在一个单元格,以备参与接下来的规划计算,如上表的B6,C6单元格。在未启动规划的时候,这两个单元格直接填上0作为初始值即可。这两个代表决策变量的单元格在完成规划,找到答案后,运算结果值将会被填到对应的单元格中。
确定好这两个变量后,下一步需要考虑规划目标,也就是总利润最大化的目标,也需要为此目标值确定一个单元格,此单元格的值会在规划完成时,确定了B6和C6两件单元格的值之后计算出来。根据目标函数z = 20x X 25y的定义,此单元格的公式应为 :B5 * B6 + C5 * C6,即两种产品的利润之和。我们把存储利润之和的值定在D7单元格,为了直观美观,我们把D7与E7合并。
确定了目标函数值的单元格和计算公式后,下一步需要处理约束条件,也就是产品的资源使用量与库存的约束关系。对于资源1,我们将E2确定为其资源用量,它计算公式应该是:B2 * B6 + C2 * C6,即两种产品对该资源的使用量之和。按相同的规则,设置E3 = B3 * B6+ C3* C6, E4 = B4 * B6 + C4 * C6.
第三步:设定规划求解逻辑参数
通过上述两个步骤设定后,各个单元格的常量值、决策变量和运算关系已设定好。接下来就可以启动【规划求解】插件进行逻辑设定。在【数据】菜单项目中,最右则的【分析】组里,有一个【规划求解】图标,点击它,即可打开【规划求解】窗口(如下图)
以下讲解这些参数意义及其设置。
1.【设置目标(T)】项:该项目我们需要选定一个单元格,表示该单元格是本次规划活动需要计算的目标。通过问题描述和规划模型,我们得知该问题目标是求利润的最大值及取得该利润时两种产品的产量。也即模型中的目标函数z的最大值,及此时的x,y的值。在上表中D7就是存放这个目标函数的单元格,因此这里选中D7即可。在参数设置时,都是使用单元格的绝对地址,因此单元格地址前面都有$符号。
2.目标值中【到】项:该项用于设置对于目标函数的取值要求,可以看到它有【最大值】,【最小值】和【目标值】三个选项。其中【最大值】和【最小值】,表示目标函数往最大或最小两个极值方向求解,即最优解中,D7单元格的值是在满足约束条件情况下取得的最大值。而【目标值】则表示取得最优解时,目标函数值最等于或最接近于此值。本问题中的目标是求利润最大,所以我们选择【最大值】。
3.【通过更改可变单元格(B)】:该项表示在规划过程中求解器,通过改变哪些单元格的值,来获得结果,直到【目标值】所指的单远格(本例中的D7)中的值达到极值。对应到模型中,也就是x与y两个决策变量,本例中对应的单元格是B6和C6,分别表示产品A和产品B的产量。因此,选择B6和C6即可。
4.【遵守约束】:该项内容表示本次规划需要符合的约束条件,也就是模型中的s.t.部分(s.t. 是subject to的缩写)和各个不等式和各变量的范围条件。点击右则的【添加(A)】按钮,弹出【添加约束】窗口(如下图),可以看到约束的表达方式非常简单,就是添加左右两则值的逻辑关系。
参照模型中的s.t.部分,和excel中的单元格位置关系,添加它们的关系即可。例如对于资源1,s.t.中的约束条件5x * 3y <= 280, 可参通过选择操作,添加以下关系: E2 <= D2,表示产品A所需资源量与产品B所需资源量之和,不能大于资源库存量。按相同的规则设置好资源2和资源3的约束条件。另外对于决策变量x,y,模型中有这两个变量应为整数,且大于等于0的约束。因此,分选选择B6和C6,并在条件表达关系选择int即可。完成后条件约束的内容如上图中的【遵守约束】列表中的内容。
5.【选择求解方法】:该栏列举了目前可选择的三种求解算法,分别是【单纯线性规划】,即单纯形解法,【非线性GRG】和【演化】。具体的求解方法在选择框下方有简单解释,我们选择默认的【非线性GRG】或【单纯形法】即可。
6.【求解】:点击【求解】按钮,即会启动求解器进行规划求解。完成后会弹出【规划求解结果】窗口,供进一步操作(例如保存规划方案等)。与此同时,原来在未求解前,因为产量设置为0,所以所需资源(E列)的三个单格E2,E3,E4,以及总利润单元格D7的初始值是0。完成规划后,找到最大利润下两种产品的产量(B6,C6)之后,上述原值为0的单元格的值,也随即被更新为该利润最大方案时对应的值。如下图。
由结果可知,完规划求解后,得到的决策变量值:x=20, y=60, 目标函数z的值为1900,即表示:当产品A生产20个(B6单元格),产品B生产60(C6单元格)个时,其利润达到最大值1900(D7单元格)。上述规划问题得到完美解。下面我们再使用另外一个工具 - Google Spreadsheet中的线性优化插件,求解同样的问题。
Google Spreadsheet线性优化功能插件
对于规划问题,微软和Google通提供了很强大的套件,令到像我这种没有运筹学背景的普通用户,可以方便地求解一些规划问题。在此不得不感叹一下,在此方面国内类似软件与国外的差别。曾经有朋友跟我讨论过,公司使用的国内某个一线办公软件,功能直逼office,办公中绝大部分情况,这个软件都能处理,但遇到一些需要进行规划运算的问题,此软件则没有提供类似的功能,不得不求助于Microsoft Excel。
说到这种非专业人员用的规划求解工具,不得不延伸提一下规划引擎软件方面,也存同类问题。目前在国内,如果是针对某一大型公司或项目,只要资源到位,实现一个可用的规划引擎问题不算大。但涉及要求更高,可用性更强的通用规划引擎(无论是开源还是商业)国内外的差距就体现出来了。商业求解器领域暂不深入讨论,本人专注于开源规划引擎的应用 研究,近两三年项目应用或自己学习研究中,曾分析应用过一些开源规划引擎,除开优化性能和优化结果的质量上的比较;仅就在工程实践的可用性、易用性上,目前还很难在国内找到一款能跟Optaplanner及Google OR-Tools媲美的开源引擎。先不说可以满足建模要求的引擎软件包,就是求解器方面,国内开源项目也寥寥可数。
下面开始对Google Spreadsheet中的Linear Optimization插件的应用进行具体介绍。还是在上面已经建立好的数学模型基础上,讨论通过Google的Linear Optimization求解此模型。在开始之前,需要完成以下准备工作:
解决网络连接问题。这个大家懂的,大家可以自行想办法解决,如果一些在外资或需要访问国外网络的机构工作的朋友(如我们办公室是可能正常合法访问国外网络),则可以跳过此节。
注册Google帐号(若你未有Google帐号)。因为Google Docs,Google Spreadsheet均是类似于Microsoft Office的在线文件处理应用服务。无论是哪个Google服务,需要使用必须通过Google帐号。
完成上述前期工作后,即可开始Google Spreadsheet的配置和应用。
Linear Optimization是Google Spreadsheet的一个插件,可以实现对线性规划模型的求解。默认状态下,Google Spreadsheet是不包括此插件的,需要使用的话,则需要将期添加Spreadsheet中才能使用。下面将操作接步骤列出。
1.创建Spreedsheet文件
登录Google帐号,进入Google Sheets页面(http://sheets.google.com)。进入后Spreadsheet主页后,点击页面右下解的红色添加按钮,创建一个Google Spreadsheet文件。在创建好的文件中,可以将文件命名为“LP_Test”文件即会自动保存到你的Google帐号。如下图。
添加Spreadsheet文件 命名Spreadsheet文件
2. 添加Linear Optimization插件
通过Spreadsheet页面的Add-ons菜单,将Linear Optimization插件添加到你的帐号上,才能进一步使用该线性优化插件,可以看到还有更多规划功能的插入可以添加。这也是Google在运筹优化方面的系统架构与Optaplanner存在的差别。我将会有新的一篇文章对比两个开源规划引擎这方面的差异,敬请期待。点击Add-ons -> Get add-ons… 菜单项目,将会弹出【Add-ons】页面,在页面上的搜索框中输入”Linear Optimization”并回车,即可搜索出该插件,并点击【+FREE】按钮进行添加。如下图。
在添加过程中,需要你登录或选择一个已经登录的帐号,选择你已登录的帐号即可,如下图
选择或登录自己的Google帐号
选择或输入帐号后,会转到一个Sign in页面,大概意思是说Linear Optimization将会被添加到指定页面,点击页面底部右则的【Allow】按钮即可。
3. 创建线性规划模板
添加完成后,在【Add-ons】菜下会出现【Linear Optimization】子菜单项,该子菜单下会有用于设置决策变量、约束和求解的子项。见下图。
选择【Linear Optimization】菜单下的【Set up optimization sheet】子项,即可在当前Sheet中生成求解模板,模板中包含f了决策变量定义区域、目标函数区域和约束区域。下图为新创建的线性规划模板刚创建好的状态.
4.填入决策变量、约束和目标函数
创建好线性规划模板后,需要将上面已经建立好的数学规划模型输入模板中对应的单元格,正确地反映数学模型的意义,才启动求解器(Google的在线规划服务,是用通WebAPI提供的,因此其求解器是部署在Google自己的服务器上)。初学者可以通过Linear Optimization菜单下的子项,来辅助输入决策变量和约束。选择Linear Optimization菜单下的【Add Variables...】子项,在页面的右则会显示【Describe data】 页面。该页面中点击【Variables】和【Constrains】页签分别可以提供定义决策变量(即模型中的x,y)和约束条件(即模型中s.t.部分中的不等式)的输入元素。以下是【Variables】的各个字段输入如下:
a. Variable Name: 该字段表示决策变量,输入第一个决策变量名x.
b. Type: 从我们建立的规划模型中,知道决策变量x是一个整数,因此Type中选择Integer,(它默认是Continuous).
c. Lower bound, Upper bound:这两个字段分别表示约束变量的最大值与最小值(即决策变量的取值范围),从模型中可以看到它们的最小值是0, 且无最大值限制,因此,Lower bound填上0, Upper bound留空(它提示为Defaults to Infinity,大家应该懂了吧?)。
d. Objective coefficient:该字段表示该决策变量在目标函数中的系数,也就是目标函数表达式中,x前面的常数,从模型的目标函数上可以看到x前面的技术系数为20,因此填入20即可。点击【Add】按钮,x的相关值及其在目标函数上的体现将会被填入模板中。以相同的规则填入决策变量y相关的信息。
下面介绍约束的输入,点击【Constraints】页签,页面将会展示约束条件填入界面:
a. Constraint Name:因为现在我们是新建立约束,因此在下拉框中选择【New Constraint】, 页面中将会出同【Constraint Name】、【Lower bound】和【 Upper bound】三个字段。【Constraint Name】字段中输入一个名称用于标识该约束即可,因为模型中每个不等式是表示一种资源的限制,因此第一个不等式是针对资源1的库存限制的,我们输入”Resource1”。
b. Lower bound,Lower bound:以模型的s.t.部分中的首个不等式 为例
其实我们根据题意可以把它补充成
也就是说,模型中少了产品A资源用量大于等于0这个限制;其实这样是不严谨的。但因为目标函数是求最大值,因此,大于等于0这个条件不表示出来,也不会影响模型的正确性。但需要在Google的Linear Optimization中表未这个不等式时,必然存此条件才能完整表示,包括以后我们直接使用Google OR-Tools中的线性规划模块,不等式的必须有明确的范围才行。根据上面的不等式,我们在【Lower bound】中填入0,【Upper bound】输入280(即少于等于280)。点【Add】按钮,首个约束就会被添加到模板中,并添加了范围限制见下图红框内.此时,Resource1这一行(第8行)仅仅表示了式子的值域,具体的式子并未完成。
c. Variable Name, Coefficient:一上步仅添加了约束Resource1的基本结构。本步骤将要完成不等式中的式子部分。点击【Add】后,页面将会出现【Variable name】下拉框,其中有当前模型的所有决策变量(即本例中的x与y)供选择。在右则还会出现【Variable coefficient】输入框,表示你选择的决策变量在不等式中前面的常数(即技术系数),通过模型我们看到Resource1不等式中x前面的常数是5,因此填入5,并点击【Add】,此时常数5就会被填入当前约束,x对应列的单元格(即D8单元格)。同样地,不等式中决策变量y前面的常是3,因此我们在【Variable name】中选择y,并在【Variable coefficient】中填入3。点击【Add】即可完成约束Resource1的输入。同样的方法输入资源2和资源3的约束,完成后如下图
5.求解
完成上述步骤之后,我们建立的规划模型已经全部表达到Linear Optimization模板中,选中【Linear Optimization】菜单下的【Solve】子项,程序将会启用Google的线性规划Web服务,对刚才输入的模型进行求解,并把结果填回表格中,见下图.
上图是模型的规划结果,可以看到,通过这个模型计算出来的最大的利润是1900(B6单元格),获得此利润时,产品A的产量是20(D6单元格),产品B的产量是60(E6单元格).
写在最后
本文通过对一个简单的线性规划问题,建立线性规划模型;并分别通过Excel的规划求解组件,和Google Spreadsheet下的Linear Optimization插件对模型进行求解,从而得出最优结果。非IT专业人员在实际生产活动中,遇到此类线性规划问题时,可以通过此方法对问题进行求解。而专业的IT人员,遇到的问题会比本文中的情况复杂得多,通过现成的软件功能很可能是无法解决,需要通过软件开发技术,结合规划引擎进行求解。大家可以参考我之前的Optaplanner系列文章 .
本人近段时间也在研究Google OR-Tools,发现本文用到的Linear Optimization其实是通过将Google OR-Tools的多个运筹求解器,建立在Google自身的服务器上;再以Web服务方式提供给的。在实际软件项目开发过程中,我们可以绕开Google Spreadsheet服务程序,通过自己的程序调用其运筹优化服务进行求解。当然现目前国内的情况来看,通过对它的开源项目Google OR-Tools的引用,直接将其求解器纳入我们自己开发的系统中更现实。
我正在撰写一篇关于Optaplanner与Google OR-Tools的对比文章,通过对比两个引擎的用法,有针对性的引出对Google OR-Tools的应用,敬请期待,谢谢!
如需了解更多关于Optaplanner的应用,请发电邮致:kentbill@gmail.com
或到讨论组发表你的意见:https://groups.google.com/forum/#!forum/optaplanner-cn
若有需要可添加本人微信(13631823503)或QQ(12977379)实时沟通,但因本人日常工作繁忙,通过微信,QQ等工具可能无法深入沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于google邮件列表,国内网络可能较难访问,需自行解决)
-
Constraints.jl:共享软件包可处理来自JuliaConstraints的不同求解器的约束
2021-03-20 04:15:22约束条件 约束条件 JuliaConstraints前端程序包(例如LocalSearchSolvers.jl的后端处理。 它提供以下功能: 用于存储常规约束的字典: usual_...对该软件包的贡献非常值得欢迎,可以随意地(而不是穷尽地)按如下方 -
stretch_kinematics_plugin:Hello Robot Inc提供的用于拉伸的逆运动学求解器的软件包
2021-03-19 20:14:44Stretch_kinematics_plugin 说明:来自Hello Robot Inc.的拉伸机器人MoveIt 2运动学插件。 设置 要设置运动学插件,我们需要一个联合模型组,该联合模型组包括两个联合模型组:一个用于机械手,另一个用于移动基座,... -
matlab的egde源代码-maxwellfdfd:基于FDFD方法的基于MATLAB的麦克斯韦方程组求解器包
2021-05-21 23:28:25MaxwellFDFD是基于MATLAB的Maxwell方程求解器软件包。 它通过有限差分频域(FDFD)方法求解方程,因此命名为MaxwellFDFD。 有关安装说明,请参见INSTALL.md 。 有关更详细的介绍和用法,请参见MATLAB或任何网络... -
ConstraintModels.jl:一个存储用于JuliaConstraints求解器的Constraint编程模型的软件包
2021-03-25 17:55:20约束模型 -
omp算法matlab代码-LASSO-Solver-OMP-Cpp:该软件包以著名的LASSO求解器的形式实现了正交匹配追踪算法(OMP...
2021-05-27 16:50:47介绍该软件包以著名的LASSO求解器实现了正交匹配追踪算法(OMP),并且该程序是在LAPACK的帮助下以C ++编写的。 LASSO是一个关键问题,可以将其视为统计问题,但在许多应用程序中已得到广泛利用。 稀疏编码,例如,... -
matlab目标函数求解代码-GEKKO:GEKKO用于机器学习和动态优化的Python
2021-05-20 23:58:26操作模式包括参数回归,动态数据协调,实时优化,动态仿真和非线性预测控制。 安装 点子包是可用的: pip install gekko 这 。 您可以使用升级标志从命令行进行升级: pip install --upgrade gekko GEKKO runs in ... -
拓端tecdat|R语言投资组合优化求解器:条件约束最优化、非线性规划求解
2021-06-24 19:01:24本文将介绍R中可用于投资组合优化的不同求解器。 通用求解器 通用求解器可以处理任意的非线性优化问题,但代价可能是收敛速度慢。 默认包 包stats(默认安装的基本R包)提供了几个通用的优化程序。 optimize()...原文链接:http://tecdat.cn/?p=22853
原文出处:拓端数据部落公众号
本文将介绍R中可用于投资组合优化的不同求解器。
通用求解器
通用求解器可以处理任意的非线性优化问题,但代价可能是收敛速度慢。
默认包
包stats(默认安装的基本R包)提供了几个通用的优化程序。
f <- function(x) exp(-0.5*x) * sin(10*pi*x) f(0.5)
result <- optimize(f, interval = c(0, 1), tol = 0.0001) result
# 绘制 curve(0, 1, n = 200)
optim()通用优化,有六种不同的优化方法。
Nelder-Mead:相对稳健的方法(默认),不需要导数。
CG:适用于高维无约束问题的低内存优化
BFGS:简单的无约束的准牛顿方法
L-BFGS-B:用于边界约束问题的优化
SANN
: 模拟退火法Brent
: 用于一维问题(实际上是调用optimize())。
这个例子做了一个最小二乘法拟合:最小化
# 要拟合的数据点 # 线性拟合的l2-norm误差平方 y ~ par[1] + par[2]*x # 调用求解器(初始值为c(0, 1),默认方法为 "Nelder-Mead")。 optim(par = c(0, 1), f, data = dat) # 绘制线性回归图
# 与R中内置的线性回归进行比较 lm(y ~ x, data = dat)
下一个例子说明了梯度的使用,著名的Rosenbrock香蕉函数:
,梯度
,无约束最小化问题
# Rosenbrock香蕉函数及其梯度 banana <- function(x) c(-400 * x[1] * (x[2] - x[1] * x[1]) - 2 * (1 - x[1]), 200 * (x[2] - x[1] * x[1])) optim(c(-1.2, 1), f_banana)
optim(c(-1.2, 1), f, gr, method = "BFGS")
最小化
约束:
p <- length(x); sum(c(1, rep(4, p-1)) * (x - c(1, x[-p])^2)^2) } # 25维度约束 optim(rep(3, 25), f,lower = rep(2, 25), upper = rep(4
#全局最小值在-15左右 res <- optim(50, f, method = "SANN")
# 现在进行局部改进(通常只改进了一小部分) optim(res$par, f , method = "BFGS")
- constrOptim()。使用自适应约束算法,在线性不等式约束下最小化一个函数(调用optim())。
# 不等式约束(ui %*% theta >= ci): x <= 0.9, y - x > 0.1 constrOptim(c(.5, 0)
nlm(f, c(10,10))
nlminb(c(-1.2, 1), f)
nlminb(c(-1.2, 1), f, gr)
optim
基础函数optim()作为许多其他求解器的包,可以方便地使用和比较。
# opm() 可以同时使用几个方法 opm( f , method = c("Nelder-Mead", "BFGS"))
全局优化
全局优化与局部优化的理念完全不同(全局优化求解器通常被称为随机求解器,试图避免局部最优点)。
特定类别问题的求解器
如果要解决的问题属于某一类问题,如LS、LP、MILP、QP、SOCP或SDP,那么使用该类问题的专用求解器会更好。
最小二乘法 (LS)
线性最小二乘法(LS)问题是将
最小化,可能有界或线性约束。
线性规划(LP)
函数solveLP(),可以方便地解决以下形式的LP:
最小化:
约束:
#> 加载所需软件包 cvec <- c(1800, 600, 600) # 毛利率 bvec <- c(40, 90, 2500) # 捐赠量 # 运行求解器 solveLP(maximum = TRUE)
混合整数线性规划 (MILP)
lpSolve(比linprog快得多,因为它是用C语言编码的)可以解决线性混合整数问题(可能带有一些整数约束的LP)。
# 设置问题: # maximize x1 + 9 x2 + x3 # subject to x1 + 2 x2 + 3 x3 <= 9 # 3 x1 + 2 x2 + 2 x3 <= 15 # 运行求解 res <- lp("max", f, con)
# 再次运行,这次要求三个变量都是整数 lp( int.vec = 1:3)
solution
二次规划 (QP)
可以方便地解决以下形式的QP
最小化: 约束:
# 设置问题: # minimize -(0 5 0) %*% x + 1/2 x^T x # subject to A^T x >= b # with b = (-8,2,0)^T # (-4 2 0) # A = (-3 1 -2) # ( 0 0 1) #运行求解 solve(Dmat,...)
解决具有绝对值约束和目标函数中的绝对值的二次规划。
二阶锥规划 (SOCP)
有几个包:
-
ECOSolveR提供了一个与嵌入式COnic Solver(ECOS)的接口,这是一个著名的、高效的、稳健的C语言库,用于解决凸问题。
-
CLSOCP提供了一个用于解决SOCP问题的一步平滑牛顿方法的实现。
优化基础
我们已经看到了两个包,它们是许多其他求解器的包。
用于凸问题、MIP和非凸问题
ROI包为处理R中的优化问题提供了一个框架。它使用面向对象的方法来定义和解决R中的各种优化任务,这些任务可以来自不同的问题类别(例如,线性、二次、非线性规划问题)。
LP – 考虑 LP:
最大化:
约束:
#> ROI: R 优化基础设施 #> 求解器插件: nlminb, ecos, lpsolve, scs. #> 默认求解器: auto. OP(objective = L_objective(c(3, 7, -12)),..., maximum = TRUE) #> 投资回报率优化问题:
# 让我们来看看可用的求解器 # solve it res <- ROI_solve(prob) res
MILP – 考虑先前的LP,并通过添加约束条件x2,x3∈Z使其成为一个MILP.
# 只需修改之前的问题 types(prob) <- c("C", "I", "I") prob
BLP – 考虑二元线性规划 (BLP):
最小化:
约束:
OP(objective = L_objective,..., , types = rep("B", 5)) ROI_solve(prob) #> Optimal solution found. #> The objective value is: -1.01e+02
SOCP – 考虑SOCP:
最大化:
约束:
OP(objective = L_objective,..., maximum = TRUE)
SDP--考虑SDP:
最小化:
约束:
并注意SDP约束
可以写成
(大小为3是因为在我们的问题中,矩阵为2×2,但vech()提取了3个独立变量,因为矩阵是对称的)。
OP(objective = L_objective,..., rhs ))
NLP – 考虑非线性规划(NLP)
最大化
约束
OP(objective = F_objective,..., bounds , maximum = TRUE)
凸优化
R为凸优化提供了一种面向对象的建模语言。它允许用户用自然的数学语法来制定凸优化问题,而不是大多数求解器所要求的限制性标准形式。通过使用具有已知数学特性的函数库,结合常数、变量和参数来指定目标和约束条件集。现在让我们看看几个例子。
最小二乘法 – 让我们从一个简单的LS例子开始:最小化
# 生成数据 m <- 100 n <- 10 beta_true <- c(-4:5) # 生成数据 res <- lm(y ~ 0 + X) # 0表示我们的模型中没有截距。
result <- solve(prob) str(result)
Problem(Minimize(obj), constraints = list(beta >= 0)) solve(prob)
稳健的Huber回归 - 让我们考虑稳健回归的简单例子:
最小化
其中
sum(huber(y - X %*% beta, M) Problem(Minimize(obj)) solve(prob)
弹性网正则化 - 我们现在要解决的问题是:最小化
# 定义正则化项 elastic<- function(beta) { ridge <- (1 - alpha) * sum(beta^2) lasso <- alpha * p_norm(beta, 1) # 定义问题并解决它 sum((y - X %*% beta)^2) + elastic(beta, lambda, alpha) Problem(Minimize(obj)) solve(prob)
稀疏逆协方差矩阵--考虑矩阵值的凸问题:最大化
,条件是
log_det(X) - matrix_trace(X %*% S) list(sum(abs(X)) <= alpha)
constr <- list(Sigma[1,1] == 0.2, Sigma[1,2] >= 0, Sigma[1,3] >= 0, Sigma[2,2] == 0.1, Sigma[2,3] <= 0, Sigma[2,4] <= 0, Sigma[3,3] == 0.3, Sigma[3,4] >= 0, Sigma[4,4] == 0.1)
投资组合优化--考虑马科维茨投资组合设计:最大化
,
Problem(Maximize(obj), constr) solve(prob)
结论
R语言中可用的求解器的数量很多。建议采取以下步骤。
- 如果是凸优化问题,那么开始进行初步测试。
- 如果速度不够快,使用ROI。
- 如果仍然需要更快的速度,那么如果问题属于定义好的类别之一,则使用该类别专用的求解器(例如,对于LP,推荐使用lpSolve,对于QP则使用quadprog)。
- 然而,如果问题不属于任何类别,那么就必须使用非线性优化的一般求解器。在这个意义上,如果一个局部的解决方案就够了,那么可以用许多求解器的包。如果需要全局求解器,那么软件包gloptim是一个不错的选择,它是许多全局求解器的包。
最受欢迎的见解
-
Matlab软件包求解最优化数学模型.caj
2009-01-01 15:09:00Matlab软件包求解最优化数学模型.caj -
benchmark:用于保护规划的精确算法求解器的基准性能
2021-04-01 06:06:44他们还检查了和 (通过Rsymphony和lpsymphony R软件包)开源求解器。 使用现实的保护规划数据集执行基准测试,该数据集涉及72种物种和从土地评估数据中得出的成本(请参阅 )。 为了研究不同求解器在不同大小的数据... -
Aztec在混凝土细观数值模拟中的应用研究 (2014年)
2021-05-21 07:02:56Aztec 是国际上专门设计用于求解稀疏线性方程组的软件包之一,由于目前混凝土细观数值模拟中的稀疏线性方程组对称正定,所以利用Aztec 中提供的CG迭代法进行求解,并对多种能保持对称性的预条件选项进行了实验比较。... -
matlab的eig源码-GCGE:用并行块阻尼反幂方法求解大规模特征值问题的软件包
2021-05-19 20:13:06matlab的eig源码 GCGE文件结构 app config src test GCGE配置编译 GCGE可以无需任何外部包独立编译运行,它内置的矩阵结构是 行/列压缩存储的矩阵 和 稠密矩阵。可以完成OpenMP加速。 下载安装GCGE包 ...pul -
如何用python结合cplex求解混合整数规划问题
2020-12-04 05:47:33有关适用于该软件包的其他选项,请参考 Python distutils 的文档。 设置环境变量 PYTHONPATH 如果并行运行 CPLEX 的多个版本,那么请使用此方法:通过环境变量 PYTHONPATH 来向 Python 安装声明 CPLEX 及其 Python ...展开全部
第一步:注册IBM id账号
第二步:下载相关系统的e69da5e6ba9062616964757a686964616f31333363396432CPLEX(windows/linux/mac)
这里需要系统中安装有JAVA,选择 open with Java web start launcher (需要下载JAVA),打开后就开始进入下载页面。
补充JAVA安装:
备注:JAVA可以通过rpm包安装,或者是bin文件安装。Rpm安装可以直接双击就可以打开jnlp后缀的文件,bin文件安装的话,需要在图形界面的命令行下执行:javaws ***.jnlp打开。我采用的是bin文件安装。
1、下载你想要的java版本压缩包。
2、对下载的文件进行解压
3、修改环境变量:
vim ~/.bashrc
#加入以下内容
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_144
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#保存后使之生效
source ~/.bashrc
第三步:下载完.bin文件后,修改文件的权限chmod +x filename.bin。然后用命令执行./filename.bin。进入安装。安装过程中需要设置安装路径,所以最好使用超级权限进行安装。默认路径为:/opt/ibm/ILOG/CPLEX_Studio_Community127
第四步:设置 CPLEX 的 Python API
CPLEX 的 Python API 属于 IBM ILOG CPLEX Optimization Studio 的一部分。
与CPLEX Python API 关联的模块驻留在目录 yourCPLEXhome/python/VERSION/PLATFORM 中(或文件夹 yourCPLEXhome\python\VERSION\PLATFORM 中),此处 yourCPLEXhome 指定 CPLEX 安装为 IBM ILOG CPLEX Optimization Studio 一部分的位置,VERSION 指定与 CPLEX 兼容的 Python 版本,而 PLATFORM 表示操作系统与编译器的组合。
有两种可相互替代的方法来设置 CPLEX 的 Python API。
• 首选且最常用的方法是使用位于目录 yourCPLEXhome/python/VERSION/PLATFORM 中(或文件夹 yourCPLEXhome\python\VERSION\PLATFORM 中)的脚本 setup.py。
• 或者,也可以将环境变量 PYTHONPATH 设置为 yourCPLEXhome/python/VERSION/PLATFORM 并通过 CPLEX 来开始运行 Python 脚本。
在以下段落中对这两种方法均进行了进一步详述。
使用脚本 setup.py
要在系统上安装 CPLEX-Python 模块,请使用位于 yourCplexhome/python/VERSION/PLATFORM 中的脚本 setup.py。 如果要将 CPLEX-Python 模块安装在非缺省位置,请使用选项 --home 识别安装目录。 例如,要将 CPLEX-Python 模块安装在缺省位置,请从命令行使用以下命令:
python setup.py install
要安装在目录 yourPythonPackageshome/cplex 中,请从命令行使用以下命令:
python setup.py install --home yourPythonPackageshome/cplex
这两个命令(缺省和指定主目录)均会调用 Python 包 distutils。 有关适用于该软件包的其他选项,请参考 Python distutils 的文档。
设置环境变量 PYTHONPATH
如果并行运行 CPLEX 的多个版本,那么请使用此方法:通过环境变量 PYTHONPATH 来向 Python 安装声明 CPLEX 及其 Python API 的位置。
要开始使用 CPLEX Python API,请将 Python 路径环境变量 PYTHONPATH 设置为值 yourCplexhome/python/VERSION/PLATFORM。 通过设置此环境变量,该版本的 Python 可以找到其所需的 CPLEX 模块以运行使用 CPLEX Python API 的 Python 命令和脚本。
后续步骤
通过这些可相互替代的方法之一设置 Python 环境后,便可以前进至启动 CPLEX Python API主题。
第五步:实例
Python -- version 2.7
有3个不同求解方式:
execfile("cplexpypath.py")
import cplex
from cplex.exceptions import CplexError
import sys
# data common to all populateby functions
my_obj = [1.0, 2.0, 3.0]
my_ub = [40.0, cplex.infinity, cplex.infinity]
my_colnames = ["x1", "x2", "x3"]
my_rhs = [20.0, 30.0]
my_rownames = ["c1", "c2"]
my_sense = "LL"
def populatebyrow(prob):
prob.objective.set_sense(prob.objective.sense.maximize)
# since lower bounds are all 0.0 (the default), lb is omitted here
prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)
# can query variables like the following bounds and names:
# lbs is a list of all the lower bounds
lbs = prob.variables.get_lower_bounds()
# ub1 is just the first lower bound
ub1 = prob.variables.get_upper_bounds(0)
# names is ["x1", "x3"]
names = prob.variables.get_names([0, 2])
rows = [[[0,"x2","x3"],[-1.0, 1.0,1.0]],
[["x1",1,2],[ 1.0,-3.0,1.0]]]
prob.linear_constraints.add(lin_expr = rows, senses = my_sense,
rhs = my_rhs, names = my_rownames)
# because there are two arguments, they are taken to specify a range
# thus, cols is the entire constraint matrix as a list of column vectors
cols = prob.variables.get_cols("x1", "x3")
def populatebycolumn(prob):
prob.objective.set_sense(prob.objective.sense.maximize)
prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,
names = my_rownames)
c = [[[0,1],[-1.0, 1.0]],
[["c1",1],[ 1.0,-3.0]],
[[0,"c2"],[ 1.0, 1.0]]]
prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames,
columns = c)
def populatebynonzero(prob):
prob.objective.set_sense(prob.objective.sense.maximize)
prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,
names = my_rownames)
prob.variables.add(obj = my_obj, ub = my_ub, names = my_colnames)
rows = [0,0,0,1,1,1]
cols = [0,1,2,0,1,2]
vals = [-1.0,1.0,1.0,1.0,-3.0,1.0]
prob.linear_constraints.set_coefficients(zip(rows, cols, vals))
# can also change one coefficient at a time
# prob.linear_constraints.set_coefficients(1,1,-3.0)
# or pass in a list of triples
# prob.linear_constraints.set_coefficients([(0,1,1.0), (1,1,-3.0)])
def lpex1(pop_method):
try:
my_prob = cplex.Cplex()
if pop_method == "r":
handle = populatebyrow(my_prob)
if pop_method == "c":
handle = populatebycolumn(my_prob)
if pop_method == "n":
handle = populatebynonzero(my_prob)
my_prob.solve()
except CplexError, exc:
print exc
return
numrows = my_prob.linear_constraints.get_num()
numcols = my_prob.variables.get_num()
print
# solution.get_status() returns an integer code
print "Solution status = " , my_prob.solution.get_status(), ":",
# the following line prints the corresponding string
print my_prob.solution.status[my_prob.solution.get_status()]
print "Solution value = ", my_prob.solution.get_objective_value()
slack = my_prob.solution.get_linear_slacks()
pi = my_prob.solution.get_dual_values()
x = my_prob.solution.get_values()
dj = my_prob.solution.get_reduced_costs()
for i in range(numrows):
print "Row %d: Slack = %10f Pi = %10f" % (i, slack[i], pi[i])
for j in range(numcols):
print "Column %d: Value = %10f Reduced cost = %10f" % (j, x[j], dj[j])
my_prob.write("lpex1.lp")
if __name__ == "__main__":
if len(sys.argv) != 2 or sys.argv[1] not in ["-r", "-c", "-n"]:
print "Usage: lpex1.py -X"
print " where X is one of the following options:"
print " r generate problem by row"
print " c generate problem by column"
print " n generate problem by nonzero"
print " Exiting..."
sys.exit(-1)
lpex1(sys.argv[1][1])
else:
prompt = """Enter the letter indicating how the problem data should be populated:
r : populate by rows
c : populate by columns
n : populate by nonzeros\n ? > """
r = 'r'
c = 'c'
n = 'n'
lpex1(input(prompt))
选择r参数,求解结果如下:
-
matlab终止以下代码-low-rank-opt-rapid-eig:该软件包使用低阶求解器处理相位检索。支持快速特征值计算并...
2021-05-21 10:59:00该软件包随附于论文,通过将它们构造为低阶半定程序来解决大规模相位检索和盲反卷积问题。 请注意,此程序包是Michael Friedlander对原始程序包()的修改。 底层相位检索算法saga_sd基于Michael Friedlander和Ives ... -
MATLAB求解线性规划(含整数规划及01规划)问题.pdf
2021-04-18 09:13:44MATLAB 求解线性规划(含整数规划和0-1 规划)问题线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:max z 7x 12 y9x 4y 3004x 5y 200... -
纳什均衡计算_纳什均衡_纳什均衡计算_纳什均衡_博弈_MATLAB合作博弈
2021-09-10 17:07:57本代码用于求解多方非合作博弈的纳什均衡解 -
求解线性方程组的ZITSOL软件包(支持复数)
2010-08-06 16:33:42Yousef Saad等人开发的软件包,非常棒。 可以在Linux下(Fedora)直接编译使用。 -
matlab的欧拉方法代码-rODE:这是CRANR软件包系统信息库的只读镜像。rODE—使用S4类在R中编写的常微分方程...
2021-05-26 12:19:36您确实必须使用软件包中提供的任何ODE求解器来开发ODE算法。 目的是在编写R的同时学习,理解物理学并使用数学。 rODE灵感来自非凡的物理库,用于计算机仿真OpenSourcePhyisics 。 看看吧。 我强烈推荐这本书, ... -
MATLAB求解线性规划(含整数规划和0-1规划)问题
2021-04-18 02:52:13最著名,同时也是最强大的数学最优化软件是LINGO/LINDO软件包,它能够求解多种的数学规划问题,同时还提供了多种的分析能力。但LINGO软件并不容易上手,同时,应用LINGO的场合一般是大规模的线性规划问题,小小的...