线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转化成标准形。
线性规划的求解方法主要是单纯形法(Simple Method),该法由Dantzig于1947年提出,以后经过多次改进。单纯形法是一种迭代算法,它从所有基本可行解的一个较小部分中通过迭代过程选出最优解。其迭代过程的一般描述为: 1. 将线性规划化为典范形式,从而可以得到一个初始基本可行解x(0)(初始顶点),将它作为迭代过程的出发点,其目标值为z(x(0))。
2. 寻找一个基本可行解x(1),使z(x(1))≤z(x(0))。方法是通过消去法将产生x(0)的典范形式化为产生x(1)的典范形式。
3. 继续寻找较好的基本可行解x(2),x(3),…,使目标函数值不断改进,即
z(x(1))≥z(x(2)) ≥z(x(3)) ≥…。当某个基本可行解再也不能被其它基本可行解改进时,它就是所求的最优解。
Matlab优化工具箱中采用的是投影法,它是单纯形法的一种变种。
9.2.2.2 相关函数介绍 linprog函数
功能:求解线性规划问题。 数学模型:
其中f, x, b, beq, lb和ub为向量,A 和Aeq为矩阵。 语法:
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,约束条件为A*x <= b。 x = linprog(f,A,b,Aeq,beq)求解上面的问题,但增加等式约束,即Aeq*x = beq。若没有不等式存在,则令A=[]、b=[]。
x = linprog(f,A,b,Aeq,beq,lb,ub)定义设计变量x的下界lb和上界ub,使得x始终在该范围内。若没有等式约束,令Aeq=[]、beq=[]。
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)设置初值为x0。该选项只适用于中型问题,缺省时大型算法将忽略初值。
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)用options指定的优化参数进行最小化。
[x,fval] = linprog(...) 返回解x处的目标函数值fval。
[x,lambda,exitflag] = linprog(...)返回exitflag值,描述函数计算的退出条件。
[x,lambda,exitflag,output] = linprog(...) 返回包含优化信息的输出变量output。
[x,fval,exitflag,output,lambda] = linprog(...) 将解x处的拉格朗日乘子返回到lambda参数中。 变量:
lambda参数
lambda参数是解x处的拉格朗日乘子。它有以下一些属性: ? lambda.lower –lambda的下界。 ? lambda.upper –lambda的上界。
? lambda.ineqlin –lambda的线性不等式。 ? lambda.eqlin –lambda的线性等式。 其它参数意义同前。 算法:
大型优化算法 大型优化算法采用的是LIPSOL法,该法在进行迭代计算之前首先要进行一系列的预处理。
中型优化算法 linprog函数使用的是投影法,就象quadprog函数的算法一样。linprog函数使用的是一种活动集方法,是线性规划中单纯形法的变种。它通过求解另一个线性规划问题来找到初始可行解。 诊断:
大型优化问题 算法的第一步涉及到一些约束条件的预处理问题。有些问题可能导致linprog函数退出,并显示不可行的信息。在本例中,exitflag参数将被设为负值以表示优化失败。
若Aeq参数中某行的所有元素都为零,但Beq参数中对应的元素不为零,则显示以下退出信息: Exiting due to infeasibility: an all zero row in the constraint matrix does not have a zero in corresponding right hand size entry. 若x的某一个元素没在界内,则给出以下退出信息:
Exiting due to infeasibility: objective f'*x is unbounded below. 若Aeq参数的某一行中只有一个非零值,则x中的相关值称为奇异变量。这里,x中该成分的值可以用Aeq和Beq算得。若算得的值与另一个约束条件相矛盾,则给出以下退出信息:
Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.
若奇异变量可以求解但其解超出上界或下界,则给出以下退出信息:
Exiting due to infeasibility: singleton variables in the equality constraints are not within bounds. 9.2.2.3 应用实例 [ [例二] 生产决策问题
某厂生产甲乙两种产品,已知制成一吨产品甲需用资源A 3吨,资源B 4m3;制成一吨产品乙需用资源A 2吨,资源B 6m3,资源C 7个单位。若一吨产品甲和
乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3和210个单位,试决定应生产这两种产品各多少吨才能使创造的总经济价值最高?
令生产产品甲的数量为x1,生产产品乙的数量为x2。由题意可以建立下面的模型:
该模型中要求目标函数最大化,需要按照Matlab的要求进行转换,即目标函数为
首先输入下列系数: f = [-7;-5]; A = [3 2 4 6 0 7]; b = [90; 200; 210]; lb = zeros(2,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb) x =
14.0000 24.0000 fval =
-218.0000 exitflag =
1 output = iterations: 5 cgiterations: 0 algorithm: 'lipsol' lambda = ineqlin: [3x1 double] eqlin: [0x1 double] upper: [2x1 double] lower: [2x1 double] 由上可知,生产甲种产品14吨、乙种产品24吨可使创建的总经济价值最高。最高经济价值为218万元。exitflag=1表示过程正常收敛于解x处。 磁盘中本问题的M文件为opt22_2.m。 [例三] 投资问题 某单位有一批资金用于四个工程项目的投资,用于各工程项目时所得到得净收益(投入资金的百分比)如下表所示: 表9-11 工程项目收益表 工 程 项 目 收益(%) A 15 B 10 C 8 D 12