## NOAI2025 化学反应动力学模拟

### 求解本题的参考用时：1小时-2.5小时

### 一. 问题概述

化学反应往往极其复杂。一个看似简单的化学反应可能包含各种不同的步骤。例如，氢气和氧气反应生成水：
$$
2H_{2} + O_2 = H_2O
$$
实际上包含不少于10个基元反应（Reaction），换句话说，一个反应中包含10个不同的步骤。

研究化学反应中的基元反应至关重要，因为它提供了有关反应机理的信息。这类信息对于更经济高效地合成复杂物质（例如药品）至关重要。例如，针对合成氨机理的研究在过去30多年一直是热点，至今化学家们仍在研究它，以尽量减少生产氨的成本。

研究化学反应中基元反应的一种方法是监测参与反应的物质的浓度。不同的基元反应会导致这些物质浓度随反应进行而变化的模式不同。通过监测关键物质浓度随时间的变化，从而获取化学反应中基元反应的信息的方法被称为动力学研究。

一个典型的金属有机反应如下：
$$
L_2M + D \leftrightharpoons L_2MD
$$
这个反应描述了一个金属有机配合物 $ L_2M $ 与 $D$ 反应生成 $L_2MD$，其中 $L_2M$ 是金属 $M$ 与两个配体 $L$ 形成的配合物，而 $L_2MD$ 是金属 $M$ 的配合物。该配合物中$D$ 加成至 $M$ 上，而金属 $M$ 上仍然有另外两个配体 $L$。

当仔细观察这个反应时，化学家们发现：

1. 反应中还形成了一个副产物 $L_2M_s$，其中$s$表示化合物中有$s$个$M$。
2. $L_2M$ 的浓度随时间降低，其降低速率与反应体系中 $D$ 的浓度成正比，与 $L$ 的浓度成反比。

这些观察结果促使化学家们提出了以下基元反应（Reaction）来描述这个反应：

Reaction 1.      $L_2M \leftrightharpoons LM + L$

Reaction 2.      $LM + D \rightarrow LMD $

Reaction 3.      $LMD + L \leftrightharpoons L_2MD$

Reaction 4.      $LM \rightarrow LM_s $

Reaction 5.      $LMs + L \leftrightharpoons L_2M_s$

在这些基元反应中，Reaction 1 到Reaction 3 描述了从 $L_2M$ 和 $D$ 形成目标产物 $L_2MD$ 的过程，而Reaction 4 和Reaction 5描述了副产物 $L_2M_s$ 的形成。反应Reaction 2 和Reaction 4 是不可逆的（这意味着Reaction只从左向右进行），而Reaction 1、Reaction 3 和 Reaction 5 是可逆的（这意味着反应既可以从左向右进行，也可以从右向左进行）。

有了这些Reaction，可以写出以上5个Reaction的动力学方程：

Eq 1-1.         $r_{1+} = k_{1+}\times c(L_2M) $

Eq 1-2.         $r_{1-} = k_{1-} \times c(LM) \times c(L)$

Eq 2.            $r_{2+} = k_{2+} \times c(LM) \times c(D)$

Eq 3-1.         $r_{3+} = k_{3+} \times c(LMD) \times c(L)$

Eq 3-2.         $r_{3-} = k_{3-} \times c(L_2MD)$

Eq 4.            $r_{4+} = k_{4+} \times c(LM)$

Eq 5-1.         $r_{5+} = k_{5+} \times c(LMs) \times c(L)$

Eq 5-2.         $r_{5-} = k_{5-} \times c(L_2Ms)$

其中，$r_n$ 表示Reaction $n$ 的反应速率。后缀 "+" 表示 *r* 描述的是从左向右进行的反应速率，而 "-" 表示从右向左进行的反应速率。注意因为，Reaction 2和 Reaction 4是不可逆的，所以第 $r_{2-}$ 和 $r_{4-}$  为零，因此没有列出。此外，$k_n$ 表示Reaction $n$的速率常数（可以理解为一个影响速率的参数），它因反应而异。

基于反应动力学方程，我们可以写出描述每种物质浓度随时间变化的差分方程，即每种物质随着时间的浓度变化，如下：

Eq c1.       $ {\Delta c(L_2M)\over \Delta t}=-r_{1+} + r_{1-} $

Eq c2.       $ {\Delta c(D)\over \Delta t}=-r_{2+}$ 

Eq c3.       $ {\Delta c(L) \over \Delta t}=r_{1+} - r_{1-} -r_{3+} + r_{3-} -r_{5+} + r_{5-}$

Eq c4.       $ {\Delta c(LM)\over \Delta t}=r_{1+} - r_{1-} - r_{2+} - r_{4+}$

Eq c5.       $ {\Delta c(LMD)\over \Delta t}=r_{2+} - r_{3+} + r_{3-}$

Eq c6.       $ {\Delta c(L_2MD)\over \Delta t}=r_{3+} - r_{3-} $

Eq c7.       $ {\Delta c(LMs)\over \Delta t}=r_{4+} - r_{5+}+ r_{5-} $

Eq c8.       $ {\Delta c(L_2Ms)\over \Delta t}=r_{5+} - r_{5-}$

以方程 c1 为例，注意 $L_2M$ 在Reaction 1 中从左向右进行时以  $r_{1+}$的速率被消耗，而在Reaction 1 中从右向左进行时以 $r_{1-}$的速率被生成，因此，其浓度随时间变化的速率可以表示为$\Delta c(L_2M)/\Delta t=-r_{1+} + r_{1-}$。同样的逻辑也适用于其他物质。

在实际的动力学研究中，通常只监测起始物质和产物的浓度，这些数据每 $\Delta t$记录一次。在本题中 $c(L_2M)$、 $c(D)$、$c(L)$、$c(L_2MD)$ 和 $c(L_2M_s)$ 每隔 10.0 秒记录一次。在一个 $L_2M$、$D$ 和 $L$ 的初始浓度分别为  1.0 mol/L、1.0 mol/L 与 0.0 mol/L 的实验中，各物质浓度随时间变化的曲线如下图所示：

![alt](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/161804/43bb2cc13b6a41ba97b9c7616523048f/e23a4b19-73e5-45f1-b6b2-a693ab6eca37.png)
*图1*

当 $L_2M$ 和 $D$ 初始浓度不变，而 $L$ 初始浓度变为 2.5 mol/L 时，曲线变为下图所示：

![![](exp1_trace.png)](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/161804/43bb2cc13b6a41ba97b9c7616523048f/3b8f1a91-231d-423b-b03e-79f2928da900.png)
*图2*

从图中可以看出，较高的 $L$ 浓度会导致反应时间显著延长，即整体反应速率变慢。可以通过反应物的半衰期 $t_{1/2}$ 来评估反应的整体速率。

**反应物的半衰期定义为该反应物浓度减半所需的时间。在这个问题中，我们可以使用 $L_2M$ 的 $t_{1/2}$ 来代表整体反应速率。**
$$
c(L_2M)(t = t_{1/2}) = 1/2\times c(L_2M)(t = 0)
$$
以图1为例，$c(L_2M)$ 于40s至50s之间达到 $0.5 mol/L$ ，此时，反应物自初始值 $1 mol/L$ 减半，因此反应物半衰期在40s至50s之间，结合 **图1** 于 *training_data* 中最终的 $t_{1/2}$ 答案标签，可知其 $c(L_2M)$ 真实半衰期为 $43.650s$


### 二. 数据集

本问题包含一个训练集、一个验证集、与一个测试集

**1. 训练集**: 提供了1000个独立实验的浓度随时间数据，存储在 `data_train` 文件夹中。数据存储在以 `.dat` 文件中，文件名从 `"exp0_trace.dat"` 到 `"exp999_trace.dat"`。

这些 `.dat` 文件以表格形式存储，显示记录重要物质浓度的时间（以秒/s为单位）以及相应的浓度数据（以 mol/L 为单位）。所有数据均以科学计数法存储，保留4位小数：

|    *t*     |  c(L~2~M)  |    c(D)    |    c(L)    |  c(L2MD)   |  c(L2Ms)   |
| :--------: | :--------: | :--------: | :--------: | :--------: | :--------: |
| 0.0000e+00 | 1.0000e+00 | 1.0000e+00 | 0.0000e+00 | 0.0000e+00 | 0.0000e+00 |
| 1.0000e+01 | 8.0644e-01 | 8.9306e-01 | 9.5117e-02 | 7.7999e-02 | 2.0449e-0  |
| 2.0000e+01 | 6.9319e-01 | 8.0034e-01 | 9.5125e-02 | 1.6584e-01 | 4.5845e-02 |
|    ...     |    ...     |    ...     |    ...     |    ...     |    ...     |

每个实验的额外数据保存在一个名为 `training_data.dat` 的 文件中，该文件以表格形式列出了每个实验的其他相关信息。

| Experiment Number | c(L2M) (t = 0) / (mol/L) | c(D)(t = 0) / (mol/L) | c(L)(t = 0) / (mol/L) | Monitoring time / s |  t12 / s   | Reaction Extent / % | Product Yield / % | Side Product Yield / % |
| :---------------: | :----------------------: | :-------------------: | :-------------------: | :-----------------: | :--------: | :-----------------: | :---------------: | :--------------------: |
|         0         |        1.0000e+00        |      1.0000e+00       |      0.0000e+00       |     7.0266e+02      | 4.3650e+01 |     9.9900e+01      |    6.3200e+01     |       2.7100e+01       |
|         1         |        1.0000e+00        |      1.0000e+00       |      2.5000e+00       |     7.2996e+03      | 8.5969e+02 |     9.7970e+01      |    6.8500e+01     |       2.9000e+01       |
|         2         |        1.0000e+00        |      1.0000e+00       |      5.0000e+00       |     1.1584e+04      | 1.7058e+03 |     9.6100e+01      |    6.7600e+01     |       2.8300e+01       |
|        ...        |           ...            |          ...          |          ...          |         ...         |    ...     |         ...         |        ...        |          ...           |

实验编号在第一列，对应于文件名中的“###”（例如，“exp###\_trace.dat”）。 其中**t12/s**记录该反应半衰期的值。显示了在这些反应条件下 $L_2M$ 的实际半衰期。Reaction Extent 显示了在反应监测停止时，有多少 $L_2M$ 参与了反应。其他数据不需要额外解释。

**2. 验证集**: 包含了100个实验中 $c(L_2M)$、 $c(D)$ 和 $c(L)$ 的初始数据。此验证集将作为A榜成绩显示，选手可以看到，用来检验自己提供的求解方法是否具有普适性，以下是一个示例：

| Experiment Number | c(L2M)(t = 0) / (mol/L) | c(D)(t = 0) / (mol/L) | c(L)(t = 0) / (mol/L) |
| :---------------: | :---------------------: | :-------------------: | :-------------------: |
|         0         |       3.2779e+00        |      2.2379e+01       |      1.0562e+01       |
|         1         |       6.7345e+00        |      1.8483e+01       |      1.9717e+01       |
|         2         |       7.1102e+00        |      1.6918e+01       |      2.7257e+01       |
|        ...        |           ...           |          ...          |          ...          |

**3. 测试集**: 包含了412个实验中 $c(L_2M)$、 $c(D)$ 和 $c(L)$ 的初始数据。此测试集将作为B榜，作为最终比赛的评定成绩。数据格式同验证集。

在比赛中，参赛选手可以通过[训练集地址]()访问训练集。参赛选手无法获取测试集和验证集，只能根据[baseline.ipynb]()的通过读取环境变量的方式读取测试集和验证集。

### 三. 任务

参赛者需要开发一种方法，根据每个实验中 $c(L_2M)$, $c(D)$ 和 $c(L)$ 的初始数据来预测 $L_2M$ 的半衰期 $t_{1/2}$ ，并将实验编号和预测的 $t_{1/2}$ 值存储到表格中以便输出。

提示：本题可能会出现对化学反应本身分析的越充分，求解越精确的情况。参考答案使用的方法是给予给出的浓度，重新定义一些"Feature"，然后再将"Feature"输入到模型中进行训练。由于本题的"Feature"数比较少，所以在模型选择上，不建议使用太过于复杂的模型，正确率的提升还是需要依靠对于题目本身的理解。

### 四. 提交

请提交一个名为 `submission.ipynb` 的文件，该文件能够根据 $c(L_2M)$, $c(D)$ 和 $c(L)$ 的初始数据预测出来验证集和测试集中 $L_2M$ 的半衰期  $t12$，本题可以提交模型，不用提交训练过程。 

输出的文件名为"submission.zip"的zip文件，zip文件中包含两个表格"submission_val.csv"和"submission_test.csv"，分别对应验证集和测试集的预测结果。每一个表格应该包含两列，其中第一列为实验编号"Experiment Number"，第二列为半衰期"t12"，参考格式如下表。所有浮点数应以科学计数法存储，并保留4位小数。

**注意：** 输出的表格应该有表头，表中的数据不是实际的解算数据，仅作为提交格式的示例。

提交参考格式可以参考[baseline.ipynb](https://www.bohrium.com/en/notebooks/87572239178)。

| Experiment Number |    t12     |
| :---------------: | :--------: |
|         0         | 4.0000e+01 |
|         1         | 9.6000e+02 |
|         2         | 1.7100e+03 |
|        ...        |    ...     |

### 五. 评分

得分评估方法如下：

对于第 $i$ 个实验，得分计算公式为：
$$
Score_{i} =max(0, 1-{ln(1+0.1\times abs(t_{1/2, predicted,i}-t_{1/2, target,i}) ) \over 5})
$$
对于整体得分，假设测试集中有 *n* 个实验，整体得分计算公式为：
$$
Score ={\sum_{i = 1}^{n}Score_i\over n}
$$