【2024数模国赛赛题思路公开】国赛C题第二套思路丨附可运行代码丨无偿自提

2024年国赛C题第二套解题思路

第一问: 2024~2030 年农作物的最优种植方案

【问题分析】

题目要求为某乡村在 2024~2030 年制定农作物的最优种植方案,目的是最大化收益,并需考虑两种销售情况:

1. 超过预期销售量的部分滞销,造成浪费;

2. 超过预期销售量的部分以 2023 年价格的 50% 降价出售。

我们需要根据耕地面积、农作物亩产量、销售价格、种植成本等因素建立数学模型来计算最优种植方案。

模型变量定义

1. 决策变量: 表示第t年在第i个地块种植第j 种作物的面积。

2. 参数:

Ai :第 i个地块的面积。

Pj :第 j 种作物的亩产量(可以为每年不变或根据具体情况使用波动模型)。

Sj :第 j 种作物的销售价格。

Cj**:第** j 种作物的种植成本。

Dtj :第j 种作物在第t 年的预期销售量。

Rj:第 j种作物的减产风险,考虑不能重茬种植的影响。

3. 目标函数:

我们的目标是最大化总收益,即所有作物的种植收益减去种植成本。

建模过程

1. 基本模型(不考虑超产滞销和降价的情况)

首先,假设作物的销售量不会超过预期,模型为一个标准的线性规划问题:

约束条件:

1. 地块面积限制:对于每个地块 i ,总种植面积不能超过该地块面积:

2. 每种作物的面积非负:

3. 不同作物的种植区域不能重叠,且需考虑重茬约束:

可以使用二元变量来引入该约束。

2. 超过销售量部分滞销或降价的处理

滞销情况:

对于滞销部分,只需在目标函数中引入一个限制,当产量超过预期销售量时,超过部分的收入为 0

降价情况:

如果超过部分可以按 50% 降价出售,则产量大于预期销售量的部分按降价后的价格计算收益:

3. 不确定性和风险因素

气候波动:通过引入随机变量模拟作物亩产量的年际变化(如设定为± 10% )。

市场波动:可以引入预期销售量的年增长(如玉米和小麦 5%~10% 的年增长率),并设定作物销售价格的波动。

种植风险:对于作物连续种植,考虑减产风险。

智能优化算法设计

为了求解上述模型,我可以采用智能优化算法,如遗传算法( Genetic Algorithm, GA )或粒子群算法( Particle Swarm Optimization, PSO )来求解。

遗传算法( GA )思路

1. 编码:将每年的种植方案表示为个体(染色体),编码方式为每个作物在各地块的种植面积。

2. 初始种群生成:随机生成满足地块面积约束和不重茬约束的种植方案。

3. 适应度函数:以目标函数(收益最大化)作为适应度函数。

4. 选择、交叉、变异:通过选择、交叉和变异操作生成新的种植方案。交叉操作模拟不同方案之间的组合,变异操作对某些地块的种植方案进行微调。

5. 终止条件:迭代到一定代数或适应度函数不再显著变化时,算法终止。

该问题可以通过线性规划结合智能优化算法求解。模型主要考虑作物的销售限制、滞销和降价机制,并引入不确定性和风险因素优化种植策略。智能优化算法如遗传算法可以在复杂约束下找到接近最优的解。

【Python 代码】

import random
import numpy as np
from deap import base, creator, tools, algorithms

 定义问题的常量
NUM_YEARS = 7   从2024到2030
NUM_CROPS = 5   作物的种类数
NUM_FIELDS = 34   地块数量

 耕地面积、预期销售量、销售价格和成本的模拟数据(需根据具体数据修改)
field_areas = [random.randint(20, 100) for _ in range(NUM_FIELDS)]   每个地块的面积
crop_yields = [random.uniform(2, 5) for _ in range(NUM_CROPS)]   每亩产量
crop_prices = [random.uniform(1, 10) for _ in range(NUM_CROPS)]   销售价格
crop_costs = [random.uniform(0.5, 2) for _ in range(NUM_CROPS)]   种植成本
expected_sales = [random.uniform(100, 200) for _ in range(NUM_CROPS)]   预期销售量

 定义个体的适应度(最大化收益)
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

 初始化个体,每个个体代表一个种植方案
def init_individual():
     每个地块随机分配不同作物的种植面积
    return [random.uniform(0, field_areas[i]) for i in range(NUM_FIELDS  NUM_CROPS  NUM_YEARS)]

 评价函数,计算收益
def evaluate(individual):
    total_profit = 0
    for t in range(NUM_YEARS):
        for i in range(NUM_FIELDS):
            for j in range(NUM_CROPS):
                crop_area = individual[t  NUM_FIELDS  NUM_CROPS + i  NUM_CROPS + j]
                crop_yield = crop_area  crop_yields[j]
                sales = min(crop_yield, expected_sales[j])  crop_prices[j]
                if crop_yield > expected_sales[j]:
                    sales += (crop_yield  expected_sales[j])  (crop_prices[j]  0.5)   降价销售
                cost = crop_area  crop_costs[j]
                profit = sales  cost
                total_profit += profit
    return total_profit,

 初始化种群
toolbox = base.Toolbox()
toolbox.register("individual", tools.initIterate, creator.Individual, init_individual)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

 遗传算法操作:选择、交叉和变异
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=0.1, indpb=0.2)
toolbox.register("select", tools.selTournament, tournsize=3)
toolbox.register("evaluate", evaluate)

 运行遗传算法
def main():
    pop = toolbox.population(n=100)   初始化种群
    hof = tools.HallOfFame(1)   记录最优解
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", np.mean)
    stats.register("min", np.min)
    stats.register("max", np.max)

    algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=100, stats=stats, halloffame=hof, verbose=True)

    return hof[0]   返回最优解

if __name__ == "__main__":
    best_solution = main()
    print("Best solution found:", best_solution)
相关推荐
柠檬少少开发19 分钟前
图像拼接算法及实现(一)
人工智能·算法·计算机视觉
weixin_486681141 小时前
C++系列-STL容器中统计算法count, count_if
开发语言·c++·算法
一道秘制的小菜1 小时前
C++第七节课 运算符重载
服务器·开发语言·c++·学习·算法
咕噜咕嘟嘟嘟3 小时前
343. 整数拆分
数据结构·算法
WenGyyyL3 小时前
力扣最热一百题——二叉树的直径
java·c++·算法·二叉树·深度优先
sdlkjaljafdg3 小时前
vector<bool>性能测试
开发语言·c++·算法
muyierfly3 小时前
36.贪心算法3
算法·贪心算法
Kenneth風车4 小时前
【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·分类·数据分析·回归
m0_631270406 小时前
标准C++(二)
开发语言·c++·算法
沫刃起6 小时前
Codeforces Round 972 (Div. 2) C. Lazy Narek
数据结构·c++·算法