目录
一、概念
(1)建立线性规划模型的一般步骤
(2)举例代码如下:
二、整数规划
(1)重点:travel salesman problem
(2)相互排斥的约束条件
(3)代码实现
三、非线性规划
(1)一般非线性规划
(2)二次规划
1.分析问题,找出决策变量。
2.根据问题,找出决策变量需要满足的线性等式或不等式条件。
3.根据问题目标,构造关于决策变量的一个线性函数,即目标函数。
4.编程求解
eg:
clc,clear
prob=optimproblem('ObjectiveSense','max') %目标函数最大化的优化问题
c = [4;3]; b=[10;8;7];
a=[2,1;1,1;0,1];
x=optiimvar('x',2,'LowerBound',0); %决策变量
prob.Objective=c'*x; %目标函数
prob.Constraints.con=a*b<=b; %约束条件
[sol,fval,flag,out]=solve(prob) %fval返回最优值
sol.x %显示决策变量的值
[x,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
Aeq,beq是对应等式约束 Ax=b;lb和ub表示变量x的下界和上界;
x0是x的初始值; options是控制参数
注意linprog只能默认求最小值,如果要求最大值需要是F=-f,,最后使max=-fval
整数规划表示:
1.纯整数规划。决策变量都必须是整数的规划模型
2.混合整数规划,决策变量中只需一部分取整数
3.0-1规划,决策变量只能是0或者1的规划。
如:背包问题、指派问题。
题目参考p21
要点简记:
1.定义每一个城市为,定义一个变量
,表示是否要从
走到
。即如果是则
为1,否则为0。
2.总旅费可以表示为,如果i==j,则事先规定
为一个充分大的实数M,以防止走这条路。
3.约束条件:
(3)不允许有子回路存在:
为防止在遍历过程中,出现子回路,即无法放回出发点的情况,附加一个强制性约束:
特别规定,u1==0,1<=u[i]<=n-1,i=2,3,...n;
证明:
1.如果存在子回路,则至少有两个子回路。其中一个子回路不含起点,例如子回路4-5-6-4。则写出上面所述三个约束方程,得到0<=-3,这不可能,所以任何不含起点的子回路都不符合这个强制性约束。
2.对任何整体巡回路线,只要取合适值,都可以满足约束条件。
只需要规定一个充分大的数M,决策变量y(y取0或1)。
在原约束条件上加上(1-y)*M,和y*M,y的不同取值就可以让一个约束不存在。
intcon= (需要是整数的变量)
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
x=fmincon(fun,x0,A,B,Aeq,beq,lb,ub,nonlcon,options)
使用步骤:
1.编写目标函数文件以及非线性约束文件。 2.命令行窗口调用
function f=fun1(x);
f=x(1)^2+x(2)^2+8;
function[g,h]=fun2(x);
g=-x(1)^2+x(2); %不等式约束 <=0
or
g(n)=......
h=-x(1)-x(2)^2+2; %等式约束 =0
[x,fval]=fmincon('fun',rand(2,1),[],[],[],[],zero(2,1),[],'fun2')
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,optiuons)