题目请到全国大学生数学建模竞赛下载查看。
注:过程更新了很多文件,所有这里贴上的有些内容不是最新的(而是草稿)。
注:我们队伍并没有获奖,文章内容仅供一乐。
从这次比赛,给出以下赛前建议
- 准备代码,今年比赛的时候使用DeepSeek的人数一定不少,到时候画图、数据处理等的代码都要很久才能生成。
- 准备 Gurobi 求解器
- 充足的睡眠和一些吃的,我深熬了一夜,通宵一夜。这里需要感谢数理学院免费提供的方便面、王老吉、咖啡、西瓜、学习场地等。尽显人文关怀(这里踩一下自己的学院)
- 了解多一点,什么适用于哪个问题,具体怎么用可以等比赛的时候找参考资料(不然你连参考资料都不知道搜)
- 寻找队友,建议配置是至少两人解题,两人能写代码,一人能使用数据处理的软件(减轻代码压力),三个人都会规范地撰写公式,三个人都了解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()
# 遍历每一年份 t
for 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])
# 将结果转为DataFrame
df_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 Math
def 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 Math
model.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_size
else:
print("未找到最优解")
model.computeIIS()
save_iis_to_file(model, "iis_output.txt")
return None, None
if __name__ == "__main__":
model, plant_size = solve_model()
if model:
save_to_excel(model, plant_size) # 调用保存函数
最后可以求得答案放入要求的表格文件中,最后可以再画个图表示部分结果。(找不到图了)
第二题
第二题不确定,这里就不分享了。
最后的图挺“高级的”(不一定是对的),分享给各位
程序的总体流程如下:
2024:
2030:
第三题
我完全不会
A题
A题前三题要简单一些,第四第五就需要考虑一下了。我还是喜欢A题,要不是三角函数学的不好,不然我就去做A题了。这种每一步都是可以“预料”的,有点像物理题🤤。