Datawhale AI夏令营第三期社会科学赛道:市场博弈和价格预测 Task1学习笔记 数学建模初步理解

开始前的准备(跑通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来模拟传染病传播。每步更新过程中, 易感者可能被相邻感染者感染,感染者可能康复。最后,绘制不同时间步长的网格状态图像。 

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值