目录
方法简介
概述
在所有的变量表达式中,至少有一个为非线性关系式。
特点
(1)形式上与线性规划相似,都具有决策变量、目标函数、约束条件。
(2)在数学上,非线性规划没有一种通用解法去求严格的数值解。
求解方法
简单例题一
某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:km) 及水泥日用量d(单位:t)由下表给出。目前有两个临时料场位于A(5,1),B(2,7)。 日储量各有20t。假设从料场到工地之间均有直线道路相连。
(1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的 吨千米数最小?
(2)为了进一步减少吨千米数,打算舍弃这两个临时料场,改建两个新的,日储量各为 20t。问应建在何处,节省的吨千米数为多大?
模型假设
料场运输工地的路径为两点间直线
思路分析
约束条件
(1)从料场运往某个工地的运输量 = 该工地的水泥日用量
(2)每个料场的运输总量 该料场的日储量
在问题一中两料场与各工地的坐标为定值,运送的距离为定值,决策变量只有运送的吨数,该问题为线性规划
在问题二中,要建立新站料场,运送的距离不确定,根据两点间距离公式可知,该问题属于非线性规划
代码实现
clc,clear;
% 六个工地的坐标
a=[1.25 8.75 0.5 5.75 3 7.25];
b=[1.25 0.75 4.75 5 6.5 7.75];
% 两个料厂的坐标
x=[5 2];
y=[1 7];
% 计算目标函数系数,即6工地与两个料场的距离,总共12个值
for i=1:6 % 对于6个工地
for j=1:2 % 接收两个料场的供用
l(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2); % 距离计算
end
end
% 6个工地水泥日用量
d=[3 5 4 7 6 11];
%第一问
% 目标函数系数向量,总共12个值
f = [l(:,1);l(:,2)];
% 料场的运输量小于等于日储量
A = [1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 1];% 两个料厂各自运出的水泥量
b = [20;20];% 两个临时料场日储量
% 各工地收到的水泥量等于日用量
Aeq = [eye(6),eye(6)];% 各工地各自收到的水泥量
beq=[d(1);d(2);d(3);d(4);d(5);d(6)];% 各工地各自的水泥日用量
lb=zeros(12,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb)
%第二问
% 约束条件与第一问一致,但决策变量多了两对坐标值
A2 = [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0];
B2 = [20;20];
Aeq2 = [eye(6),eye(6),zeros(6,4)];
beq2=[3;5;4;7;6;11];
lb2=[zeros(12,1);-inf;-inf;-inf;-inf];
x0=[3;5;0;7;0;1;0;0;4;0;6;10;5;1;2;7];
[x2,fval2]=fmincon(@obj_f,x0,A2,B2,Aeq2,beq2,lb2)
% 非线性约束
function ff = obj_f(x)
% 6个工地坐标
a1 = [1.25 8.75 0.5 5.75 3 7.25];
b1 = [1.25 0.75 4.75 5 6.5 7.75];
f1=0;
% x(13)是第一个新料场的横坐标,x(14)是其纵坐标;
% x(15)是第二个新料场的横坐标,x(16)是其纵坐标;
for i=1:6
s(i)=sqrt((x(13)-a1(i))^2+(x(14)-b1(i))^2); % 第一个料场到各工地的距离
f1=s(i)*x(i)+f1; % 第一个料场给各工地的吨千米数的总和
end
f2=0;
for i=7:12
s(i)=sqrt((x(15)-a1(i-6))^2+(x(16)-b1(i-6))^2); % 第二个料场到各工地的距离
f2=s(i)*x(i)+f2; % 第二个料场给各工地的吨千米数总和
end
% 总运输量(吨千米数)
ff=f1+f2;
end
找到最优解
x = 12×1 3 5 0 7 0 1 0 0 4 0
fval = 136.2275
可能存在局部最小值。满足约束。 fmincon 已停止,因为当前步长小于 步长容差值并且在约束容差值范围内满足约束。 <停止条件详细信息>
x2 = 16×1 2.9410 4.8405 3.8779 6.9431 1.3033 0.0221 0.0590 0.1595 0.1221 0.0569
fval2 = 90.4920
简单例题二
代码实现
clc,clear;
% 定义非线性的目标函数
function f=f1(x)
% min -f(x)=-x(1)*x(2)*x(3)
f=-x(1)*x(2)*x(3);
end
% 给x1、x2、x3赋初始值
x0=[0,0,0];
% 线性约束条件
A=[-1,1,-1];
b=[0];
Aeq=[1,-1,0];
beq=[10];
lb=[10,-Inf,-Inf];
ub=[20,+Inf,+Inf];
%非线性约束条件
function [c,ceq]=nonlfun1(x)
c=[x(1)+x(2)^2+x(3)^3-20;x(1)*x(2)-x(3)-1];
ceq=[-x(1)-x(2)^2+2];
end
[x,fval]=fmincon(@f1,x0,A,b,Aeq,beq,lb,ub,@nonlfun1);
x,fval=-fval
x = 1×3 10.0000 -0.5130 -7.0371
fval = 36.1033