非线性规划问题求解(举例)

1.概述

非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。20世纪50年代初,库哈(H.W.Kuhn) 和托克 (A.W.Tucker) 提出了非线性规划的基本定理,为非线性规划奠定了理论基础。这一方法在工业、交通运输、经济管理和军事等方面有广泛的应用,特别是在“最优设计”方面,它提供了数学基础和计算方法,因此有重要的实用价值。

简单来说,若规划问题的目标函数或约束条件中包含非线性函数,则称为非线性规划。

2.模型

本文主要采用matlab进行非线性规划的求解,lingo的求解以后会专门出一个教程。

下面是Matlab中非线性规划的标准形式:

其中,大部分参数同线性规划;‘fun’为目标函数;VLB、VUB为边界约束;A、b、Aeq、beq为线性约束,其中A、b为不等式约束,Aeq、beq为等式约束;‘nonlcon’为非线性约束;x0是初始值,也就是迭代的起点;options是算法中相关的设置,一般可以先用默认的求解,然后根据matlab的提示再调整。

3.举例求解

        小龙虾因体型比其他淡水虾类大,肉也相对较多,及肉质鲜美之原因,而被制成多种料理,都受到了普遍的欢迎。《中国小龙虾产业发展报告(2021)》中指出,2021年我国小龙虾产业继续保持较快发展,养殖面积和养殖产量再创新高,据测算, 2021年我国小龙虾养殖总产量将达208.96万吨,小龙虾产业总产值达4110亿元,其中,小龙虾养殖业产值约710亿元。

        现在请运用数学知识来研究一下小龙虾养殖的相关问题。小龙虾在一个繁殖周期内,龙虾数量以斐波那契数列增长,1,2,3,5,8,13,21,34,55,89...这个数列的前后项之比越来越趋近于黄金分割0.618,换而言之,这个数量增长的速度几乎是以\tiny \left (\sqrt{5}+1\right )/2为底数的指数增长列。

        假设某种龙虾分四个年龄组,分别为一岁到四岁。各年龄组龙虾的平均重量分别为5.17、11.58、17.66、22.98(g),各年龄组龙虾的自然死亡率为0.79(/年),且龙虾为季节性繁殖,平均每只四岁虾的产卵量为\tiny 1.108\times 10^{5} (个),三岁虾的产卵量为这个数的一半,两岁虾和一岁虾不产卵,产卵和孵化期为每年的最后4个月,卵孵化并成活为一岁虾,其成活率(一岁虾条数与产卵总量 之比)为 。龙虾养殖场每年只在产卵孵化期前的8个月内进行捕捞作业.如果每年捕捞强度固定不变,这时单位时间捕捞量与各年龄组虾群条数成正比,比例系数称捕捞强度系数.通常只捕捞三岁虾和四岁虾,其两个捕捞强度系数之比为0.42:1。

现假设有一荒废的池塘中龙虾数量随时间变化如表1所示

表1  某荒废的池塘中龙虾数量随时间变化表

请你和你的团队尝试解决以下问题:

问题1为了满足龙虾养殖场的长期运营,需要实现每年开始捕捞时养殖场中各年龄虾的数量基本保持不变。请建立数学模型分析如何在此前提下得到最高的年收获量(捕获龙虾总重量)。

问题2若某龙虾养殖场计划养殖这种龙虾,要求5年后虾群的生产能力不能受到太大破坏。已知承包时各年龄组虾群的数量分别为:125、31.7、9.7、3.09(\tiny \times 10^{9} 只),如果采用相同的捕捞强度,该养殖场应采取怎样的策略才能使总收获量最高。

以问题1为例说明如何分析非线性规划以及利用MATLAB求解非线性规划问题

由题易知其为最优化问题,故须确立目标函数,约束条件进行优化求解。

目标函数:收获的虾的总重量最大

约束条件

第j+1年y+1岁虾的数量n(j+1)(y+1) =第j年y岁虾的数量njy *(1-0.79)(存活率)

(j=1,2……;y=1,2)

第j+1年4岁虾的数量n(j+1)4 =第j年3岁虾的数量nj3 *(1-0.79)(存活率)-第j年3岁虾的捕捞量bj3

(n=1,2……)

第j+1年1岁虾的数量n(j+1)1 =(第j年4岁虾的数量nj4 -第j年4岁虾的捕捞量b4)*4岁虾的产卵量 +(第j年3岁虾的数量nj3 -第j年3岁虾的捕捞量b3)*3岁虾的产卵量(四岁虾的一半)

虾的捕捞量和其数量有关。

(b3/n3)/(b4/n4)=0.42

各个年龄段的虾的数量基本保持不变(k=5%)

njy*(1-k)≤nj+1ynjy*(1+k)

(j+1年y岁虾的数量处于j年y岁虾的数量*百分比(1\tiny \pmk))范围内

捕捞量小于龙虾数量:b3<n13,b4<n14;

虾的数量为整数:njy(j=1,2;y=1,2,3,4),

捕捞量为整数:b3,b4

第一年各年龄虾的数量:1226,308,99,41;

第二年各年龄虾的数量:1273,293,100,39。

前后两年虾的数量波动在5%以内

捕获的3岁虾29只,4岁虾28只

收获29*17.66+28*22.98=1155.6克

代码实现

%非线性规划main.m
p=0.79;%死亡率
k=0.05;%与前一年相比,今年各个年龄段虾的数量的波动系数
%% 线性不等式约束
A=[1-k,0,0,0,-1,0,0,0,0,0;
      -1-k,0,0,0,1,0,0,0,0,0;
      0,1-k,0,0,0,-1,0,0,0,0;
      0,-1-k,0,0,0,1,0,0,0,0;
      0,0,1-k,0,0,0,-1,0,0,0;
      0,0,-1-k,0,0,0,1,0,0,0;
      0,0,0,1-k,0,0,0,-1,0,0;
      0,0,0,-1-k,0,0,0,1,0,0;
      0,0,-1,0,0,0,0,0,1,0;
      0,0,0,-1,0,0,0,0,0,1;];
b=[0;0;0;0;0;0;0;0;0;0];
%% 线性等式约束
Aeq=[1-p,0,0,0,0,-1,0,0,0,0;0,1-p,0,0,0,0,-1,0,0,0;0,0,1-p,0,0,0,0,-1,-1,0];
beq=[0;0;0];
lb=[0;0;0;0;0;0;0;0;0;0];
ub=[];
x0=[1000,1000,1000,1000,1000,1000,1000,1000,210,500];
%% 求解
[x,fval,exitflag] = fmincon('fmin',x0,A,b,Aeq,beq,lb,ub,'fcontr');
%% 目标函数fmin.m
function f = fmin(t)
b3=t(9);b4=t(10);
f=-(b3*17.66+b4*22.98);
end
%% 非线性fcontr.m
function [c d] = fcontr(t)
n13=t(3);n14=t(4);n21=t(5);%各类虾的数量
b3=t(9);b4=t(10);%捕捞量
l4 = 1.108*10^5; %产卵量
l3 = 0.5*l4;
p34=1.21*10^11/(1.21*10^11+(n13-b3)*l3+(n14-b4)*l4);%卵的成活率
d1 = ((n13-b3-8/12*n13*0.79)*l3+(n14-b4-8/12*n14*0.79)*l4)*p34-n21; %假设平均每月虾的死亡数量为每年的死亡数量/12,到了9月份开始产卵
d2 = b3/b4-n13/n14*0.42;
d=[d1;d2];%非线性等式约束
c=[];
end

  • 16
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值