前面的几节基本都围绕着线性规划和可转化为线性规划的问题来介绍,这一节开始我们将介绍非线性规划
1.非线性规划
1.1.实例和定义
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一般算法,各个方法都有自己特定的适用范围。
下面通过实例归纳出非线性规划数学模型的一般形式,介绍有关非线性规划的基本概念。
例1 (投资决策问题)某企业有个项目可供选择,并且至少要对其中一个项目投资。已知该公司有总资金元,投资于第个项目需花费资金元,并预计可收益元。试确定最佳投资方案。
解:设投资决策变量为:
则投资总额为,投资总收益为,考虑到限制条件:至少要对一个项目投资,并
且总的投资金额不能超过总资金,所以有限制条件如下:
因为只能取0或1,所以有非线性限制条件:
本个问题对于目标函数的确定我们可以这样考虑:投资决策问题的目标是让成本最小的同时利润最大,所以我们极大化总收益与总投资之比。
所以目标函数为:
限制条件为:
s. t.
这就是上面这个例题的完整模型,上面这个例题中,目标函数和限制条件中都有非线性函数,当目标函数和限制条件中至少有一个非线性时,这类问题称为非线性规划问题,可概括为一般形式。
以上模型简称为(NP)模型,其中称为模型的决策变量,称为目标函数,和称为约束函数。另外,称为等式约束,称为不等式约束。
1.2.线性规划和非线性规划的区别
如果线性规划的最优解存在,其最优解只能在其可行域的边界上达到(特别是可行域的顶点上达到);而非线性规划的最优解(如果最优解存在)则可能在其可行域的任意一点达到。
1.3实例:飞行管理问题
在约10000m高空的某边长160km的正方形区域内,常有若干架飞机作水平飞行。区域内每架飞机的位置和速度向量均又计算机记录其数据,以便进行飞行管理。当一家欲进入该区域的飞机到达区域边缘时,记录其数据后,要立即计算并判断是否会与区域内的飞机相撞。如果会相撞,则应计算如何调整各架(包括新进入的)飞机飞行的方向角,为避免碰撞。先假定条件如下:
1.不碰撞的标准位任意两架飞机的距离大于8km;
2.飞机飞行方向角调整的幅度不应超过30度
3.所有飞机飞行速度均为每小时800km
4.进入该区域的飞机在到达区域边缘时,与区域内飞机的距离应在60km以上
5.最多考虑六架飞机
6.不必考虑飞机离开此区域后的情况
请你对这个避免碰撞的飞行管理问题建立数学模型,列出计算步骤,对以下数据进行计算(方向角误差不超过 0.01 度),要求飞机飞行方向角调整的幅度尽量小。
设该区域 4 个顶点的座标为(0,0),(160,0),(160,160),(0,160)。
记录数据见下表。
飞机编号 | 横坐标x | 纵坐标y | 方向角(度) |
---|---|---|---|
1 | 150 | 140 | 243 |
2 | 85 | 85 | 236 |
3 | 150 | 155 | 220.5 |
4 | 145 | 50 | 159 |
5 | 130 | 150 | 230 |
新进入 | 0 | 0 | 52 |
注:方向角指飞行方向与轴正向的夹角。
为方便之后的讨论,我们引进如下记号。
为飞行管理区域的边长。
为飞行管理区域,取直角坐标系使其为
为飞机飞行速度,
为第架飞机的初始位置。
为第架飞机在时刻的位置
为第架飞机的原飞行方向角,即飞行方向与轴夹角:
为第架飞机的方向角调整,
为第架飞机调整后的飞行航向角
1.3.1.模型构建过程
根据相对运动的观点在考察两架飞机和的飞行时,可以将飞机视为不动而飞机以相对速度
相对于飞机运动,对上式进行和差化积得:
不妨设,此时相对飞行方向角为
由于两架飞机的初始距离是:
只要相对飞行方向角满足:
时,两飞机就不可能相撞。
假设为调整前架飞机相对于第架飞机的相对速度(矢量)与这两架飞机连线(从指向的矢量)的夹角(以连线矢量为基准,逆时针方向为正,顺时针方向为负)。得两架飞机不碰撞的条件为:
其中:
(注意表达式中的表示虚数单位)这里我们利用复数的幅角,可以很方便地计算角度
本问题中的优化目标函数可以有不同的形式:如使所有飞机的最大调整量最小;所有飞机的调整量绝对值之和最小等。这里以所有飞机的调整量绝对值之和最小为目标函数,可以得到如下的数学规划模型:
利用matlab程序计算和:
clc,clear
x0=[150 85 150 145 130 0];
y0=[140 85 155 50 150 0];
q=[243 236 220.5 159 230 52];
xy0=[x0; y0];
d0=dist(xy0); %求矩阵各个列向量之间的距离
d0(find(d0==0))=inf;
a0=asind(8./d0) %以度为单位的反函数
xy1=x0+i*y0
xy2=exp(i*q*pi/180)
for m=1:6
for n=1:6
if n~=m
b0(m,n)=angle((xy2(n)-xy2(m))/(xy1(m)-xy1(n)));
end
end
end
b0=b0*180/pi;
dlmwrite('txt1.txt',a0,'delimiter', '\t','newline','PC');
fid=fopen('txt1.txt','a');
fwrite(fid,'~','char'); %往纯文本文件中写 LINGO 数据的分割符
dlmwrite('txt1.txt',b0,'delimiter', '\t','newline','PC','-append','roffset', 1)
matlab会输出一个txt文件,将这个txt文件输入Lingo软件。
model:
sets:
plane/1..6/:delta;
link(plane,plane):alpha,beta;
endsets
data:
alpha=@file('txt1.txt'); !需要在alpha的数据后面加上分隔符"~";
beta=@file('txt1.txt');
enddata
min=@sum(plane:@abs(delta));
@for(plane:@bnd(-30,delta,30));
@for(link(i,j)|i#ne#j:@abs(beta(i,j)+0.5*delta(i)+0.5*delta(j))>a
lpha(i,j));
end
求解的最优解,其他调整角度为0.