【C题成品论文2已出】24数学建模国赛C题第二套成品论文(附参考代码)免费分享
假设:每个地块每年种植一种农作物。
针对问题一
单目标优化问题,定义决策变量,定义目标函数、定义约束条件、数据预处理、使用整数规划,编程解决问题。
定义决策变量:
Xt,i:在第t年种植第i种作物的亩数
Y t,i:第t年第i种作物总产量从, Y t,i= Xt,I ×亩产量
Ktji:第t年在第j块地上种种植i种作物
Z t,i:在第t年销售的第i种作物的数量Z t,i= min(Y t,i,预期销售量)
Wti:超过预期销售量的部分,Wti:= max(0, Y t,i - 预期销售量)
目标函数:问题1 目标是最大化利润
其中、T的取值范围 [2024,2030],I的取值范围:[1,41]、P为售价、q为种植成本、b为浪费成本
目标函数:问题2 考虑滞销部分做降价处理
其中、T的取值范围 [2024,2030],I的取值范围:[1,41]、α为折扣率(取值0.5)、P为售价、q为种植成本、b为浪费成本
约束条件:
面积约束:
1.
每个地块(含大棚)的所有土 地三年内至少种植一次豆类作物
2.
每种作物在同一地块(含大棚)不连续重茬种植
3.
使用离散最优化中的整数规划求解:
在一些情况下,一个离散最优化问题可以简单地用列出所有可能情况的方法求解.对另一些问题,可以采用连续模型,然后用舍入的方法求出最接近的整数解:当连续的决策变量变为离散变量时非线性规化问题通常会难解得多.没有连续性后可行域会变得很复杂,通常用图或树结构来描述.对一些类型的问题已经开发出了有效的求解算法,对这些算法的改进是一个非常活跃的研究领域,但与连续的情形一样,迄今还没有求解离散最优化问题的普遍的有效方法.
针对问题一的问题,我们采用整数规划,整数规划是线性规划的离散情形。它除了是应用最广泛的离散最优化算法之外,与线性规划的相似性也使我们易于比较离散模型和连续模型、另一个优点是大多数线性规划序软件也可以解整数规划问题。
PuLP 是一个建模语言,它允许用户以类似于AMPL的方式描述线性规划问题。使用PuLP,你可以定义决策变量、目标函数、约束条件等,本题采用python的PuLP包中的CBC求解器来找到最优解。
【参考代码】
import pulp as pl
import pandas as pd
import numpy as np
df = pd.read_excel('附件1.xlsx')
#地块名称
dkmc=df['地块名称'].tolist()
# 种植地方、种植作物类型、年份
zw = df['作物名称'].tolist()
years=['2024','2025','2026','2027','2028','2029','2030']
seaborn=[1,2]
# 豆类
doulei=[1,2,3,4,5,17,18,19]
#读入数据
df1 = pd.read_excel('附件2.xlsx', sheet_name='Sheet1', header=0)
df2 = pd.read_excel('附件2.xlsx', sheet_name='Sheet2', header=0)
#农作物亩产量
acr=df2['亩产量/斤']
#农作物单价
danjia=df2['销售单价/(元/斤)']
#农作物种植成本
chengben=df2['种植成本/(元/亩)']
#种植面积
zzmj=df2['种植面积/亩']
mbxl=acr*zzmj
#第一小问
model_one =pl.LpProblem('pro_one',pl.LpMaximize)
#决策变量
x = pl.LpVariable.dicts('Area',(dkmc,zw,years),lowBound=0,cat='Integer')
#目标函数:最大化利润
if(acr*x[dkmc][zw][years][seaborn]<=mbxl):
max_profit1=pl.lpSum([
danjia*pl.lpSum(acr*x[dkmc][zw][years][seaborn])])
else:
max_profit1 = pl.lpSum([
danjia * pl.lpSum(acr * mbxl)])
model_one+=max_profit1
#约束
for i in dkmc:
for j in years:
for k in seaborn:
model_one+=pl.lpSum([x[i][crop][j][k]for crop in dkmc])<=dkmc[i]
for i in dkmc:
for j in years:
model_one+=pl.pSum([x[i][j][season] for i in doulei for season in seaborn])>=zzmj[i]/3
for i in dkmc:
for j in years[:-1]:
for k in seaborn:
for l in acr:
model_one += x[i][j][k][l]
x[i][j+1][k][l]==0
model_one.solve()
# 第二种情况
model_two = pl.LpProblem("Max_Profit2", lp.LpMaximize)
x=pl.LpVariable.dicts("Area",("plots","crops","years","seasons"), lowBound=0,cat='Integer')
if(acr*x[dkmc][zw][years][seaborn]<=mbxl):
max_profit1=pl.lpSum([
danjia*pl.lpSum(acr*x[dkmc][zw][years][seaborn])])
else:
max_profit1 = pl.lpSum([
danjia * pl.lpSum(acr * mbxl)])+0.5(danjia-mbxl)*pl.lpSum([ danjia * pl.lpSum(acr * mbxl)])
model_two+=max_profit1
#约束
for i in dkmc:
for j in years:
for k in seaborn:
model_one+=pl.lpSum([x[i][crop][j][k]for crop in dkmc])<=dkmc[i]
for i in dkmc:
for j in years:
model_one+=pl.pSum([x[i][j][season] for i in doulei for season in seaborn])>=zzmj[i]/3
for i in dkmc:
for j in years[:-1]:
for k in seaborn:
for l in acr:
model_one += x[i][j][k][l]
x[i][j+1][k][l]==0
model_two.solve()
print('输出结果',model_two.solve())
print('输出结果',model_two.solve())
针对问题二
优化目标:考虑风险,合理分配不同农作物在不同地块的种植面积,进行不确定性建模,使得收益最大化。
定义决策变量:
Ktji:第t年在第j块地上种种植i种作物
使用算法
目标函数:与问题一相似,不同点在于销售、亩产量、成本、价格现在是随机变量。
算法:
贝叶斯网络
贝叶斯网络可用有向无环图 G=(V, E)进行表 示,其中 V 是节点的集合,每个节点代表一个可观测变量或隐变量,E 是边的集合,每条边表示一个 有向关系,其联合概率分布可因子化为
式中:为G中v的父节点的集合
在态势评估中多采用因果式贝叶斯网络,用父节点表示原因,子节点表示结果。种植面积、亩产量、种植成本、销售单价、用父节点表示,预期销量为子节点,用节点间的有向边表示 其因果关系,节点间条件概率表示关系强度。
假设训练数据为,其分布为深度生成模型主要用来接近数据数据的联合分布,其中为模型参数,可参数化为一个DNN,通过最小化2个概率分布之间的统计散度,实现
基于深度贝叶斯网络学习的态势评估模型
贝叶斯网络的核心功能就是推理,即根据已知部分信息来推测未知变量的状态,推理通常分为两类:准确推理:通过数学严格计算得到精确的结果,近似推理,在计算复杂或数据量庞大时使用。针对问题二,采用近似推理进行建模。
计算流程:
1.对题给2023年数据附件1与附件2进行数据预处理与清洗,获得预期销量与影响因素,生成输入数据集。
2.基于专家经验法,设计贝叶斯网络;
3,将数据集输入贝叶斯网络模型,采用带有层次记忆模块的深度神经网络模型学习影响因素的概率,并进行近似推理,推理过程调用python语言的变分自编码器。两者共同完成模型的训练。
4,结合设定的评估指标将结果进行输出。
基于深度贝叶斯网络学习的态势评估模型如图:
基于深度神经网络的贝叶斯评估模型,能对不确定性进行良好建模。从图 1 可以看出,深度生成模型自顶向下学习联合概率分布,主要使用大量无标注数据,并进行基于变分自编码器的推理。同时,使用层次记忆模块存储深度神经网络提取的大量局部特征。
深度神经网络-贝叶斯网络模型原理
针对某个训练数据集,其数据x都由隐变量集合生成。其中最顶层隐变量为,依据输入的计算低级生成数据
:
然后采用线性组合策略从记忆模块中提取信息
其中,,是sigmoid函数,通过该函数控制,可以更好的调整神经元的权重和偏差。
将逐元素的多层感知机定义为组合函数,即:
模型推理原理
推理采用变分自编码器VAE,其结构如下图
.
自编码器VAE结构图
网络模型为
其中正则化项为局部重建误差,相对权重为参数,采用随机梯度下降算法进行优化。
数学建模计算
应用问题所给数据构建贝叶斯网络模型,采用提出的基于生成模型的深度贝叶斯网络对BN进行学习和推理其中子节点表示种植面积、亩产量、种植成本、销售单价,父节点表示预期产量。
贝叶斯条件概率表
p | P(p1=yes/P) | P(p1=no/P) | P(p2=yes/P) | P(p2=no/P) |
yes | 0.7 | 0.3 | 0.8 | 0.2 |
No | 0.3 | 0.7 | 0.2 | 0.8 |
模型评估
采用Deep M-VAEBN、基于随机梯度下降算法和基于粒子群的ITFS-BN方法,检验模型不确定性建模能力。。ITFS-BN 把主观判断或经验与实际数据结合起来,根据态势评估补充战场中发生的新信息,利用 ITFS-BN 公式修正先验概 率,从而改善概率估计的准确度。PSOSA-ITFS-BN方法中,采用 ITFS-BN 更新行为节点先验概率后,基于 Deep M-VAEBN,ITFS-BN 和 PSOSA ITFS-BN 的空袭计划、侦察子计划和攻击子计划的可信度如下表:
算法名称 | Deep M-VAEBN | ITFS-BN | PSOSA-ITFS-BN |
可信度 | 0.954 | 0.950 | 0.951 |
可以看出三种方法都能得出态势评估结果,且可信度相近,Deep M-VAEBN 识别的可信度略高。从条件概率的产生方法看,Deep M-VAEBN 方法中 BN 条件概率主要 由深度生成模型学习自动得到,而 ITFS-BN 和 PSOSA-ITFS-BN 方法中 BN 条件概率由专家直接设定。但专家直接设定条件概率无法表达全部不确 定性,且主观性强。Deep M-VAEBN 方法对多源异类数据进行处理和特征提取,再经由生成模型学习与表达各种不确定性,能够解决上述问题。PSOSA-ITFS-BN 虽然利用基于粒子群与模拟退火的混合算法对方法进行了排序和优化,但效果提高的不明显。随着自建数据集的扩充和增加数据标注量,Deep M-VAEBN 方法的优势将逐渐显现出来。