开始前的准备(跑通baseline)
baseline地址 https://linklearner.com/activity/12/2/2
按照上述文档即可速通baseline。
接下来就是正文内容了:
文章目录
目录
概要
文章主要是因为我读不懂赛题背景而制作的,当我看到Baseline中的“ABM”,“电力现货市场”、“市场出清”、“边际定价”等名词时,我就不断地调查与寻找资料,来通过自己的方式来理解,所以本文只是我个人的观点与方法。
建模前的疑问
1.为什么要数学建模呢?
数学建模,就是根据实际问题来建立数学模型,再对数学模型来进行求解,就是为了更好地理解和解决实际问题提供定量化的依据和优化方案。
2.而数学建模要解决的而实际问题是什么?
数学建模要解决的实际问题多种多样,涵盖了从预测和决策到优化问题、解释和模拟、控制和策略制定以及跨学科应用等多个方面。部分的问题具体如下:
1). 交通管理与优化
问题描述:城市交通拥堵是一个普遍存在的问题,影响出行效率和城市生活质量。
数学建模应用:通过构建交通流量模型,分析道路容量、交通信号灯配时等因素对交通拥堵的影响。利用图论和网络模型将城市道路网络抽象化,通过处理交通数据,优化交通信号灯的配时方案,以减少拥堵。
2). 气象预测
问题描述:气象预测对于农业、航空、气象灾害防范等至关重要。
数学建模应用:基于大气物理学原理和气象观测数据,构建气象模型。利用数值解法和差分方程等数学工具,模拟天气系统的演化过程,进行未来气象变化的预测。这些预测结果有助于农民合理安排耕作时间、预防灾害、优化能源调度等。
数学建模基本过程
(一)问题分析
最初在进行数学建模时,就是要把实际问题用数学语言和数学符号进行表述。
在把现实问题转化成数学模型时,要充分对这个问题进行了解,了解问题的成因和背景,把对解决问题能提供帮助的数据都收集起来,以更好地对问题进行抽象和概况。
(二)合理的简化假设
在实际的生产和生活中,往往受到各方面因素的影响,要解决的问题是时刻变化的,在解决这种多变问题时,要把问题进行合理假设,通过假设把问题简单化。
(三)建立模型
通过假设,把实际问题中的相关变量之间建立等量关系,从而建立数学问题。在建立模型时,要根据从实际问题中提取出的常量和变量建立合适的数学模型,使问题能获得解决。
(四)求解并检验模型
对模型的求解,并将求解结果与实际情况比较,以此来验证模型的准确性。
(五)模型分析
如果模型与实际比较吻合,则要对计算的结果给出其实际含义,并进行解释。
赛题背景
此次比赛主要针对“电力现货市场”(可以类比证券交易市场),泛指短时间内的电能量交易市场。
市场中有大量发电机组(供给者,会发电并卖出电力)按照交易规则,在指定的平台上采取集中竞价的方式确定电能的交易量和价格。这些电能会被输送给个体户、商业用户等,从而利用市场机制实现资源优化配置。
在最理想的情况下,市场完全竞争(市场参与者众多,以至于没有任何一方能够影响价格,不存在控制价格的可能性),没有任何博弈行为。每个发电机组都诚实报价,市场出清价格稳定可靠,达到最优效率。
但现实中,电力现货市场有以下特点:
-
寡头竞争(几家电力公司独大,对价格有显著影响)
-
不完全信息(不同机组信息不互通,存在打信息差牟利的可能)
-
非合作博弈(机组之间各谋其利,追求各自的利益最大化)
-
参与者有限理性(受限于经济知识和对市场的了解,机组不一定能做出最优决策)
从而不同机组之间有复杂的博弈行为,这就让市场出清价格难以估计。
因此,本次比赛要求针对电力现货市场价格和市场博弈主体(549个发电机组)的信息,用ABM方法建模这些机组在报价上的博弈行为,使最终模拟的市场出清报价接近现实中的市场出清价格。
粗略看了一下,起初是看不懂,
(一)问题分析(市场出清价格难以估计)
电力现货市场是一个短时间内的电能量交易市场,其中发电机组(供给者)通过集中竞价方式确定电能的交易量和价格。市场具有寡头竞争、不完全信息、非合作博弈和参与者有限理性的特点。这就让市场出清价格难以估计。
(二)合理的简化假设
需要不考虑市场信息和其他机组信息
(三)建立模型
本质是一个回归(预测目标为连续值,例如根据年龄预测身高)问题,但赛方推荐参赛成员使用ABM模型建模获取市场出清价格。
Agent-based model(ABM)
ABM(Agent-Based Modeling),即基于个体的建模,是一种模拟系统复杂行为的工具。它通过模拟个体(代理)的行为和相互作用,来研究系统整体的动态变化。
一个典型的ABM模型由以下几个部分组成:
-
代理(Agent):系统中的基本个体,每个代理都有自己的属性和行为规则。
-
环境(Environment):代理活动的空间或网络,可能影响代理的行为。
-
交互规则(Interaction Rules):代理之间、代理与环境之间的相互作用规则。
-
时间步(Time Steps):系统按离散的时间步推进,模拟出系统的动态变化过程
案例分析:传染病传播模型
我们以传染病传播模型为例。假设我们要模拟一种传染病在一个封闭社区中的传播情况。首先我们定义代理和环境。
-
代理:社区的居民,
每个代理有以下属性:
-
状态:易感者(S)、感染者(I)、康复者(R)
-
位置:在二维平面上的坐标
-
环境:一个二维平面,表示社区的地理空间。
接下来设置初始条件。
初始时刻,绝大多数代理为易感者(S),少数为感染者(I)。
代理的初始位置随机分布在二维平面上。
然后我们定义行为规则。
易感者(S)若与感染者(I)接触,有一定概率被感染,状态变为感染者(I)。
感染者(I)经过一定时间后康复,状态变为康复者(R),不再具有传染性。
import numpy as np
import matplotlib.pyplot as plt
# 定义网格尺寸
GRID_SIZE = 150
grid_state = np.zeros((GRID_SIZE, GRID_SIZE), dtype=int)
# 初始状态:随机选取一些格子作为感染者(I),其余为易感者(S)
np.random.seed(42)
init_infected = np.random.choice([0, 1], size=(GRID_SIZE, GRID_SIZE), p=[0.98, 0.02])
grid_state[init_infected == 1] = 1
# 设定参数
infection_rate = 0.4 # 感染概率
recovery_rate = 0.05 # 康复概率
# 用于更新网格状态的函数
def update_grid_state(grid_state):
"""
此函数用于在每次迭代中更新网格的状态
"""
new_grid_state = grid_state.copy()
for i in range(GRID_SIZE):
for j in range(GRID_SIZE):
if grid_state[i, j] == 0: # 易感者
# 检查相邻的感染者
adjacent_cells = [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]
for ni, nj in adjacent_cells:
if 0 <= ni < GRID_SIZE and 0 <= nj < GRID_SIZE and grid_state[ni, nj] == 1:
if np.random.rand() < infection_rate:
new_grid_state[i, j] = 1 # 易感者变为感染者
break
elif grid_state[i, j] == 1: # 感染者
if np.random.rand() < recovery_rate:
new_grid_state[i, j] = 2 # 感染者变为康复者
return new_grid_state
# 模拟多步迭代
num_steps = 80
history = [grid_state]
for step in range(num_steps):
new_grid_state = update_grid_state(grid_state)
history.append(new_grid_state)
grid_state = new_grid_state
# 可视化
fig, axes = plt.subplots(1, 5, figsize=(15, 3))
steps_to_display = [0, 30, 50, 60, 80]
for ax, step in zip(axes, steps_to_display):
ax.imshow(history[step], cmap='viridis')
ax.set_title(f'step {step}')
ax.axis('off')
plt.show()
该代码通过设置一个150x150的网格,初始化少量感染者,定义感染和康复概率,迭代更新网格状态1来模拟传染病传播。每步更新过程中, 易感者可能被相邻感染者感染,感染者可能康复。最后,绘制不同时间步长的网格状态图像。