# 数学建模_养鱼问题__线性规划_动态规划 **Repository Path**: Small_wind/fish_math_model ## Basic Information - **Project Name**: 数学建模_养鱼问题__线性规划_动态规划 - **Description**: 数学建模基础,养鱼问题 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-05-16 - **Last Updated**: 2023-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数学建模之养鱼模型 #### 问题定义 ``` 某地有一鱼塘,其水面面积约为100×100平方米,某人承包了三年的使用权,并用来养殖某种鱼,与该种鱼相关的假设如下: (1)鱼的存活空间为每平方米可养1kg的鱼。 (2)每公斤鱼需要的饲料为0.05公斤,市场上饲料价的价格为0.5元/公斤。 (3)鱼苗的价格忽略不计,每公斤鱼苗大约有500条。 (4)鱼可四季生长,每天的生长重量是与鱼的自身重量成正比,360天就能成长为成鱼,成鱼的重量为2公斤。 (5)此种鱼的市场售价为: 每条鱼重为0.2到0.75公斤的时候,售价为12元/公斤,每条鱼重0.75到1.5公斤的时候,售价为16元/公斤,每条鱼重量1.5至2公斤时,售价为20元/公斤,每公斤重量小于0.2公斤的鱼不能上市,规定其价格为零。 (6)池内只能投放鱼苗。 问题:若池内放进的鱼繁殖与死亡均可忽略,请设计能获得较大利润的三年养殖方案。 ``` #### 解决思路 方案1、2:线性规划 方案3:动态规划 ``` 1. 获取单条鱼的重量 由于每公斤鱼苗大约有500条,因此一条鱼的重量是1/500kg 2. 获取增长系数q值 计算方法: 由于一条鱼长到成鱼2kg需要360天,且每天的生长重量是与鱼的自身重量成正比 因此根据增长方程an = an-1 + q * an-1 且 a1 = 1/500,求得 q = 1000^(1/360) - 1 = 0.01937348593887278 3. 解决思路 方案一:一次性投放5000条鱼苗,并将其一次性养殖到成鱼2kg(需要360天),这样的投放过程一共3次(一共360 * 3天) 由于池塘总容量是10000kg,因此考虑一次性养满鱼塘,一共是5000条鱼*3年 三年收益E: 因为有3年,5000条2kg的鱼,每kg20元,因此收益E = 20*2*5000*3 = 600000元 第d天时池塘鱼的重量w: 设w为第d天时候池塘鱼的重量,则w = 1/500 * pow(q+1, day) 三年的费用C: 由于每公斤鱼需要的饲料为0.05公斤,市场上饲料价的价格为0.5元/公斤 第360天的时候,饲料费用为c = 5000 * (∑day从1到360) 1/500 * pow(q+1, day)*0.05*0.5 因此三年的总费用是C = 3 * c = 38673.99元 # 38673.99 三年的利润P: P = E - C = 600000 - 38673.99 = 561326.01元 方案二:一次性投放num条鱼苗,并将其一次性养殖到one_fish_weight公斤(一条鱼,one_fish_weight大于1/500,小于等于2),这样投放工程一共iters次 并构建one_fish_weight - P函数,根据函数图像,确定最终最优的one_fish_weight是多少,最优的one_fish_weight能够是的P最大 思路于方案一进行优化和改进,最终得到one_fish_weight为1.52公斤时,利润最优 构建 one_fish_weight - P方程: 1.计算鱼长到one_fish_weight重时需要的天数weight_time: 由于an = a1*(q+1)^n,an表示第n天时,一条鱼的重量,a1表示鱼苗的重量,q表示增长系数 因此求得weight_time = n = 360*log(500 * one_fish_weight,1000) ,其中1000为底数 2.计算iters,该值取决于3年里,鱼苗长到one_fish_weight的天数,也就是iters = 3*365 // weight_time, 其中//表示整除 3.计算鱼塘能容纳多少条one_fish_weight重量的鱼,nums_fish = 10000//one_fish_weight 4.三年收益E: 因为有iters批,nums_fish条 one_fish_weight kg的鱼,每kg y元,因此收益E = y * one_fish_weight * nums_fish * iters 5.第d天时池塘鱼的总重量w: w = 1/500 * pow(q+1, day) ,同方案一 6.三年的费用C: 第weight_time天的时候,饲料费用为c = one_fish_wight * (∑day从1到weight_time) 1/500 * pow(q+1, day)*0.05*0.5 因此三年的总费用是C = iters * c 元 7.三年的收益P = E - C 构建one_fish_weight - P方程,通过求得最大P至可以发现,one_fish_weight取1.92时P最高,同时有 总消耗 总收益 总利润 561971.61 方案三:动态规划养鱼 放方案一和二中可以看到,两种方案的 池塘容纳重量-时间关系图 ,都没有很好的利用池塘的空间,为了充分利用池塘的空间,同时不考虑鱼的死亡问题,建立动态规划模型 1~360天: 动态规划养鱼的思路,可以考虑每一天都投放固定数量 s_num 的鱼苗,同时使得在第360天时,池塘中的鱼苗重量达到饱和(接近10000kg) 从361~k天: 继续投放固定数量 s_num 的鱼苗,同时,从该天开始,就开始每天收益 20 * s_num 元 从k~1095天: 从后向前推理状态转移方程,则在最后一天的时候,要卖出尽量多的鱼苗,同时最后一天的鱼塘容纳鱼的重量要接近于10000kg 3年=1095天,因此可以考虑在k = 1095-360+1天开始,投放5000条鱼苗,同时,在第k天时,不再继续每天 1.构建状态转移方程,假设dp[i],i表示第i天,dp表示该天的重量 因此:dp[i] = dp[i-1] + s_num * 1/500 * 1000*(i/360) , 1<=i<=360,i为整数 dp[i] = dp[i-1] , 361<=i<=k-1,i为整数 dp[i] = (dp[k]-2*s_num)*pow(1000,1/360) + 5000*1/500*pow(1000,(i-k)/360) , k<=i<=1095,i为整数 2.三年的收益P:P = (s_num * (365*3-361) * 20 + 5000 * 20)*2 //2表示2kg 3.三年的费用C:C = ∑(i从1到1095)dp[i] * f(dp[i]), f(dp[i])表示第i天花费的饲料费用 4.三年的利润E:E = P - C 动态规划的收益: 2989200元 动态规划的消耗: 196410.00307279264元 动态规划的利润: 2792789.9969272073元 ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Requesthttps://gitee.com/gitee-stars/)