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

本文探讨了非线性规划问题在投资决策中的应用,通过编程实例展示了如何解决包含非线性函数的目标函数和约束条件的优化问题。此外,还介绍了二次规划及其在供应与选址问题中的解决方案,利用线性和非线性规划工具进行求解。
摘要由CSDN通过智能技术生成

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

一、投资决策问题

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

编程实例

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值