MATLAB求解线性规划含整数规划和01规划问题.pdf

合集下载

Matlab程序 0-1整数线性规划

Matlab程序  0-1整数线性规划

0-1整数线性规划Matlab程序x=bintprog(f)x=bintprog(f,A,b)x=bintprog(f,A,b,Aeq,beq)x=bintprog(f,A,b,Aeq,beq,x0)x=bintprog(f,A,b,Aeq,Beq,x0,options)[x,fval]=bintprog(...)[x,fval,exitflag]=bintprog(...)[x,fval,exitflag,output]=bintprog(...)这里x是问题的解向量f是由目标函数的系数构成的向量A是一个矩阵,b是一个向量A,b和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件A,b是系数矩阵和右端向量。

Aeq和Beq表示了线性规划中等式约束条件中的系数矩阵和右端向量。

X0是给定的变量的初始值options为控制规划过程的参数系列。

返回值中fval是优化结束后得到的目标函数值。

exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;exitflag>0表示优化过程中变量收敛于解X,exitflag<0表示计算不收敛。

output有3个分量,iterations表示优化过程的迭代次数,cgiterations表示PCG迭代次数,algorithm表示优化所采用的运算规则。

在使用linprog()命令时,系统默认它的参数至少为1个,但如果我们需要给定第6个参数,则第2、3、4、5个参数也必须给出,否则系统无法认定给出的是第6个参数。

遇到无法给出时,则用空矩阵“[]”替代。

例如max=193*x1+191*x2+187*x3+186*x4+180*x5+185*x6;%f由这里给出st.x5+x6>=1;x3+x5>=1;x1+x2<=1;x2+x6<=1;x4+x6<=1;%a、b由不等关系给出,如没有不等关系,a、b取[]x1+x2+x3+x4+x5+x6=1;%aep、bep由等式约束给出代码如下f=[-193;-191;-187;-186;-180;-185;];a=[0000-1-1;0-100-10;110000;010001;000101]; b=[-1,-1,1,1,1]';aeq=[111111];beq=[3];x=bintprog(f,a,b,aeq,beq)注意目标值为最大值时应乘以-1化为求最小值;不等约束为>=时应乘以-1化为<=;。

matlab求解整数规划问题

matlab求解整数规划问题

matlab求解整数规划问题⼀、整数规划定义:数学规划中的变量(部分或全部)限制为整数时,称为整数规划。

若在线性规划模型中,变量限制为整数,则称为整数线性规划。

分类:(1)变量全部限制为整数时,称为纯(完全)整数规划;(2)变量部分限制为整数时,称为混合整数规划。

特点:(1)原线性规划有最优解,当⾃变量限制为整数后,其整数规划解出现下述情况。

原线性规划最优解全是整数,则整数规划最优解与线性规划最优解⼀致整数规划⽆可⾏解有可⾏解(存在最优解),但最优解值变差(2)整数规划最优解不能按照实数最优解简单取值⽽获得。

求解⽅法分类:分枝定界法——可求完全或混合整数线性规划割平⾯法——可求完全或混合整数线性规划隐枚举法——求解“0-1”整数规划匈⽛利法——解决指派问题蒙特卡洛法——求解各种类型规划⼆、⾮线性规划的Matlab标准形式及问题求解c=[2;3;4];a=[1.5,3,5;280,250,400];b=[600;60000];intcon=[1,2,3];[x,y]=intlinprog(-c,intcon,a,b,[],[],zeros(3,1))x,y=-yf=[5;5.1;5.4;5.5;0.2;0.2;0.2];a=[1 0 0 0 0 0 0;0 1 0 0 0 0 0 ;0 0 1 0 0 0 0;0 0 0 1 0 0 0];b=[30;40;45;20];aeq=[1 0 0 0 -1 0 0;0 1 0 0 1 -1 0 ;0 0 1 0 0 1 -1;0 0 0 1 0 0 1];beq=[15;25;35;25];intcon=[1,2,3,4,5,6,7];[x,y]=intlinprog(f,intcon,a,b,aeq,beq,zeros(7,1))四、整数⾮线性规划的代码实现(matlab)2+x(2)2+4*x(4)max z = x(1)2+3x(3)2+2x(5)^2-8x(1)-2x(2)-3x(3)-x(4)-2x(5)约束条件为:x1 + x2 + x3 + x4 + x5 <= 400x1 + 2x2 + 2x3 + x4 + 6x5 <= 8002x1 + x2 + 6x3 <= 200x3 + x4 + 5x5 <= 2000=< xi <= 99 , i = 1,2,3,4,5function myfunx0 = [50 99 0 99 20];A = [1,1,1,1,1;1,2,2,1,6;2,1,6,0,0;0,0,1,1,5];b = [400,800,200,200];Aeq = [];beq = [];VLB = [0;0;0;0;0];VUB = [99;99;99;99;99];[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,VLB,VUB)endfunction ff = fun(x)ff = -(x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5)); end五、蒙特卡罗法求解整数⾮线性规划2+x22+4*x4max z = x12+3x32+2x5^2-8x1-2x2-3x3-x4-2x5约束条件为:x1 + x2 + x3 + x4 + x5 <= 400x1 + 2x2 + 2x3 + x4 + 6x5 <= 8002x1 + x2 + 6x3 <= 200x3 + x4 + 5x5 <= 2000=< xi <= 99 , i = 1,2,3,4,5% 主函数rand('state',sum(clock));p0=0;ticfor i=1:100x1=randi([0,99],5,1);[f,g]=mengte(x1);if sum(g<=0)==4if p0<=fx0=x1;p0=f;endendendx0,p0tocfunction [f,g]=mengte(x);f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)...-x(4)-2*x(5);g(1)=sum(x)-400;g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;g(3)=2*x(1)+x(2)+6*x(3)-200;g(4)=x(3)+x(4)+5*x(5)-200;end。

matlab求解线性规划

matlab求解线性规划

matlab求解线性规划MATLAB是一个强大的工具,可以用于求解线性规划问题。

线性规划是一种最优化问题,目标是在满足一系列线性约束条件下,找到一个使目标函数取得最大或最小值的解。

在MATLAB中,可以使用线性规划工具箱来求解线性规划问题。

线性规划工具箱提供了一些函数,如linprog,intlinprog和quadprog,这些函数可以用于求解线性规划问题。

解线性规划问题的一般步骤如下:1. 定义目标函数。

目标函数是要优化的函数,可以是线性函数。

例如,如果我们要最小化一个函数f(x)=c1x1+c2x2+...+cnxn,则可以将目标函数表示为向量c=[c1,c2,...,cn]的内积与向量x=[x1,x2,...,xn]。

2. 定义约束条件。

约束条件是对决策变量的限制条件。

一般情况下,约束条件可以表示为Ax<=b,其中A是一个矩阵,x是决策变量向量,b是一个向量。

例如,如果我们有两个约束条件2x1+x2<=10和x1+3x2<=12,则可以将约束条件表示为矩阵A=[2,1;1,3]和向量b=[10;12]。

3. 调用线性规划函数。

在MATLAB中,可以使用linprog函数来求解线性规划问题。

linprog函数有几个输入参数,包括目标函数系数向量c,约束条件矩阵A和向量b,以及可选参数lb和ub。

参数lb和ub是可选参数,用于指定决策变量的下界和上界。

例如,要求解上述线性规划问题,可以调用linprog函数如下:x = linprog(c, A, b)函数linprog返回一个向量x,其中包含目标函数取得最小值时的决策变量的取值。

4. 分析结果。

一旦线性规划问题被求解,我们可以通过检查目标函数的值和决策变量的取值来分析结果。

例如,目标函数的值就是目标函数取得最小值时的值,其中决策变量的取值可以用x变量表示。

总结而言,MATLAB是一个功能强大的工具,可以用于求解线性规划问题。

7.1 用MATLAB求解线性规划

7.1 用MATLAB求解线性规划

b=zeros(m,n) c=ones(m,n) d=eye(m,n)
产生一个m行、n列的零矩阵 产生一个m行、n列的元素 全为1的矩阵 产生一个m行、n列的单位矩阵
MATLAB (matrix1)
Page 35
2、矩阵中元素的操作
(1)矩阵A的第r行:A(r,:) (2)矩阵A的第r列:A(:,r) (3)取矩阵A的第i1~i2行、第j1~j2列构成新矩阵:A(i1:i2, j1:j2) (4)以逆序提取矩阵A的第i1~i2行,构成新矩阵:A(i2:-1:i1,:) (5)删除A的第i1~i2行,构成新矩阵:A(i1:i2,:)=[ ] (6)删除A的第j1~j2列,构成新矩阵:A(:, j1:j2)=[ ] (7)将矩阵A和B拼接成新矩阵:[A B];[A;B]
a.\b=[b1/a1,b2/a2,…,bn/an] a.^b=[a1^b1,a2^b2,…,an^bn]
Page 32
1、矩阵的建立 ( 1)将矩阵的元素用方括号括起来,按矩阵行的 顺序输入各元素,同一行的各元素之间用空格或逗 号分隔,不同行的元素之间用分号分隔。在输入矩 阵时,按Enter键也表示开始一新行. 例:键入命令: A=[1 2 3;4 5 6;7 8 9] A=[1,2,3;4,5,6;7,8,9] 输出结果: A = 1 2 3 4 5 6 7 8 9
主要内容
一、 变量与函数 二、 数组与矩阵 三、 举例 四、 线性规划求解
Page 14
一、变量与函数
Page 15
Matlab是以矩阵为基本运算单元的,它的大部分 运算或命令都是在矩阵运算的意义下执行的。而构
成矩阵的基本单元是数字。
258×369
一、变量与函数
1、变量 命名规则是:

MATLAB求解线性规划(含整数规划和01规划)问题

MATLAB求解线性规划(含整数规划和01规划)问题

MATLAB 求解线性规划(含整数规划和0-1规划)问题线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。

如:max 712z x y =+9430045200s.t 310300,0x y x y x y x y +≤⎧⎪+≤⎪⎨+≤⎪⎪≥⎩对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。

但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。

最著名,同时也是最强大的数学最优化软件是LINGO/LINDO 软件包,它能够求解多种的数学规划问题,同时还提供了多种的分析能力。

但LINGO 软件并不容易上手,同时,应用LINGO 的场合一般是大规模的线性规划问题,小小的线性规划完全可以不使用它。

一个更受科研人员欢迎的数学软件是MATLAB ,它以功能强大而称著,并有数学软件中的“航空母舰”之称。

我们这里就是要学习使用MATLAB 软件求解线性规划(含整数规划和0-1规划)问题。

为了使得不熟悉MATLAB 的人员也能够使用MATLAB 进行线性规划问题求解,本文将对MATALB 中使用到的函数和过程以及结果进行详细的分析,最后会对每一个问题都给出一个可以完全“套用”的MATLAB 程序。

我们首先从上面的线性规划问题开始,为了便于表达,将上面的式子写成矩阵形式:max 712z x y =+9430045200s.t 310300,0x y x y ⎧⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪∙≤⎪ ⎪ ⎪ ⎪⎨⎝⎭ ⎪ ⎪⎝⎭⎝⎭⎪⎪≥⎩于是约束就表达为了一个Ax b ≤不等式。

求解MATLAB 线性规划时,最常用的函数是linprog 函数,下面来介绍一下这个函数的使用。

打开MATLAB 帮助文档(PS:帮助文档的内容是最全的,只要你的英文过了专业8级),可以看到linprog 函数求解的是具有如下标准形式的线性规划:min .Tx f x A X b s t Aeq X beq lb x ub ≤⎧⎪=⎨⎪≤≤⎩公式中各符号的意义是自明的,在这里简单介绍下,首先MATLAB 中求解的是目标函数是最小值的问题,但如果我们的目标函数是求最大值,可以通过对目标函数中每一项中乘以-1,将求最大值问题转化为求最小值问题;A ,b 分别为不等式约束中的系数矩阵。

用matlab求解线性规划问题

用matlab求解线性规划问题

实验四 用MATLAB 求解线性规划问题一、实验目的:了解Matlab 的优化工具箱,能利用Matlab 求解线性规划问题。

二、实验内容:线性规划的数学模型有各种不同的形式,其一般形式可以写为:目标函数: n n x f x f x f z +++=Λ2211m in约束条件: s n sn s s n n b x a x a x a b x a x a x a ≤+++≤+++ΛΛΛΛΛ221111212111 s n tn t t n n d x c x c x c d x c x c x c =+++=+++ΛΛΛΛΛ2211112121110,,,21≥n x x x Λ 这里n n x f x f x f z +++=Λ2211称为目标函数,j f 称为价值系数,T n f f f f ),,,(21Λ=称为价值向量,j x 为求解的变量,由系数ij a 组成的矩阵⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=mn m n a a a a A ΛΛOΛΛ1111称为不等式约束矩阵,由系数ij c 组成的矩阵 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=sn s n c c c c C ΛΛOΛΛ1111称为等式约束矩阵,列向量Tn b b b b ),,,(21Λ=和T n d d d d ),,,(21Λ=为右端向量,条件0≥j x 称为非负约束。

一个向量Tn x x x x ),,,(21Λ=,满足约束条件,称为可行解或可行点,所有可行点的集合称为可行区域,达到目标函数值最大的可行解称为该线性规划的最优解,相应的目标函数值称为最优目标函数值,简称最优值。

我们这里介绍利用Matlab 来求解线性规划问题的求解。

在Matlab 中有一个专门的函数linprog()来解决这类问题,我们知道,极值有最大和最小两种,但求z 的极大就是求z -的极小,因此在Matlab 中以求极小为标准形式,函数linprog()的具体格式如下: X=linprog(f,A,b)[X,fval,exitflag,ouyput,lamnda]=linprog(f,A,b,Aeq,Beq,LB,UB,X0,options)这里X 是问题的解向量,f 是由目标函数的系数构成的向量,A 是一个矩阵,b 是一个向量,A ,b 和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件,A ,b 是系数矩阵和右端向量。

如何使用Matlab进行线性规划与整数规划

如何使用Matlab进行线性规划与整数规划

如何使用Matlab进行线性规划与整数规划引言在现代科技逐渐发展的背景下,线性规划和整数规划作为一种数学优化方法,被广泛应用于各个领域。

Matlab作为一种强大的数值计算工具,提供了各种优化工具箱,可以方便地进行线性规划和整数规划的求解。

本文将详细介绍如何使用Matlab进行线性规划和整数规划求解,并结合实例进行说明。

一、线性规划的基本概念线性规划是一种数学规划方法,其目标是在一组线性约束条件下寻找一组变量的最优解,使得目标函数值达到最大或最小。

线性规划的标准形式可以表示为:min/max f(x) = c^T * xs.t. A * x <= bAeq * x = beqlb <= x <= ub其中,f(x)为线性目标函数,c为其系数向量;x为变量向量;A、b、Aeq、beq 分别为不等式约束和等式约束的系数矩阵和向量;lb和ub分别为变量的下界和上界。

二、使用Matlab进行线性规划求解Matlab提供了优化工具箱,其中的linprog函数可以方便地求解线性规划问题。

以下是使用linprog函数求解线性规划问题的基本步骤:Step 1: 定义目标函数和约束条件首先,需要定义目标函数和约束条件的系数。

假设我们要最小化目标函数 f(x) = 2x1 + 3x2,约束条件为 2x1 + x2 <= 10,x1 + 3x2 <= 15,x1和x2的取值范围均为非负实数。

c = [2; 3]; % 目标函数的系数向量A = [2, 1; 1, 3]; % 不等式约束的系数矩阵b = [10; 15]; % 不等式约束的右侧系数向量lb = [0; 0]; % 变量的下界Step 2: 调用linprog函数求解线性规划问题然后,可以使用linprog函数求解线性规划问题。

该函数的基本语法为:[x, fval] = linprog(c, A, b, [], [], lb);其中,x为求解得到的最优解,fval为最优解对应的目标函数值。

用matlab求解线性规划问题

用matlab求解线性规划问题

实验四 用MATLAB 求解线性规划问题一、实验目的:了解Matlab 的优化工具箱,能利用Matlab 求解线性规划问题。

二、实验内容:线性规划的数学模型有各种不同的形式,其一般形式可以写为:目标函数: n n x f x f x f z +++=Λ2211m in约束条件: s n sn s s n n b x a x a x a b x a x a x a ≤+++≤+++ΛΛΛΛΛ221111212111 s n tn t t n n d x c x c x c d x c x c x c =+++=+++ΛΛΛΛΛ2211112121110,,,21≥n x x x Λ 这里n n x f x f x f z +++=Λ2211称为目标函数,j f 称为价值系数,T n f f f f ),,,(21Λ=称为价值向量,j x 为求解的变量,由系数ij a 组成的矩阵⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=mn m n a a a a A ΛΛOΛΛ1111称为不等式约束矩阵,由系数ij c 组成的矩阵 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=sn s n c c c c C ΛΛOΛΛ1111称为等式约束矩阵,列向量Tn b b b b ),,,(21Λ=和T n d d d d ),,,(21Λ=为右端向量,条件0≥j x 称为非负约束。

一个向量Tn x x x x ),,,(21Λ=,满足约束条件,称为可行解或可行点,所有可行点的集合称为可行区域,达到目标函数值最大的可行解称为该线性规划的最优解,相应的目标函数值称为最优目标函数值,简称最优值。

我们这里介绍利用Matlab 来求解线性规划问题的求解。

在Matlab 中有一个专门的函数linprog()来解决这类问题,我们知道,极值有最大和最小两种,但求z 的极大就是求z -的极小,因此在Matlab 中以求极小为标准形式,函数linprog()的具体格式如下: X=linprog(f,A,b)[X,fval,exitflag,ouyput,lamnda]=linprog(f,A,b,Aeq,Beq,LB,UB,X0,options)这里X 是问题的解向量,f 是由目标函数的系数构成的向量,A 是一个矩阵,b 是一个向量,A ,b 和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件,A ,b 是系数矩阵和右端向量。

用MATLAB求解线性规划

用MATLAB求解线性规划
划。
模型 1 固定风险水平,优化收益
目标函数: 约束条件:
n 1
Q=MAX (ri pi )xi
i 1
qi xi ≤a
M
(1 p )x M , ii
xi≥ 0
i=0,1,…n
b.若投资者希望总盈利至少达到水平 k 以上,在风险最小的 情况下寻找相应的投资组合。
模型 2 固定盈利水平,极小化风险
从 a=0 开始,以步长△a=0.001对下列组合投资模型求解, 并绘图表示 a 与目 标函数最优值 Q 的对应关系:
max s.t.
Q = (-0.05, -0.27, -0.19, -0.185, -0.185) (x0,x1,x2,x3,x4) T
x0 + 1.01x1 + 1.02x2 +1.045x3 +1.065x4 =1
目标函数: R= min{max{ qixi}} 约束条件:
n
(r i
p )x
i
i
≥k,
i0
(1 pi )xi M , xi≥ 0
i=0,1,…n
c.投资者在权衡资产风险和预期收益两方面时,希望选择 一个令自己满意的投资组合。
因此对风险、收益赋予权重 s(0<s≤1),s 称为投资偏好 系数.
2.当投资越分散时,投资者承担的风险越小,这与题意一致。即: 冒险的投资者会出现集中投资的情况,保守的投资者则尽量分散投资。
3.曲线上的任一点都表示该风险水平的最大可能收益和该收益要求的最 小风险。对于不同风险的承受能力,选择该风险水平下的最优投资组合。
4.在a=0.006附近有一个转折点,在这一点左边,风险增加很少时,利润增长
符号规定:
Si

Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题

1.线性规划问题:min f*xs.t. A*x<=bAeq*x=beqlb<=x<=ub其中:A为不等式约束的系数矩阵,Aeq表示等式约束的系数矩阵,b表示不等式约束的常向量,beq表示等式约束的常向量,lb和ub表示自变量的上下范围。

求解函数:linprog(f,A,b,Aeq,beq,lb,ub)其中:f,A,b ,Aeq,beq,lb,ub的定义如上。

2.整数规划问题:利用函数(linprog)先把BranchBound函数存在matlab的路径下,BranchBound函数的内容如下:function [y,fval]=BranchBound(c,A,b,Aeq,beq)NL=length(c);UB=inf;LB=-inf;FN=[0];AA(1)={A};BB(1)={b};k=0;flag=0;while flag==0;[x,fval,exitFlag]=linprog(c,A,b,Aeq,beq);if (exitFlag == -2) | (fval >= UB)FN(1)=[];if isempty(FN)==1flag=1;elsek=FN(1);A=AA{k};b=BB{k};endelsefor i=1:NLif abs(x(i)-round(x(i)))>1e-7kk=FN(end);FN=[FN,kk+1,kk+2];temp_A=zeros(1,NL);temp_A(i)=1;temp_A1=[A;temp_A];AA(kk+1)={temp_A1};b1=[b;fix(x(i))];BB(kk+1)={b1};temp_A2=[A;-temp_A];AA(kk+2)={temp_A2};b2=[b;-(fix(x(i))+1)];BB(kk+2)={b2};FN(1)=[];k=FN(1);A=AA{k};b=BB{k};break;endendif (i==NL) & (abs(x(i)-round(x(i)))<=1e-7)UB=fval;y=x;FN(1)=[];if isempty(FN)==1flag=1;elsek=FN(1);A=AA{k};b=BB{k};endendendendy=round(y);fval=c*y;再利用命令[y,fval]=BranchBound(c,A,b,Aeq,beq)即可。

Matlab程序 0-1整数线性规划

Matlab程序  0-1整数线性规划

0-1整数线性规划Matlab程序x=bintprog(f)x=bintprog(f,A,b)x=bintprog(f,A,b,Aeq,beq)x=bintprog(f,A,b,Aeq,beq,x0)x=bintprog(f,A,b,Aeq,Beq,x0,options)[x,fval]=bintprog(...)[x,fval,exitflag]=bintprog(...)[x,fval,exitflag,output]=bintprog(...)这里x是问题的解向量f是由目标函数的系数构成的向量A是一个矩阵,b是一个向量A,b和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件A,b是系数矩阵和右端向量。

Aeq和Beq表示了线性规划中等式约束条件中的系数矩阵和右端向量。

X0是给定的变量的初始值options为控制规划过程的参数系列。

返回值中fval是优化结束后得到的目标函数值。

exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;exitflag>0表示优化过程中变量收敛于解X,exitflag<0表示计算不收敛。

output有3个分量,iterations表示优化过程的迭代次数,cgiterations表示PCG迭代次数,algorithm表示优化所采用的运算规则。

在使用linprog()命令时,系统默认它的参数至少为1个,但如果我们需要给定第6个参数,则第2、3、4、5个参数也必须给出,否则系统无法认定给出的是第6个参数。

遇到无法给出时,则用空矩阵“[]”替代。

例如max=193*x1+191*x2+187*x3+186*x4+180*x5+185*x6;%f由这里给出st.x5+x6>=1;x3+x5>=1;x1+x2<=1;x2+x6<=1;x4+x6<=1;%a、b由不等关系给出,如没有不等关系,a、b取[]x1+x2+x3+x4+x5+x6=1;%aep、bep由等式约束给出代码如下f=[-193;-191;-187;-186;-180;-185;];a=[0000-1-1;0-100-10;110000;010001;000101]; b=[-1,-1,1,1,1]';aeq=[111111];beq=[3];x=bintprog(f,a,b,aeq,beq)注意目标值为最大值时应乘以-1化为求最小值;不等约束为>=时应乘以-1化为<=;。

Matlab求解0-1整数线性规划-Matlab-无

Matlab求解0-1整数线性规划-Matlab-无
b=[-1,-1,1,1,1]';
aeq=[1 1 1 1 1 1];
beq=[3];
x=bintprog(f,a,b,aeq,beq)
注意
目标值为最大值时应乘以-1化为求最小值;
不等约束为>=时应乘以-1化为<=;
algorithm表示优化所采用的运算规则。
在使用linprog()命令时,系统默认它的参数至少为1个,
但如果我们需要给定第6个参数,则第2、3、4、5个参数也必须给出,否则系统无法认定给出的是第6个参数。遇到无法给出时,则用空矩阵“[]”替代。
例如
max=193*x1+191*x2+187*x3+186*x4+180*x5+185*x6; %f由这里给出
x = bintprog(f, A, b, Aeq, beq, x0)
x = bintprog(f, A, b, Aeq, Beq, x0, options)
[x, fval] = bintprog(...)
[x,fval, exitflag] = bintprog(...)
[x, fval, exitflag, output] = bintprog(...)
返回值中fval是优化结束后得到的目标函数值。
exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;
exitflag>0表示优化过程中变量收敛于解X,
exitflag<0表示计算不收敛。
output有3个分量,
iterations表示优化过程的迭代次数,
cgiterations表示PCG迭代次数,
但如果我们需要给定第6个参数则第2345个参数也必须给出否则系统无法认定给出的是第6个参数

Matlab数学规划问题求解

Matlab数学规划问题求解

Matlab数学规划问题求解1. 线性规划线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0解决的线性规划问题的标准形式为:min n R',f∈xxsub.to:b⋅xA≤A e q=⋅xb e q≤lb≤xub其中f、x、b、beq、lb、ub为向量,A、Aeq为矩阵。

其它形式的线性规划问题都可经过适当变换化为此标准形式。

在MATLAB6.0版中,线性规划问题(Linear Programming)已用函数linprog取代了MATLAB5.x版中的lp函数。

当然,由于版本的向下兼容性,一般说来,低版本中的函数在6.0版中仍可使用。

函数linprog调用格式:x=linprog(f,A,b)x=linprog(f,A,b,Aeq,beq)x=linprog(f,A,b,Aeq,beq,lb,ub)x=linprog(f,A,b,Aeq,beq,lb,ub,x0)x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)[x,fval]=linprog(…)[x, fval, exitflag]=linprog(…)[x, fval, exitflag, output]=linprog(…)[x, fval, exitflag, output, lambda]=linprog(…)说明:x=linprog(f, A, b)%求min f ' *x, sub.to bA≤⋅线性规划的最优解。

返回x值x为最优解向量。

x=linprog(f, A, b, Aeq, beq) %含有等式约束beq⋅,若没有不等式xAeq=约束b⋅,则令A=[ ],b=[ ]。

A≤xx = linprog(f, A, b, Aeq, beq, lb, ub) %指定x的范围ub≤xlb≤x=linprog(f, A, b, Aeq, beq, lb, ub, x0) %设置x0为初值点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MATLAB 求解线性规划(含整数规划和0-1规划)问题
线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。

如:
max 712z x y =+
9430045200s.t 310300,0
x y x y x y x y +≤⎧⎪+≤⎪⎨+≤⎪⎪≥⎩
对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。

但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。

最著名,同时也是最强大的数学最优化软件是LINGO/LINDO 软件包,它能够求解多种的数学规划问题,同时还提供了多种的分析能力。

但LINGO 软件并不容易上手,同时,应用LINGO 的场合一般是大规模的线性规划问题,小小的线性规划完全可以不使用它。

一个更受科研人员欢迎的数学软件是MATLAB ,它以功能强大而称著,并有数学软件中的“航空母舰”之称。

我们这里就是要学习使用MATLAB 软件求解线性规划(含整数规划和0-1规划)问题。

为了使得不熟悉MATLAB 的人员也能够使用MATLAB 进行线性规划问题求解,本文将对MATALB 中使用到的函数和过程以及结果进行详细的分析,最后会对每一个问题都给出一个可以完全“套用”的MATLAB 程序。

我们首先从上面的线性规划问题开始,为了便于表达,将上面的式子写成矩阵形式:
max 712z x y =+
9430045200s.t 310300,0x y x y ⎧⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪∙≤⎪ ⎪ ⎪ ⎪⎨⎝⎭ ⎪ ⎪⎝⎭⎝⎭⎪⎪≥⎩
于是约束就表达为了一个Ax b ≤不等式。

求解MATLAB 线性规划时,最常用的函数是linprog 函数,下面来介绍一下这个函数的使用。

打开MATLAB 帮助文档(PS:帮助文档的内容是最全的,只要你的英文过了专业8级),可以看到linprog 函数求解的是具有如下标准形式的线性规划:
min .T
x f 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但都无最大值约束。

而linprog 的返回值x 为求得的各变量的值,这是一个向量,fval 为最优化的值,一般是一个标量,exitflag 意为函数的退出标志。

上面所示的代码[x,fval]=linprog(f,A,b,[],[],lb,[])中,[]代表不存在或空,因为在上面的例子中不存在等式约束,所以Aeq 和beq 的位置为[]。

而ub 也为空,是因为变量没有最大值约束。

运行上面的程序,行到结果为:
x =
20.0000
24.0000
fval =
-428.0000
解释为:
当x=20,y=24时,可以求得最优化的值,最大值为428(因为这里的求目标最大值,但MATLAB 只能求目标函数最小值,所以对目标函数进行了乘-1处理,所以也要对最后的结果乘以-1才是目标函数所求).
上面解决了简单的线性规划问题的求解,线性规范有两种比较特殊的情况,即整数规划和0-1整数规划。

在之前(不知MATLAB 几之前……),MATLAB 是不能直接求解这两种规划的,bintprog 函数可以用来求0-1整数规划,但求解过程比较麻烦,而且最新版的MATLAB 已经遗弃了这个函数,同时提供了一个比较新的、专用于求解整数规划和0-1整数规划的函数——intlinprog 。

intlinprog 的一个原型为:
[x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub) 该函数的使用和linprog 函数的使用十分相似,其仅仅在linprog 函数的基础上多了一个参数——intcon 。

我们来通过下面的例子来学习该参数的意义。

min 12z x x =--
12122124214211..21
,0,x x x x s t x x x -+≤-⎧⎪+≤⎪⎨-≤-⎪⎪≥⎩整数
在这里例子中,变量的取值范围不再是有理数集,而是整数集。

求解此规划问题的MATLAB 程序如下:
f_13=[-1,-1];
ic_13=[1,2];
A_13=[-4,2;4,2;0,-2];
b_13=[-1;11;-1];
lb_13=zeros(2,1);
[x_13,fval_13,flag_13]=intlinprog(f_13,ic_13,A_13,b_13,[],[],lb_13,[])
在函数intlinprog 中,intcon 的意义为整数约束变量的位置。

如上例中,因为x1和x2都要是整数,intcon 参数位置ic_13的值为[1,2]。

这个位置是按照目标函数和约束条件中变量位置来排列的。

如果上式中仅有x2为整数约束,那么ic_13的值应该为2。

需要说明的是,intlinprog 函数在比较旧版本是不支持的(我使用的是MATLAB2014B ),如果你发现你现在的MATLAB 没有intlinprog 函数,请不要吃惊,因为一直以来,MATLAB 都是无法直接求解整数规划的,但今时已经不同往日了。

现在又有了一个新问题,我们解决了在MATLAB 上求解一般的整数规划问题,但要是遇到0-1整数规划问题呢?到这里,我们只要转换一下思维,就可以利用MATLAB 求解0-1整数规划了,这里先卖个关子,请大家看下面的例子是怎么用MATLAB 求解0-1整数规划的。

min 1234575963z x x x x x =++++
12345123124512345562054421510044..222
,,,,01
x x x x x x x x s t x x x x x x x x x ++++≤⎧⎪++≤⎪⎨+++≥⎪⎪=⎩或
MATLAB 程序如下:
f_12=[7 5 9 6 3];
ic_12=[1,2,3,4,5];
A_12=[56,20,54,42,15;1,4,1,0,0;-1,-2,0,-1,-2];
b_12=[100;4;-2];
lb_12=zeros(5,1);
ub_12=ones(5,1);
[x_12,fval_12,flag_12]=intlinprog(f_12,ic_12,A_12,b_12,[],[],lb_12,ub _12)
有木有发现在,与上面整数规划不同的地方只有一个,就是多了
ub_12=ones(5,1),也就是说求解0-1整数规划只要在求解整数规划的基础上加上一个对变量最大值约束为1就行了,有木有恍然大悟的感觉???
后面两个程序并没有给出程序运行的结果,因为笔者坚信学习最好的方式就是“动手”。

^_^。

相关文档
最新文档