非线性规划模型(NP)算法

       如果目标函数或约束条件中含非线性函数,这种规划即为非线性规划问题。没有通解,不同方法有自己特定的范围。

一、投资决策问题

由于这里没有说投资风险且每项投资都产生收益,因此将所有资金用于投资收益最大,无需考虑用多少钱,因此得目标函数为 投资收益比 。

编程实例

fun.m

% 目标函数:minf(x)
function f=fun(x);
f=sum(x.^2)+8;

fun2.m

function[g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
    x(1)+x(2)^2+x(3)^2-20]; % 非线性不等式约束(<=)
h=[-x(1)-x(2)^2+2
    x(2)+2*x(3)^2-3]; % 非线性等式约束(=0)

run.m

% nonlcon:非线性函数c(x),ceq(x)文件;
% options:优化参数,可不加
% exp: minf(x)=x1^2+x2^2+x3^2+8
% s.t.: x1^2-x2+x3^2>=0;
%       x1+x2^2+x3^2<=20;
%       -x1-x2^2+2=0;
%       x2+2x3^2=3;
%       x1,x2,x3>=0
[x,fval]=fmincon('fun',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')

 二次规划:目标函数为二次函数,约束条件为线性

可用之前最优化中学过的 拉格朗日法 好处多多!也可以matlab自带的quadprog函树

应用实例:供应与选址

建立模型

 1)

% 供应与选址问题:
% 1)使用临时料场时:
clear,clc 
a=[1.25 8.75 0.5 5.75 3 7.25];
b=[1.25 0.75 4.75 5 6.5 7.75];
d=[3 5 4 7 6 11];
x=[5 2];
y=[1 7];
e=[20 20];

for  i=1:6
   for j=1:2
       aa(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);
   end
end
CC=[aa(:,1); aa(:,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=[1 0 0 0 0 0 1 0 0 0 0 0 %从第一\二料场运到工地一的料
    0 1 0 0 0 0 0 1 0 0 0 0 
    0 0 1 0 0 0 0 0 1 0 0 0 
    0 0 0 1 0 0 0 0 0 1 0 0 
    0 0 0 0 1 0 0 0 0 0 1 0 
    0 0 0 0 0 1 0 0 0 0 0 1 ];
beq=[d(1);d(2);d(3);d(4);d(5);d(6)];
VLB=[0 0 0 0 0 0 0 0 0 0 0 0];VUB=[];
x0=[1 2 3 0 1 0 0 1 0 1 0 1];% x0可以不写
[xx,fval]=linprog(CC,A,B,Aeq,beq,VLB,VUB,x0)

2)

 liaoch.m

function f=liaoch(x)
a=[1.25 8.75 0.5 5.75 3 7.25];
b=[1.25 0.75 4.75 5 6.5 7.75];
d=[3 5 4 7 6 11];
e=[20 20];
f1=0;
for  i=1:6   
    s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2); % 料场位置变为未知数   
    f1=s(i)*x(i)+f1;
end
f2=0;
for  i=7:12   
    s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2);% 料场位置变为未知数   
    f2=s(i)*x(i)+f2;
end
f=f1+f2; % 非线性规划的目标函数

run.m

% 供应与选址问题:
% 2)改建两个新料场
clear,clc
% 初值不同结果不同
%x0=[3  5 0  7  0  1  0  0  4  0  6 10 5 1 2 7]';
%x0=[ 3.0000 5.0000 0.0707 7.0000  0 0.9293 0 0 3.9293  0 6.0000 10.0707 6.3875 4.3943 5.7511 7.1867]';
%x0=[ 3.0000 5.0000 0.3094 7.0000 0.0108 0.6798 0 0 3.6906 0 5.9892 10.3202 5.5369 4.9194 5.8291 7.2852]';
x0=[3 5 4 7 1 0 0 0 0 0 5 11 5.6348 4.8687 7.2479 7.7499]';
A=[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];%决策变量变为16个
B=[20;20];
Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
    0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
    0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
    0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0];
beq=[3 5 4 7 6 11]';
vlb=[zeros(12,1);-inf;-inf;-inf;-inf];%新建厂选址无下界
vub=[];
[x,fval,exitflag]=fmincon('liaoch',x0,A,B,Aeq,beq,vlb,vub)

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值