当前位置: 首页 > article >正文

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。
注:过程更新了很多文件,所有这里贴上的有些内容不是最新的(而是草稿)。
注:我们队伍并没有获奖,文章内容仅供一乐。

从这次比赛,给出以下赛前建议

  1. 准备代码,今年比赛的时候使用DeepSeek的人数一定不少,到时候画图、数据处理等的代码都要很久才能生成。
  2. 准备 Gurobi 求解器
  3. 充足的睡眠和一些吃的,我深熬了一夜,通宵一夜。这里需要感谢数理学院免费提供的方便面、王老吉、咖啡、西瓜、学习场地等。尽显人文关怀(这里踩一下自己的学院)
  4. 了解多一点,什么适用于哪个问题,具体怎么用可以等比赛的时候找参考资料(不然你连参考资料都不知道搜)
  5. 寻找队友,建议配置是至少两人解题,两人能写代码,一人能使用数据处理的软件(减轻代码压力),三个人都会规范地撰写公式,三个人都了解Latex,一个人熟悉Latex或文档排版和专业术语(至于最后使用什么来写论文?如果有指导老师,需要考虑他的意见)。当然也有人能独立解决。

优化、线性规划问题我稍微能做一些,从暑期的练习来看,这种题的第一题和A题是我稍微能够上手的。

[以上是赛前]


[以下是赛中]

计划是第一天(那天下午)大家每道题都试一下,最后选一道题。
事实是我们花了近两天的时间边思考边选题,我先是看了A,感觉可做,然后C的第二题我做不了,和队友讨论后决定先试试C,而第一题到次日凌晨才被我解出。(不记得了,几个比赛混乱了。)。期间看第二题和第三题没有思路,我还是偶尔会提起A题,让他们试试。直到指导老师过来,说我们C已经做了这么久,来不及做A。我才放弃A的思考,但是从第二题开始,我给到的解法我自己都觉得不靠谱,便转战后方,前线交给两个数学好的。

C 题目

这是我们最后准备放到论文里的(当然没放进去)解题步骤:
在这里插入图片描述

有一些人会在网络上公开他们的题解和思路等以吸引大家购买,我倒是不反对,建议各位看看他们的思路,有些即使是错的,还是有时候会让你“灵光一闪”,额外的,需要小心被误导。

第一题

先检查题目给的数据,做一下预处理等等,然后画几个23年的图
在这里插入图片描述

以及其他分析的图,这就看能想到多少

接下来才是真开始解题,我们可以整合题目信息得到如下约束

四张表,一张表记录“这个地块是否种植这个作物”,一张表记录“这个地块种植这个作物的面积”,一张表记录“这个地块是否种植过土豆”,一张表记录“这个地块可以种植二季度植物的面积”(横向)1. 这个地块上每个季度的作物种植面积不能比这块地的面积大2. 如果在这块地上种该作物,该作物的种植面积不得小于地块的25%(或者0.1)3. 这个地块一部分中单季作物,一部分种植双季作物(纵向)4. 该作物的年产量要大于等于23年的年产量  -- 只有粮食5. [‘平旱地’,’梯田’,’山坡’]只能种植['黄豆', '黑豆', '红豆', '绿豆', '爬豆', '小麦', '玉米', '谷子', '高粱', '黍子', '荞麦', '南瓜', '红薯', '莜麦', '大麦']  
(只有一季,单独考虑)6. 每三年每个地块至少需要种植一次['黄豆', '黑豆', '红豆', '绿豆', '爬豆']7. [‘水浇地’]《第一季》只能种植['水稻', '豇豆', '刀豆', '芸豆', '土豆', '西红柿', '茄子', '菠菜 ', '青椒', '菜花', '包菜', '油麦菜', '小青菜', '黄瓜', '生菜 ', '辣椒', '空心菜', '黄心菜', '芹菜']8. [‘水浇地’]种植双季度的面积的蔬菜种植面积9. [‘水浇地’]《第二季》只能种植['大白菜', '白萝卜', '红萝卜'],占双季的全部面积10. 每三年每个地块至少需要种植一次['豇豆', '刀豆', '芸豆']-- 只有蔬菜11. [‘普通大棚’]《第一季》只能种植[ '豇豆', '刀豆', '芸豆', '土豆', '西红柿', '茄子', '菠菜 ', '青椒', '菜花', '包菜', '油麦菜', '小青菜', '黄瓜', '生菜 ', '辣椒', '空心菜', '黄心菜', '芹菜']12. [‘普通大棚’]《第二季》只能种植['榆黄菇', '香菇', '白灵菇', '羊肚菌']13. 每三年每个地块至少需要种植一次['豇豆', '刀豆', '芸豆']14. [‘智慧大棚’]只能种[ '豇豆', '刀豆', '芸豆', '土豆', '西红柿', '茄子', '菠菜 ', '青椒', '菜花', '包菜', '油麦菜', '小青菜', '黄瓜', '生菜 ', '辣椒', '空心菜', '黄心菜', '芹菜']15. [‘智慧大棚’]两季度种植的作物不能相同16. 每三年每个地块至少需要种植一次['豇豆', '刀豆', '芸豆']

图示如下(CSDN有大小限制,所以图不够高清)
在这里插入图片描述

可以看到这是一个线性规划求最优解
需要三部分:目标函数,约束条件,决策变量。反复验证修正,得到:
在这里插入图片描述

我们可以编写代码使用Gurobi求解(建议各位在比赛前先准备好,申请许可需要时间)

#!env mathmodule
# -*- coding:utf-8 -*-
# flake8: noqa W293
"""
Name: question1.4.1_gurobi_1.5.py
Author: Kai (海***队)
Time: 2024-09-08 13:37
Describe: 
"""
import pandas as pd
import gurobipy as gp
from gurobipy import quicksum
from itertools import chain
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows# 从CSV文件中读取数据
df = pd.read_csv(r'D:\Studio\Project\2024GJB\求解\数据预处理\crop_info_table.csv')# 初始化三个空字典
unit_product_dict = {}
unit_cost_dict = {}
price_jin_dict = {}# 遍历DataFrame,构建字典
for index, row in df.iterrows():land = row['land']crop = row['crop']# 初始化 land 键的子字典if land not in unit_product_dict:unit_product_dict[land] = {}unit_cost_dict[land] = {}price_jin_dict[land] = {}# 填充字典unit_product_dict[land][crop] = float(row['unit_product'])unit_cost_dict[land][crop] = float(row['unit_cost'])price_jin_dict[land][crop] = float(row['price_jin'])land_list = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E13', 'E14', 'E15', 'E16', 'F1', 'F2', 'F3', 'F4', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E13', 'E14', 'E15', 'E16', 'F1', 'F2', 'F3', 'F4']
land_size_list = [80.0, 55.0, 35.0, 72.0, 68.0, 55.0, 60.0, 46.0, 40.0, 28.0, 25.0, 86.0, 55.0, 44.0, 50.0, 25.0, 60.0, 45.0, 35.0, 20.0, 15.0, 13.0, 15.0, 18.0, 27.0, 20.0, 15.0, 10.0, 14.0, 6.0, 10.0, 12.0, 22.0, 20.0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 15.0, 10.0, 14.0, 6.0, 10.0, 12.0, 22.0, 20.0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6]sale_2023 = [57000.0, 21850.0, 22400.0, 33040.0, 9875.0, 170840.0, 132750.0, 71400.0, 30000.0, 12500.0, 1500.0, 35100.0, 36000.0, 14000.0, 10000.0, 21000.0, 36480.0, 26880.0, 6480.0, 30000.0, 36210.0, 45360.0, 900.0, 2610.0, 3600.0, 4050.0, 4500.0, 35480.0, 13050.0, 1350.0, 1200.0, 3600.0, 1800.0, 1800.0, 150000.0, 100000.0, 36000.0, 9000.0, 7200.0, 18000.0, 4200.0]
plant_size_2023 = [147.0, 46.0, 60.0, 96.0, 25.0, 222.0, 135.0, 185.0, 50.0, 25.0, 15.0, 13.0, 18.0, 35.0, 20.0, 42.0, 11.8, 13.2, 1.8, 15.0, 14.9, 6.9, 0.3, 0.9, 0.9, 0.9, 0.9, 10.9, 0.9, 0.3, 0.6, 0.3, 0.3, 0.3, 30.0, 25.0, 12.0, 1.8, 1.8, 1.8, 4.2]
print("23年数据包含 ", len(sale_2023), " 份作物")# 读取 CSV 文件并设置正确的索引
bean_2023_df = pd.read_csv(r'D:\Studio\Project\2024GJB\求解\C题解\bean_2023.csv', index_col=0)
# 将 DataFrame 中的 NaN 值替换为 0
bean_2023_df.fillna(0, inplace=True)
# 打印 DataFrame 的前几行和形状
print(bean_2023_df.head())
print(bean_2023_df.shape)# 转换索引和列名为整数
bean_2023_df.index = pd.to_numeric(bean_2023_df.index)
bean_2023_df.columns = pd.to_numeric(bean_2023_df.columns)# 创建空字典
bean_2023_dict = {}# 遍历 DataFrame 的每一行和每一列
for land in bean_2023_df.index:# 每个土地创建一个新的子字典if land not in bean_2023_dict:bean_2023_dict[int(land)] = {}for crop in bean_2023_df.columns:value = bean_2023_df.at[land, crop]bean_2023_dict[int(land)][int(crop)] = value# 初始化空字典
bean_2023_sum_dict = {}# 遍历每个土地
for land, crops in bean_2023_dict.items():# 计算每个土地上所有作物的总和total_sum = sum(crops.values())# 将总和存储在新的字典中bean_2023_sum_dict[int(land)] = total_sum# 输出结果
print("23年各土地土豆种植量: ", bean_2023_sum_dict, " ", len(bean_2023_sum_dict))# 优化完成后,将plant_size结果保存到Excel工作簿
def save_to_excel(model, plant_size):# 创建一个新的工作簿wb = Workbook()# 遍历每一年份 tfor t in range(2024, 2031):results = []# 遍历土地和作物的plant_size变量,保存结果for land in range(82):for crop in range(41):value = plant_size[t][land][crop].X  # 获取优化后的值results.append([land, crop, value])# 将结果转为DataFramedf_results = pd.DataFrame(results, columns=['Land', 'Crop', 'Plant_Size'])# 创建一个新的工作表ws = wb.create_sheet(title=f'Year_{t}')# 将DataFrame写入工作表for r in dataframe_to_rows(df_results, index=False, header=True):ws.append(r)# 删除默认的工作表del wb['Sheet']# 保存Excel工作簿wb.save('plant_size_results.xlsx')print("求解结果已保存在 ", "plant_size_results.xlsx")# Kai 2024 Mathdef save_iis_to_file(model, filename):"""将 Gurobi 模型的 IIS 信息保存到文本文件中。:param model: Gurobi 模型对象:param filename: 保存 IIS 信息的文件名"""with open(filename, 'w') as file:# 输出 IIS 中的约束file.write("Model is infeasible. The following constraints form the IIS:\n")for c in model.getConstrs():if c.IISConstr:file.write(f"Constraint {c.ConstrName}: {c}\n")# 输出 IIS 中的变量边界file.write("\nThe following variable bounds are part of the IIS:\n")for v in model.getVars():if v.IISLB or v.IISUB:file.write(f"{v.VarName}: LB={v.LB}, UB={v.UB}\n")print("分析日志 已保存在 ", filename)def solve_model():model = gp.Model()# 开启日志model.setParam("LogFile", "gurobi.log")# 启用控制台输出model.setParam("OutputFlag", True)# 设置调试信息model.Params.OutputFlag = 1  # 输出更多调试信息model.Params.LogFile = "gurobi.log"  # 输出日志文件# 设置求解参数model.Params.Threads = 20  # 使用所有可用线程plant_size = {}d = {}for t in range(2024, 2031):plant_size[t] = {}d[t] = {}for land in range(82):plant_size[t][land] = {}d[t][land] = {}for crop in range(41):plant_size[t][land][crop] = model.addVar(vtype=gp.GRB.CONTINUOUS, lb=0.0, name=f"plant_size_{t}_{land}_{crop}")d[t][land][crop] = model.addVar(vtype=gp.GRB.BINARY, name="d_{}_{}".format(land, crop))model.addConstr(plant_size[t][land][crop] >= 0)model.update()# 豆类问题potato = {}for land in range(82):potato[land] = {}for t in range(2023, 2031):potato[land][t]= model.addVar(vtype=gp.GRB.CONTINUOUS, lb=0.0, name=f"potato_{land}")# =========== 干旱地、梯田、山坡 =========== for t in range(2024, 2031):for land in range(0,26):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(0,15)) <= land_size_list[land], name=f"ABC_p_s_{t}_{land}")for crop in range(0,15):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop] * 0.25 * land_size_list[land], name=f"ABC_d_{t}_{land}_{crop}")# 不能种约束for crop in range(15,41):model.addConstr(d[t][land][crop] == 0, name=f"ABC_d_not_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"ABC_p_s_not_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(0,15) for land1 in range(0,26)) <= sum(land_size_list[land2] for land2 in range(0,26))), name=f"ABC_p_s_{t}")# 重茬问题for t in range(2024, 2030):for land in range(0,26):for crop in range(0,15):model.addConstr(d[t][land][crop] * d[t+1][land][crop] == 0, name=f"ABC_same_{t}_{land}_{crop}")# 豆类计算for land in range(0,26):for t in range(2024, 2031):model.addConstr(potato[land][t] == sum(plant_size[t][land][crop] for crop in [0,5]))# =========== 水浇地 ===========# 第一季度for t in range(2024, 2031):for land in range(26,34):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop]for crop in range(15,34)) <= land_size_list[land], name=f"D_p_s_1{t}_{land}")for crop in range(15,34):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop] * 0.25 * land_size_list[land], name=f"D_d_1_{t}_{land}_{crop}")# 不能种约束for crop in chain(range(0, 15), range(34, 41)):model.addConstr(d[t][land][crop] == 0, name=f"D_d_not_1_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"D_p_s_not_1_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(15,34) for land1 in range(26,34)) <= sum(land_size_list[land2] for land2 in range(26,34))), name=f"D_p_s_1_{t}")# 重茬问题for t in range(2024, 2030):for land in range(26,34):for crop in [15]:model.addConstr(d[t][land][crop] * d[t+1][land][crop] == 0, name=f"D_same_1_{t}_{land}_{crop}")# 豆类计算for land in range(26,34):for t in range(2024, 2031):model.addConstr(potato[land][t] == sum(plant_size[t][land][crop] for crop in [16,19]))# 第二季度for t in range(2024, 2031):for land in range(54,62):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(34,37)) <= land_size_list[land], name=f"D_p_s_2_{t}_{land}")for crop in range(34,37):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop]* 0.25 * land_size_list[land], name=f"D_d_2_{t}_{land}_{crop}")# 不能种约束for crop in chain(range(0, 34), range(37, 41)):model.addConstr(d[t][land][crop] == 0, name=f"D_d_not_2_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"D_p_s_not_2_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land][crop] for crop in range(34,37) for land1 in range(54,62)) <= sum(land_size_list[land2] for land2 in range(54,62))), name=f"D_p_s_2_{t}")# 品种数量约束model.addConstr(sum(d[t][land][crop] for crop in range(34,37)) <= 1, name=f"D_crop_num_{t}_{land}")# 种植面积约束for land in range(54,62):model.addConstr(sum(plant_size[t][land][crop] for crop in range(34,37)) <= land_size_list[land] - plant_size[t][land-28][15], name=f"D_same_area_{t}_{land}")# =========== 普通大棚 ===========# 第一季度for t in range(2024, 2031):for land in range(34,50):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(16,34)) <= land_size_list[land], name=f"E_p_s_1_{t}_{land}")for crop in range(16,34):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop]* 0.25 * land_size_list[land], name=f"E_d_1_{t}_{land}_{crop}")# 不能种约束for crop in chain(range(0, 16), range(34,41)):model.addConstr(d[t][land][crop] == 0)model.addConstr(plant_size[t][land][crop] == 0, name=f"E_p_s_not_1_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(16,34) for land1 in range(34,50)) <= sum(land_size_list[land2] for land2 in range(34,50))), name=f"E_p_s_1_{t}")# 豆类计算for land in range(34,50):for t in range(2024, 2031):model.addConstr(potato[land][t] == sum(plant_size[t][land][crop] for crop in [16,19]))# 第二季度for t in range(2024, 2031):for land in range(62, 78):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(37,41)) <= land_size_list[land], name=f"E_p_s_2_{t}_{land}")for crop in range(37,41):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop]* 0.25 * land_size_list[land], name=f"E_d_2_{t}_{land}_{crop}")# 不能种约束for crop in range(0, 37):model.addConstr(d[t][land][crop] == 0, name=f"E_d_not_2_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"E_p_s_not_2_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(37,41) for land1 in range(62,78)) <= sum(land_size_list[land2] for land2 in range(62,78))), name=f"E_p_s_2_{t}")# ===========  智慧大棚 ===========for t in range(2024, 2031):for land in range(50,54):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(16,34)) <= land_size_list[land], name=f"F_p_s_1_{t}_{land}")for crop in range(16,34):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop]* 0.25 * land_size_list[land], name=f"F_d_1_{t}_{land}_{crop}")# 不能种约束for crop in chain(range(0, 16), range(34,41)):model.addConstr(d[t][land][crop] == 0, name=f"F_d_not_1_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"F_p_s_not_1_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(16,34) for land1 in range(50,54)) <= sum(land_size_list[land2] for land2 in range(50,54))), name=f"F_p_s_1_{t}")# 重茬问题for t in range(2025, 2031):for land in range(50,54):for crop in range(16,34):model.addConstr(d[t][land][crop] * d[t-1][land+28][crop] == 0, name=f"F_same_1_{t}_{land}_{crop}")# 第二季度for t in range(2024, 2031):for land in range(78,82):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] for crop in range(16,34)) <= land_size_list[land], name=f"F_p_s_2_{t}_{land}")for crop in range(16,34):model.addConstr(plant_size[t][land][crop] >= d[t][land][crop]*0.25 * land_size_list[land], name=f"F_d_2_{t}_{land}_{crop}")# 不能种约束for crop in chain(range(0, 16), range(34,41)):model.addConstr(d[t][land][crop] == 0, name=f"F_d_not_2_{t}_{land}_{crop}")model.addConstr(plant_size[t][land][crop] == 0, name=f"F_p_s_not_2_{t}_{land}_{crop}")# model.addConstr((sum(plant_size[t][land1][crop] * d[t][land1][crop] for crop in range(16,34) for land1 in range(78,82)) <= sum(land_size_list[land2] for land2 in range(78,82))), name=f"F_p_s_2_{t}")# 重茬问题for t in range(2024, 2031):for land in range(78,82):for crop in range(16,34):model.addConstr(d[t][land-28][crop] * d[t][land][crop] == 0, name=f"F_same_2_{t}_{land}_{crop}")# 豆类计算for land in chain(range(50,54), range(78,82)):for t in range(2024, 2031):model.addConstr(potato[land][t] == sum(plant_size[t][land][crop] for crop in [16,19]))# ===========  全局约束 ===========for t in range(2024,2031):for land in range(82):model.addConstr(sum(plant_size[t][land][crop] for crop in range(41)) <= land_size_list[land], name=f"G_p_s_{t}_{land}")# 三年一豆类问题(每三年一约束)for land in range(82):model.addConstr(sum(potato[land][t] for t in range(2023,2026)) >= 1e-6)model.addConstr(sum(potato[land][t] for t in range(2024,2027)) >= 1e-6)model.addConstr(sum(potato[land][t] for t in range(2025,2028)) >= 1e-6)model.addConstr(sum(potato[land][t] for t in range(2026,2029)) >= 1e-6)model.addConstr(sum(potato[land][t] for t in range(2027,2030)) >= 1e-6)model.addConstr(sum(potato[land][t] for t in range(2028,2031)) >= 1e-6)# 产量约束for t in range(2024,2031):for crop in range(41):model.addConstr(sum(plant_size[t][land][crop] * d[t][land][crop] * unit_product_dict[land][crop] for land in range(82)) >= sale_2023[crop],name=f"Y_sale_{t}_{crop}")# for t in range(2024,2031):#     for crop in range(41):#         model.addConstr(#             sum(plant_size[t][land][crop] * d[t][land][crop] for land in range(82)) >= plant_size_2023[crop],#             name=f"Y_sale_{t}_{crop}"#             )for t in range(2024,2031):for land in range(82):model.addConstr(sum(plant_size[t][land][crop] for crop in range(41)) <= land_size_list[land],name=f"I_land_size_{t}_{land}")for t in range(2024,2031):for land in range(82):for crop in range(41):model.addConstr(plant_size[t][land][crop] == d[t][land][crop] * plant_size[t][land][crop],name=f"J_plant_size_{t}_{land}_{crop}") model.update()# 载入23年豆类种植量for land in range(82):model.addConstr(potato[land][2023] == bean_2023_sum_dict[land])# 问题一目标函数# model.setObjective(#     sum(plant_size[t][land][crop] * unit_cost_dict[land][crop] * unit_cost_dict[land][crop] for t in range(2024,2031) for land in range(82) for crop in range(41)),#     gp.GRB.MINIMIZE# )# 问题二目标函数model.setObjective(sum(0.5 * (plant_size[t][land][crop] * unit_product_dict[land][crop] * price_jin_dict[land][crop] * d[t][land][crop] - sale_2023[crop] * price_jin_dict[land][crop]) + sale_2023[crop] * price_jin_dict[land][crop] - unit_cost_dict[land][crop] * plant_size[t][land][crop] * d[t][land][crop] for t in range(2024,2031) for land in range(82) for crop in range(41)),gp.GRB.MAXIMIZE)# Kai 2024 Mathmodel.optimize()# 输出结果if model.status == gp.GRB.INFEASIBLE:print("模型不可行")elif model.status == gp.GRB.UNBOUNDED:print("模型无界")if model.status == gp.GRB.OPTIMAL:print("最优解:", model.objVal)return model, plant_sizeelse:print("未找到最优解")model.computeIIS()save_iis_to_file(model, "iis_output.txt")return None, Noneif __name__ == "__main__":model, plant_size = solve_model()if model:save_to_excel(model, plant_size)  # 调用保存函数

最后可以求得答案放入要求的表格文件中,最后可以再画个图表示部分结果。(找不到图了)

第二题

第二题不确定,这里就不分享了。
最后的图挺“高级的”(不一定是对的),分享给各位
程序的总体流程如下:
在这里插入图片描述

2024:
在这里插入图片描述

2030:
在这里插入图片描述

第三题

我完全不会

A题

A题前三题要简单一些,第四第五就需要考虑一下了。我还是喜欢A题,要不是三角函数学的不好,不然我就去做A题了。这种每一步都是可以“预料”的,有点像物理题🤤。

相关文章:

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注&#xff1a;过程更新了很多文件&#xff0c;所有这里贴上的有些内容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我们队伍并没有获奖&#xff0c;文章内容仅供一乐。 从这次比赛&#xff0c;给出以下赛前建议 …...

TC8:SOMEIP_ETS_029-030

SOMEIP_ETS_029: echoUINT8Array16Bitlength 目的 检查当method echoUINT8Array16BitLength的参数中长度字段为16bit时,SOME/IP协议层是否能对参数进行序列化和反序列化。 对于可变长度的数组而言,必须用长度字段表示数组长度。否则接收方无法判断有效数据。 SOMEIP_ETS_02…...

PYTHON训练营DAY27

装饰器 编写一个装饰器 logger&#xff0c;在函数执行前后打印日志信息&#xff08;如函数名、参数、返回值&#xff09; logger def multiply(a, b):return a * bmultiply(2, 3) # 输出: # 开始执行函数 multiply&#xff0c;参数: (2, 3), {} # 函数 multiply 执行完毕&a…...

Maven使用详解:Maven的概述(二)

一、核心定义与功能 Maven是由Apache软件基金会开发的开源项目管理工具&#xff0c;专为Java项目设计&#xff0c;主要用于自动化构建、依赖管理和项目标准化。其核心功能包括&#xff1a; 依赖管理&#xff1a;通过pom.xml文件声明依赖库&#xff0c;自动从中央仓库下载并管…...

printspoofer的RPC调用接口的简单代码

&#x1f9e0; 问题背景&#xff1a;为什么不能“啥都不导库”就直接调用 RPC 接口&#xff1f; 因为&#xff1a; 你想调用的是 RPC 接口函数&#xff0c;比如 RpcRemoteFindFirstPrinterChangeNotificationEx&#xff1b; 它不是像 MessageBox() 那样的普通 API&#xff0c…...

刻录光盘--和炸铁路,tarjan

https://www.luogu.com.cn/problem/P2835 多做多看多想&#xff0c;一切都会水到渠成 受欢迎的牛--tarjan缩点图论出度-CSDN博客 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int> pii; int n,m; ve…...

新型智慧园区技术架构深度解析:数字孪生与零碳科技的融合实践

&#x1f3ed;在杭州亚运村零碳园区&#xff0c;光伏板与氢燃料大巴构成的能源网络&#xff0c;正通过数字孪生技术实现智能调度。这不仅是格力电器与龙源电力在新能源领域的创新实践&#xff0c;更是智慧园区4.0时代的标杆案例。当AI算法开始接管能源调度&#xff0c;当BIM建模…...

lo(Loopback 接口)详解

lo&#xff08;Loopback 接口&#xff09;详解 lo 是 Loopback&#xff08;环回&#xff09;接口&#xff0c;它是一个虚拟网络接口&#xff0c;主要用于 本地通信&#xff0c;不依赖物理网卡。所有操作系统&#xff08;包括 Linux、Windows、macOS&#xff09;默认都会创建 l…...

duxapp 2025-03-29 更新 编译结束的复制逻辑等

CLI copy 文件夹内的内容支持全量复制优化小程序配置文件合并逻辑&#xff08;更新后建议将 project.config.json 文件从git的追踪中移除&#xff09;新增 copy.build.complete 文件夹的复制逻辑&#xff0c;会在程序编译结束之后将文件复制到指定位置 &#xff08;模块和用户…...

《构建社交应用的安全结界:双框架对接审核API的底层逻辑与实践》

用户生成内容如潮水般涌来。从日常的生活分享&#xff0c;到激烈的观点碰撞&#xff0c;这些内容赋予社交应用活力&#xff0c;也带来管理难题。虚假信息、暴力言论、侵权内容等不良信息&#xff0c;如同潜藏的暗礁&#xff0c;威胁着社交平台的健康生态。内容审核机制&#xf…...

网络世界的“百变身份“:动态IP让连接更自由

深夜的程序调试​​ 凌晨两点&#xff0c;我盯着电脑屏幕上的报错信息&#xff1a;"Connection timed out"。这是本周第三次测试服务器响应时被拒绝访问了——只因为之前同一个IP地址尝试登录太过频繁。正在改代码的朋友小王凑过来看了眼&#xff1a;"老兄&…...

Linux基础开发工具大全

目录 软件包管理器 1>软件包 2>软件生态 3>yum操作 a.查看软件包 b.安装软件 c.卸载软件 4>知识点 vim编辑器 1>基本概念 2>基本操作 3>正常模式命令集 a.模式切换 b.移动光标 c.删除 d.复制 e.替换 f.撤销 g.更改 4>底行模式命令…...

【C/C++】C++中引用类型私有成员的设计与应用

文章目录 C中引用类型私有成员的设计与应用核心意义典型使用场景1. 依赖注入&#xff08;Dependency Injection&#xff09;2. 避免拷贝开销3. 实现不可变设计4. 接口约束 注意事项1. 生命周期管理2. 构造函数的强制性3. 不可重新绑定4. 与多态的结合 对比指针的优缺点总结 C中…...

网页工具-OTU/ASV表格物种分类汇总工具

AI辅助下开发了个工具&#xff0c;功能如下&#xff0c;分享给大家&#xff1a; 基于Shiny开发的用户友好型网页应用&#xff0c;专为微生物组数据分析设计。该工具能够自动处理OTU/ASV_taxa表格&#xff08;支持XLS/XLSX/TSV/CSV格式&#xff09;&#xff0c;通过调用QIIME1&a…...

存储器上如何存储1和0

在计算机存储器中&#xff0c;数据最终以**二进制形式&#xff08;0和1&#xff09;**存储&#xff0c;这是由硬件特性和电子电路的物理特性决定的。以下是具体存储方式的详细解析&#xff1a; 一、存储的物理基础&#xff1a;半导体电路与电平信号 计算机存储器&#xff08;…...

2025第三届盘古初赛(计算机部分)

前言 比赛的时候时间不对&#xff0c;打一会干一会&#xff0c;导致比赛时候思路都跟不上&#xff0c;赛后简单复现一下&#xff0c;希望大家批批一下 计算机取证 1、分析贾韦码计算机检材&#xff0c;计算机系统Build版本为&#xff1f;【标准格式&#xff1a;19000】 183…...

【源码级开发】Qwen3接入MCP,企业级智能体开发实战!

Qwen3接入MCP智能体开发实战&#xff08;上&#xff09; 一、MCP技术与Qwen3原生MCP能力介绍 1.智能体开发核心技术—MCP 1.1 Function calling技术回顾 如何快速开发一款智能体应用&#xff0c;最关键的技术难点就在于如何让大模型高效稳定的接入一些外部工具。而在MCP技术…...

文本数据词汇级增强

import nltkfrom nltk.corpus import wordnetfrom nltk.tokenize import word_tokenizeimport random# nltk.download(wordnet)# nltk.download(punkt)def get_synonyms(word):"""获取单词的同义词列表"""synonyms []for syn in wordnet.synset…...

基于EFISH-SCB-RK3576/SAIL-RK3576的消防机器人控制器技术方案‌

&#xff08;国产化替代J1900的应急救援智能化解决方案&#xff09; 一、硬件架构设计‌ ‌极端环境防护系统‌ ‌防爆耐高温设计‌&#xff1a; 采用陶瓷纤维复合装甲&#xff08;耐温1200℃持续1小时&#xff09;&#xff0c;通过GB 26784-2023消防设备防爆认证IP68防护等级…...

微信小程序:封装request请求、解决请求路径问题

一、创建文件 1、创建请求文件 创建工具类文件request.js,目的是用于发送请求 二、js接口封装 1、写入接口路径 创建一个变量BASE_URL专门存储api请求地址 2、获取全局的token变量 从缓存中取出token的数据 3、执行请求 (1)方法中接收传递的参数 function request(url,…...

【技术原理】ELK技术栈的历史沿革与技术演进

一、起源与早期发展&#xff08;2010-2015&#xff09; ELK技术栈的诞生源于互联网时代对海量日志处理的迫切需求。2010年&#xff0c;Elasticsearch作为基于Apache Lucene的分布式搜索引擎问世&#xff0c;其核心能力包括实时全文检索、倒排索引和分片存储机制&#xff0c;填补…...

point3d 视野朝向设置

这里写自定义目录标题 point3d 视野朝向设置三维相机朝向的直观理解 point3d 视野朝向设置 open3d.visualization.Visualizer 中的 get_view_control() 方法返回一个 ViewControl 对象&#xff0c;用来控制 3D 可视化窗口中的相机视角。通过这个对象可以设置视角朝向&#xff…...

windows服务器下自启动后台运行python脚本

前言 最近有个需求&#xff0c;在windows下根据系统的cpu核数&#xff0c;运行python脚本&#xff0c;记录下在windows注册服务&#xff0c;后台运行python脚本 目录 前言✅ 一、目录结构&#xff08;示例&#xff09;✅ 二、manager.py&#xff08;启动与 CPU 数相同的子进程…...

【Elasticsearch】flattened`类型在查询嵌套数组时可能返回不准确结果的情况

好的&#xff01;为了更清楚地说明flattened类型在查询嵌套数组时可能返回不准确结果的情况&#xff0c;我们可以通过一个具体的例子来展示。这个例子将展示如何在文档中没有完全匹配的嵌套对象时&#xff0c;flattened类型仍然可能返回该文档。 示例文档结构 假设你有以下文…...

Mysql、Oracle、Sql Server、达梦之间sql的差异

1&#xff1a;分页查询 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…...

记录算法笔记(2025.5.15)将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确…...

数学复习笔记 11

前言 向量开始。 矩阵的秩 k 阶子式。从这个概念开始复习。考虑 k 阶子式是否为零&#xff0c;具体是多少我们不在乎&#xff0c;我们只在乎 k 阶子式是否为零。把一套资料复习好就好了。 秩的计算 初等变换秩不发生改变。要么初等变换&#xff0c;要么行列式。用行列式需…...

Kubernetes 运维操作手册:从 etcd 快照进行精确恢复

1 5 步实现 etcd 精确恢复 将快照恢复到本地 etcd 数据目录。使用恢复的数据启动本地 etcd 实例。使用 etcdctl 查询特定键&#xff08;例如&#xff0c;ConfigMap&#xff09;。使用 auger 解码以提取干净的 YAML。使用 kubectl 申请恢复到您的实时集群。 本指南将指导您从 et…...

云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持

5月16日&#xff0c;云轴科技ZStack在官网&#xff08;www.zstack.io&#xff09;正式上线ZStack Support AI智能助手。该系统是ZStack应用人工智能于技术支持服务领域的重要创新&#xff0c;基于自研ZStack AIOS平台智塔及LLMOPS技术打造。 ZStack Support AI定位为智能客服&…...

UE5中制作动态数字Decal

在进行城市道路编辑时&#xff0c;经常需要绘制人行道、交通标志、停车线等路面元素。如果能够使用具有动态修改功能的 Decal&#xff08;贴花&#xff09;&#xff0c;将大大提升编辑效率和灵活性。接下来讲解如何制作。 1.首先准备一张包含所需元素的Texture&#xff0c;这里…...