onLinear Programming and Monte Carlo Simulation
立即下载
资源介绍:
数学建模
import pandas as pd
import numpy as np
import random
import re
# 读取作物耕地信息
filename = '附件1-2.xlsx'
CLD = pd.read_excel(filename)
# 初始化列表,用于存储处理后的数据
LTA, SA, CUD, CNA, CTA = [], [], [], [], []
# 遍历作物耕地数据,提取并处理地块类型和季节信息
for i in range(len(CLD)):
asdaw = str(CLD.iloc[i]['种植耕地']).replace('↵', '').strip()
if asdaw:
tokens = re.findall(r'(\S+)\s+(\S+)', asdaw) # 使用正则表达式提取地块类型和季节
for LT, season in tokens:
seasons = season.split()
for dwa in seasons:
CUD.append(CLD.iloc[i]['作物编号'])
CNA.append(CLD.iloc[i]['作物名称'])
CTA.append(CLD.iloc[i]['作物类型'])
LTA.append(LT)
SA.append(dwa)
# 将处理后的数据转换为DataFrame
adwddaw = pd.DataFrame({
'作物编号': CUD,
'作物名称': CNA,
'作物类型': CTA,
'地块类型': LTA,
'季节': SA
})
# 将处理后的数据保存到Excel文件
adwddaw.to_excel('分解后的作物地块和季节信息.xlsx', index=False)
# 定义函数,根据地块信息、作物数据等计算最佳作物
def find_best_crop(SC, CD, PA, ESF, MPA):
BR = -float('inf')
BCI = 0
for CI in range(len(SC)):
CN = SC.iloc[CI]['作物名称']
CDF = CD[CD['作物名称'] == CN]
if notCDF.empty:
dawsd =CDF.iloc[0]['亩产量/斤']
asdaw =CDF.iloc[0]['销售单价/(元/斤)']
cost =CDF.iloc[0]['种植成本/(元/亩)']
adasdaw = dawsd * PA
sdwer = ESF * adasdaw
wdwtrt = max(0, adasdaw - sdwer)
daswgffa = min(adasdaw, sdwer)
revenue = daswgffa * asdaw +wdwtrt * (asdaw * 0.5) - cost * PA
if revenue > BR and PA >= MPA:
BR = revenue
BCI = CD.index[CD['作物名称'] == CN][0]
return BCI, BR
# 读取地块信息
LF = '附件1-1.xlsx'
LD = pd.read_excel(LF)
# 定义地块类型
LTS= ['普通大棚', '智慧大棚', '平旱地', '梯田', '山坡地', '水浇地']
PI = pd.DataFrame()
# 提取每种地块类型的信息
for LT in LTS:
names = LD[LD['地块类型'] == LT]['地块名称']
areas = LD[LD['地块类型'] == LT]['地块面积']
temp_df = pd.DataFrame({'种植地块': names, '地块类型': LT, '地块面积': areas})
PI = pd.concat([PI, temp_df])
# 导入2023年种植数据
dxvacwf = '附件2-1导入.xlsx'
xcxassdaw = pd.read_excel(dxvacwf)
# 将地块信息与种植计划数据合并
xcxassdaw = pd.merge(xcxassdaw, PI, on='种植地块', how='left')
# 读取清洗后的作物数据
crop_filename = '附件2-2清洗后数据.xlsx'
CD = pd.read_excel(crop_filename)
# 导入和处理作物-土地适用数据
filename = '附件1-2.xlsx'
CLD = pd.read_excel(filename)
# 分解作物适用地块和季节
LTA, SA, CUD, CNA, CTA = [], [], [], [], []
for i in range(len(CLD)):
asdaw = str(CLD.iloc[i]['种植耕地']).replace('↵', '').strip()
if asdaw:
tokens = re.findall(r'(\S+)\s+(\S+)', asdaw)
for LT, season in tokens:
seasons = season.split()
for dwa in seasons:
CUD.append(CLD.iloc[i]['作物编号'])
CNA.append(CLD.iloc[i]['作物名称'])
CTA.append(CLD.iloc[i]['作物类型'])
LTA.append(LT)
SA.append(dwa)
adwddaw = pd.DataFrame({
'作物编号': CUD,
'作物名称': CNA,
'作物类型': CTA,
'地块类型': LTA,
'季节': SA
})
# 导出结果
adwddaw.to_excel('分解后的作物地块和季节信息.xlsx', index=False)
# 豆科植物列表
legume_crops = ['黄豆', '豇豆', '芸豆', '红豆', '黑豆', '绿豆', '爬豆', '刀豆']
# 谷物作物列表
xadss = ['小麦', '玉米']
# 蔬菜作物列表
daw = ['白菜', '生菜', '菠菜', '番茄']
# 真菌类作物列表
fungi_crops = ['蘑菇', '羊肚菌']
# 根据作物名称和年份调整销售、产量、成本和价格
def adjust_parameters(CN, year, swdwr, sdwdwe, wewe, xdwasdw):
# 调整预期销售量
if CN in xadss:
sales_growth_rate = random.uniform(0.05, 0.10) # 小麦和玉米的增长率 5%~10%
sales = swdwr * (1 + sales_growth_rate) ** (year - 2023)
else:
sales_change_rate = random.uniform(-0.05, 0.05) # 其他作物 ±5% 的变化
sales = swdwr * (1 + sales_change_rate)
# 调整亩产量(所有作物±10%波动)
yield_change_rate = random.uniform(-0.10, 0.10)
dawsd = sdwdwe * (1 + yield_change_rate)
# 调整种植成本(每年增长5%)
cost = wewe * (1 + 0.05) ** (year - 2023)
# 调整销售价格
if CN in xadss:
price = xdwasdw # 粮食类价格稳定
elif CN in daw:
price = xdwasdw * (1 + 0.05) ** (year - 2023) # 蔬菜类每年增长5%
elif CN == '羊肚菌':
price = xdwasdw * (1 - 0.05) ** (year - 2023) # 羊肚菌每年下降5%
elif CN in sd:
price = xdwasdw * random.uniform(0.95, 0.99) # 其他食用菌每年下降1%~5%
else:
price = xdwasdw # 其他作物价格稳定
return sales, dawsd, cost, price
# 找到最适合种植的作物
def find_best_crop(SC, CD, PA, year, ESF, MPA):
BR = -float('inf')
BCI = 0
# 遍历每个作物,计算收益
for CI in range(len(SC)):
CN = SC.iloc[CI]['作物名称']
CDF = CD[CD['作物名称'] == CN]
if notCDF.empty:
# 获取基础数据
swdwr =CDF.iloc[0]['亩产量/斤']
sdwdwe =CDF.iloc[0]['亩产量/斤']
wewe =CDF.iloc[0]['种植成本/(元/亩)']
xdwasdw =CDF.iloc[0]['销售单价/(元/斤)']
# 调整参数
sales, dawsd, cost, price = adjust_parameters(CN, year, swdwr, sdwdwe, wewe,xdwasdw)
# 计算总产量和预期销售量
adasdaw = dawsd * PA
sdwer = ESF * adasdaw
# 计算超出部分的产量
wdwtrt = max(0, adasdaw - sdwer)
daswgffa = min(adasdaw, sdwer)
# 收益 = 正常销售的部分 + 降价后的超出部分
revenue = daswgffa * price +wdwtrt * (price * 0.5) - cost * PA
# 确保逻辑条件是标量
if revenue > BR and PA >= MPA:
BR = revenue
BCI = CD.index[CD['作物名称'] == CN][0]
return BCI, BR
# 定义年份列表
years = list(range(2024, 2031))
tyt = len(years) # 计算年份数量
# 从 PI DataFrame 中获取地块名称和地块面积
yfgr = PI['种植地块'].values
PAs = PI['地块面积'].values
terwe = len(yfgr) # 计算地块数量
# 假设 CD DataFrame 包含所有作物的信息,计算作物种类数量
tuyu= len(CD)
# 初始化参数
ESF = 0.8
MPA = 0.1
awerwr = np.empty((terwe, tyt), dtype=object) # 记录每个地块每年种植的作物
hfgf = np.zeros(terwe) # 记录每个地块最后一次种植豆类的年份
# 初始化用于存储每年种植方案的列表
yearly_plans = []
# 遍历每个年份
for year_idx in range(tyt):
print(f"正在处理年份:{years[year_idx]}") # 打印当前处理的年份
# 初始化当前年份的第一季和第二季种植方案矩阵
adw1 = np.zeros((terwe, num_crops))
adwe1 = np.zeros((terwe, num_crops))
# 遍历每个地块
for qwedqw2 in range(terwe):
plot_name = yfgr[qwedqw2] # 地块名称
PA = PAs[qwedqw2] # 地块面积
# 根据地块类型筛选适用的作物
wedw = adwddaw[adwddaw['地块类型'] == PI.iloc[qwedqw2]['地块类型']]
# 避免�