备战数学建模赛打卡帖

物理
备战数学建模赛打卡帖

用户头像
❑毅❒ 更新于2026-3-6 16:20:35

这个帖子先用来规划写论文的进度

那个建模能力赛就是北师大组织的那个

顺便问一下,坛上还有没有谁参加了的啊

说一个扎心的事实,留给我的时间比别人少了将近一半

只是因为我们的县城中学没有通知我们,导致最近才知道……

import numpy as np

from scipy.integrate import solve_ivp

import matplotlib.pyplot as plt


# -------------------------------

# 定义 SEIR 模型

def seir_model(t, y, beta, sigma, gamma):

    S, E, I, R = y

    dSdt = -beta * S * I / N

    dEdt = beta * S * I / N - sigma * E

    dIdt = sigma * E - gamma * I

    dRdt = gamma * I

    return [dSdt, dEdt, dIdt, dRdt]


# -------------------------------

# 适应度函数:最小化 MSE

def fitness(params, data):

    beta, sigma, gamma = params

    sol = solve_ivp(seir_model, [0, T], [S0, E0, I0, R0], args=(beta, sigma, gamma), t_eval=t_points)

    I_pred = sol.y[2]

    mse = np.mean((I_pred - data)**2)

    return 1 / (mse + 1e-8)  # 避免除零


-----------------

# 遗传算法主循环

def genetic_algorithm():

    population_size = 50

    generations = 100

    mutation_rate = 0.1

    crossover_rate = 0.7

    

    # 初始化种群

    pop = np.random.uniform(0.01, 0.5, (population_size, 3))  # beta, sigma, gamma

    

    for gen in range(generations):

        fitnesses = [fitness(ind, real_data) for ind in pop]

        

        # 选择

        parents = []

        for _ in range(population_size // 2):

            idx1, idx2 = np.random.choice(len(pop), 2, replace=False)

            if fitnesses[idx1] > fitnesses[idx2]:

                parents.append(pop[idx1])

            else:

                parents.append(pop[idx2])

        

        # 交叉

        new_pop = []

        for i in range(0, len(parents), 2):

            p1, p2 = parents[i], parents[i+1]

            if np.random.random() < crossover_rate:

                point = np.random.randint(1, 3)

                child1 = np.concatenate([p1[:point], p2[point:]])

                child2 = np.concatenate([p2[:point], p1[point:]])

                new_pop.extend([child1, child2])

            else:

                new_pop.extend([p1, p2])

        

        # 变异

        for i in range(len(new_pop)):

            if np.random.random() < mutation_rate:

                j = np.random.randint(3)

                new_pop[i][j] += np.random.normal(0, 0.05)

                new_pop[i][j] = np.clip(new_pop[i][j], 0.01, 0.5)

        

        pop = np.array(new_pop)

    

    best_idx = np.argmax(fitnesses)

    best_params = pop[best_idx]

    print("最佳参数:", best_params)

    return best_params

收起
5
3
共1条回复
时间正序
用户头像
666(全力备考中)
1月前
我也参加了,不过那玩意儿不是很水吗,还要备考的吗?
11条评论
用户头像
❑毅❒
1月前

不是备考,标题打错了

规划一下写论文的进度

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

那个论文我都是准备一天搞定的哈哈,我也还没开始准备

用户头像
❑毅❒ 回复 666(全力备考中)
1月前

其实我现在选题都没选好………

这个纯粹是看看到时候能不能给少年班或者强基加点分

你准备写什么啊

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

病毒传播模型呗

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

你要考少班吗?跟我同届?不要备考吗还有时间弄这个,不会加分啊

用户头像
❑毅❒ 回复 666(全力备考中)
1月前

我明年准备考的

之前初中的时候去试了一下西交大的

上了但是没有去

因为还是想去中科大

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

真的假的考上不去,我就没那么有实力了哈哈我初三下学期才接触的竞赛

用户头像
❑毅❒ 回复 666(全力备考中)
1月前

真的要做这个

感觉应该会有很多人选这个主题

我感觉我几个同学的题目还挺新颖的

实用性强,而且非常贴合高中生实际

…他们的标题是《数学考试选择题最佳蒙题策略》

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

对了,这不是高中比赛吗,你是初中生吧,怎么参加啊?

还有你帖子里那一堆代码我是看不懂了哈哈,我有个学信竞的朋友负责翻译我的数学语言,,你这都是自己弄得吗,厉害,论文是要提交一堆代码上去吗,还是干嘛

用户头像
❑毅❒ 回复 666(全力备考中)
1月前

我是高一的………

用户头像
666(全力备考中) 回复 ❑毅❒
1月前

高一明年咋考少年班,你11年的嘛?我10的,少年就这一次机会了