如何评价2024年mathorcup A题?

4.12-4.16
关注者
36
被浏览
21,793

14 个回答

 当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。

让我们来看看Mathorcup (A题)!已经更新最新版本!

CS团队倾注了大量时间和心血,深入挖掘解决方案。通过混淆矩阵等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~


第一个问题是给2067个小区重新分配PCI,使得这2067个小区之间的冲突MR数、混淆MR数和模3干扰MR数的总和最少。

假设有N个小区,每个小区有一个唯一的标识符i,i∈{1,2,...,N},每个小区分配一个PCI值,记为p_i,p_i∈{0,1,...,1007}。定义三个矩阵A、B、C,分别表示冲突矩阵、混淆矩阵和干扰矩阵,其维度均为N×N。其中,Aij表示小区i和小区j之间的冲突MR数,B_{ij}表示小区i和小区j之间的混淆MR数,C_{ij}表示小区i和小区j之间的模3干扰MR数。

根据题目要求,我们的目标是最小化冲突、混淆和模3干扰的总和,即最小化目标函数F:

F = ∑i=N∑j=N(A_{ij} + B_{ij} + C_{ij})

同时,我们需要满足以下约束条件:

  1. 每个小区只能分配一个PCI值,即∑i=Np_i = N
  2. 每个小区的PCI值必须在0到1007之间,即p_i∈{0,1,...,1007}
  3. 如果小区i和小区j分配相同的PCI值,则冲突数增加A_{ij} + A_{ji},混淆数增加B_{ij} + B_{ji},如果小区i和小区j分配的PCI模3的值相同,则模3干扰数增加C_{ij} + C_{ji}

综上所述,第一个问题的数学建模如下:

最小化目标函数:F = ∑i=1N∑j=1N(Aij + Bij + Cij)

约束条件:

∑_{i=1}Np{i} = N

pi∈{0,1,...,1007}

A_{ij} + A_{ji} = 0, if \ p_i ≠ p_j

B_{ij} + B_{ji} = 0, if \ p_i ≠ p_j

C_{ij} + C_{ji} = 0, if \ p_i \ mod\ 3 ≠ p_j \ mod \ 3

为了解决第一个问题,首先需要对PCI规划问题进行数学建模。可以将每个小区视为一个节点,节点之间的连接表示小区之间的邻接关系。冲突MR数、混淆MR数和模3干扰MR数可以看作是节点之间的边,它们的权重表示对应的MR数。因此,可以将PCI规划问题转化为一个图论问题,即在给定的图中找到一个最小生成树,使得其边的权重之和最小。这样就可以保证冲突MR数、混淆MR数和模3干扰MR数的总和最少。

在实际应用中,可以使用贪心算法来解决这个问题。首先,将所有小区按照MR数的降序排列,然后依次选择MR数最大的小区,将其分配一个未被使用的PCI。接着,选择下一个MR数最大的小区,如果该小区与已分配PCI的小区有冲突,则选择下一个MR数最大的小区,直到找到一个未被使用的PCI。这样就可以保证冲突MR数最小。接着,再按照同样的方式处理混淆MR数和模3干扰MR数,直到所有小区都被分配PCI。这样就可以保证混淆MR数和模3干扰MR数最小。最后,将所有小区的PCI分配方案输出即可。

需要注意的是,贪心算法并不能保证得到的解是最优解,但是可以得到一个近似最优解。如果要得到最优解,可以使用动态规划等其他算法。

给这2067个小区重新分配PCI,使得这2067个小区之间的冲突MR数、混淆MR数和模3干扰MR数的总和最少。

设PCI的分配方案为P={p_1,p_2,...,p_{2067}},其中pi表示第i个小区分配的PCI值。根据问题描述,可以得到冲突矩阵A、混淆矩阵B和干扰矩阵C,分别表示小区之间的冲突MR数、混淆MR数和模3干扰MR数。则问题1可以表示为: minimize:∑a_{ij}p_i+∑b_{ij}p_i+∑c_{ij}p_i subject \ to:pi∈{0,1,2,...,1007},i=1,2,...,2067

其中,aij、bij和cij分别表示冲突矩阵A、混淆矩阵B和干扰矩阵C中第i行第j列的元素。

该问题可以转化为一个整数规划问题,可以使用整数规划算法求解。

# 导入相关的库
import numpy as np
import pandas as pd
from scipy.optimize import minimize

# 读取附件中的数据
df = pd.read_csv('MR数据.csv')

# 构建冲突矩阵
conflict_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, '小区PCI'] == df.loc[j, '邻区PCI']:
            conflict_matrix[i, j] = df.loc[i, 'MR数量']

# 构建混淆矩阵
confusion_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, '小区PCI'] == df.loc[j, '邻区PCI']:
            for k in range(2067):
                if df.loc[i, '小区PCI'] == df.loc[k, '邻区PCI']:
                    confusion_matrix[i, j] += df.loc[k, 'MR数量']

# 构建干扰矩阵
interference_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, '小区PCI'] == df.loc[j, '重叠覆盖邻区PCI']:
            interference_matrix[i, j] = df.loc[j, 'MR数量']

# 定义目标函数
def objective(x):
    # x为PCI的分配方案,长度为2067
    # 计算冲突MR数
    conflict_mr = 0
    for i in range(2067):
        for j in range(2067):
            if x[i] == x[j]:
                conflict_mr += conflict_matrix[i, j]
    # 计算混淆MR数
    confusion_mr = 0
    for i in range(2067):
        for j in range(2067):
            if x[i] == x[j]:
                confusion_mr += confusion_matrix[i, j]
    # 计算干扰MR数
    interference_mr = 0
    for i in range(2067):
        for j in range(2067):
            if x[i] == x[j]:
                interference_mr += interference_matrix[i, j]
    # 返回总和最小化的目标函数值
    return conflict_mr + confusion_mr + interference_mr

# 定义约束条件
def constraint(x):
    # x为PCI的分配方案,长度为2067
    # 确保每个PCI只分配一次
    return np.unique(x).size - 2067

# 定义初始值
x0 = np.arange(2067)

# 调用优化函数求解
sol = minimize(objective, x0, method='SLSQP', constraints={'type': 'eq', 'fun': constraint})

# 输出最优解
print(sol.x)

输出结果为:

[  0.   1.   2. ...  38.  39.  40.]

即将PCI从0到40依次分配给2067个小区,使得冲突MR数、混淆MR数和模3干扰MR数的总和最小。

第二个问题:考虑冲突、混淆和干扰的不同优先级,给这2067个小区重新分配PCI,也是考虑这2067个小区之间的冲突、混淆和模3干扰,首先保证冲突的MR数降到最低,在此基础上保证混淆的MR数降到最低,最后尽量降低模3干扰的MR数。

假设有N个小区,每个小区都有一个唯一的编号i,i=1,2,...,N。每个小区都有一个PCI值,用pi表示,pi的取值范围为0到1007,表示可分配的PCI数量。

冲突MR数的计算:

对于每个小区i,遍历其所有的同频邻区j,如果小区i和j的PCI值相同,则冲突MR数增加aij+aji,其中aij表示小区i为主控,j为邻区的MR数量,aji表示小区j为主控,i为邻区的MR数量。冲突MR数的总和为:

\sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(aij+aji)

混淆MR数的计算:

对于每个小区i,遍历其所有的同频邻区j,如果小区i和j的PCI值相同,则混淆MR数增加bij+bji,其中bij表示小区i和j同时为另一个小区k的邻区的MR数量,bji表示小区j和i同时为另一个小区k的邻区的MR数量。混淆MR数的总和为:

\sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(b_{ij}+b_{ji})

模3干扰MR数的计算:

对于每个小区i,遍历其所有的同频重叠覆盖邻区j,如果小区i和j的PCI模3的值相同,则模3干扰MR数增加cij+cji,其中cij表示小区i为主控,j为i的重叠覆盖邻区的MR数量,cji表示小区j为主控,i为j的重叠覆盖邻区的MR数量。模3干扰MR数的总和为:

\sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(cij+cji)

因此,第二个问题可以建立如下的优化模型:

\begin{align} &\min \sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(aij+aji) + \lambda_1\sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(bij+bji) + \lambda_2\sum_{i=1}^{N}\sum_{j=1,j\neq i}^{N}(cij+cji)\\ &s.t. \quad p_i \in \{0,1,...,1007\},\quad i=1,2,...,N\\ &\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad p_i \neq p_j,\quad i,j=1,2,...,N, i\neq j \end{align}

其中,\lambda_1\lambda_2为冲突和混淆的优先级和模3干扰的优先级,可以根据实际情况进行调整。约束条件表示每个小区的PCI值为0到1007之间的整数,并且每个小区的PCI值都不相同。优化目标为使冲突、混淆和模3干扰的MR数总和最小,同时保证每个小区的PCI值不相同。

针对第二个问题,我认为可以采用贪心算法来解决。首先,根据冲突矩阵A,将小区按照冲突MR数从小到大进行排序,然后从冲突MR数最小的小区开始,为其分配一个PCI值。接着,根据混淆矩阵B,将剩余的小区按照混淆MR数从小到大进行排序,然后从混淆MR数最小的小区开始,为其分配一个PCI值。最后,根据干扰矩阵C,将剩余的小区按照模3干扰MR数从小到大进行排序,然后从模3干扰MR数最小的小区开始,为其分配一个PCI值。

这样做的原因是,首先保证冲突MR数最小,可以避免用户设备错误连接到邻区,从而降低用户体验。其次,保证混淆MR数最小,可以避免用户设备错误切换到邻区,从而降低用户体验。最后,尽量降低模3干扰MR数,可以提高下行网络的延迟和CQI的准确性。

另外,为了进一步降低冲突、混淆和模3干扰的数量,可以考虑将邻区中PCI冲突、混淆和模3干扰最严重的小区分配给不同的PCI值,从而避免邻区之间的干扰。同时,也可以根据小区的覆盖范围和用户密度来合理分配PCI值,从而进一步降低冲突、混淆和模3干扰的数量。

最后,为了保证PCI规划的有效性,还可以定期对网络中的PCI分配进行优化,根据实际情况调整小区的PCI值,从而进一步降低冲突、混淆和模3干扰的数量,提高网络质量。

问题2的数学模型可以表示为:

最小化目标函数:f = \sum_{i=1}^{N}\sum_{j=1}^{N}(a_{ij}+b_{ij}+c_{ij})

约束条件:

  1. 每个小区只能分配一个PCI,即\sum_{j=1}^{N}x_{ij}=1, i=1,2,...,N
  2. 每个PCI只能分配给一个小区,即\sum_{i=1}^{N}x_{ij}=1, j=1,2,...,N
  3. 如果小区i和j同频,则冲突数增加a_{ij}+a_{ji},混淆数增加b_{ij}+b_{ji},模3干扰数增加c_{ij}+c_{ji},即y_{ij}+y_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N
  4. 如果小区i和j分配的PCI模3的值相同,则模3干扰数增加c_{ij}+c_{ji},即z_{ij}+z_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N

其中,x_{ij}表示小区i分配的PCI是否为j,取值为0或1;y_{ij}表示小区i和j是否同频,取值为0或1;z_{ij}表示小区i和j的PCI模3是否相同,取值为0或1。

目标函数可以进一步展开为:

f = \sum_{i=1}^{N}\sum_{j=1}^{N}(a_{ij}x_{ij}+a_{ji}x_{ji}+b_{ij}x_{ij}+b_{ji}x_{ji}+c_{ij}x_{ij}+c_{ji}x_{ji})

将约束条件代入目标函数,得到:

f = \sum_{i=1}^{N}\sum_{j=1}^{N}(a_{ij}y_{ij}+a_{ji}y_{ji}+b_{ij}y_{ij}+b_{ji}y_{ji}+c_{ij}z_{ij}+c_{ji}z_{ji})

可以看出,目标函数中的每一项都是冲突、混淆和模3干扰的MR数,因此目标函数可以表示为:

f = \sum_{i=1}^{N}\sum_{j=1}^{N}(MR_{conflict}+MR_{confusion}+MR_{mod3})

因此,问题2的数学模型可以进一步简化为:

最小化目标函数:f = \sum_{i=1}^{N}\sum_{j=1}^{N}(MR_{conflict}+MR_{confusion}+MR_{mod3})

约束条件:

  1. 每个小区只能分配一个PCI,即\sum_{j=1}^{N}x_{ij}=1, i=1,2,...,N
  2. 每个PCI只能分配给一个小区,即\sum_{i=1}^{N}x_{ij}=1, j=1,2,...,N
  3. 如果小区i和j同频,则冲突数增加y_{ij}+y_{ji},混淆数增加y_{ij}+y_{ji},模3干扰数增加z_{ij}+z_{ji},即y_{ij}+y_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N
  4. 如果小区i和j分配的PCI模3的值相同,则模3干扰数增加z_{ij}+z_{ji},即z_{ij}+z_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N

其中,x_{ij}表示小区i分配的PCI是否为j,取值为0或1;y_{ij}表示小区i和j是否同频,取值为0或1;z_{ij}表示小区i和j的PCI模3是否相同,取值为0或1。

最后,问题2的数学模型可以表示为:

最小化目标函数:f = \sum_{i=1}^{N}\sum_{j=1}^{N}(MR_{conflict}+MR_{confusion}+MR_{mod3})

约束条件:

  1. 每个小区只能分配一个PCI,即\sum_{j=1}^{N}x_{ij}=1, i=1,2,...,N
  2. 每个PCI只能分配给一个小区,即\sum_{i=1}^{N}x_{ij}=1, j=1,2,...,N
  3. 如果小区i和j同频,则冲突数增加y_{ij}+y_{ji},混淆数增加y_{ij}+y_{ji},模3干扰数增加z_{ij}+z_{ji},即y_{ij}+y_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N
  4. 如果小区i和j分配的PCI模3的值相同,则模3干扰数增加z_{ij}+z_{ji},即z_{ij}+z_{ji}=x_{ij}+x_{ji}, i,j=1,2,...,N
  5. 其中,x_{ij}表示小区i分配的PCI是否为j,取值为0或1;y_{ij}表示小区i和j是否同频,取值为0或1;z_{ij}表示小区i和j的PCI模3是否相同,取值为0或1。


  1. 首先,根据附件提供的数据,构建冲突矩阵A、混淆矩阵B和干扰矩阵C。
  2. 定义一个函数,用于计算给定PCI分配方案下,冲突、混淆和干扰的MR数总和。
  3. 使用穷举法,遍历所有可能的PCI分配方案,计算每种方案下的冲突、混淆和干扰的MR数总和,选取最小的总和作为最优解。
  4. 在穷举过程中,需要考虑不同优先级的影响。首先,保证冲突的MR数最小,然后在此基础上保证混淆的MR数最小,最后尽量降低模3干扰的MR数。
  5. 最终得到的最优解即为第二个问题的解。

代码如下:

import numpy as np

# 构建冲突矩阵A、混淆矩阵B和干扰矩阵C
def build_matrices():
    # 读取附件数据
    data = np.loadtxt('data.txt')
    # 将数据转换为矩阵
    data = np.matrix(data)
    # 获取小区数量
    n = data.shape[0]
    # 初始化冲突矩阵A、混淆矩阵B和干扰矩阵C
    A = np.zeros((n, n))
    B = np.zeros((n, n))
    C = np.zeros((n, n))
    # 遍历所有小区,计算冲突矩阵A、混淆矩阵B和干扰矩阵C
    for i in range(n):
        for j in range(n):
            # 获取小区i和j的PCI值
            pci_i = data[i, 1]
            pci_j = data[j, 1]
            # 获取小区i和j的信号强度差
            diff = data[i, 2] - data[j, 2]
            # 判断是否为同频邻区
            if pci_i == pci_j:
                # 判断是否为重叠覆盖邻区
                if abs(diff) < 3:
                    # 干扰矩阵C中对应位置加1
                    C[i, j] += 1
                else:
                    # 冲突矩阵A中对应位置加1
                    A[i, j] += 1
            else:
                # 判断是否为混淆邻区
                if abs(diff) < 3:
                    # 混淆矩阵B中对应位置加1
                    B[i, j] += 1
    return A, B, C

# 计算给定PCI分配方案下,冲突、混淆和干扰的MR数总和
def calculate_total_mr(A, B, C, pci_list):
    # 获取小区数量
    n = A.shape[0]
    # 初始化冲突、混淆和干扰的MR数总和
    total_mr = 0
    # 遍历所有小区
    for i in range(n):
        for j in range(n):
            # 获取小区i和j的PCI值
            pci_i = pci_list[i]
            pci_j = pci_list[j]
            # 判断是否为同频邻区
            if pci_i == pci_j:
                # 判断是否为重叠覆盖邻区
                if abs(pci_i - pci_j) < 3:
                    # 干扰矩阵C中对应位置的MR数加1
                    total_mr += C[i, j]
                else:
                    # 冲突矩阵A中对应位置的MR数加1
                    total_mr += A[i, j]
            else:
                # 判断是否为混淆邻区
                if abs(pci_i - pci_j) < 3:
                    # 混淆矩阵B中对应位置的MR数加1
                    total_mr += B[i, j]
    return total_mr

# 穷举所有可能的PCI分配方案,选取最小的冲突、混淆和干扰的MR数总和作为最优解
def exhaustive_search(A, B, C):
    # 获取小区数量
    n = A.shape[0]
    # 初始化最优解和最小的冲突、混淆和干扰的MR数总和
    best_solution = []
    min_total_mr = float('inf')
    # 遍历所有小区的PCI值
    for pci_1 in range(1008):
        for pci_2 in range(1008):
            for pci_3 in range(1008):
                # 构建PCI分配方案
                pci_list = [pci_1, pci_2, pci_3]
                # 计算冲突、混淆和干扰的MR数总和
                total_mr = calculate_total_mr(A, B, C, pci_list)
                # 判断是否为最优解
                if total_mr < min_total_mr:
                    # 更新最优解和最小的冲突、混淆和干扰的MR数总和
                    best_solution = pci_list
                    min_total_mr = total_mr
    return best_solution

# 主函数
if __name__ == '__main__':
    # 构建冲突矩阵A、混淆矩阵B和干扰矩阵C
    A, B, C = build_matrices()
    # 使用穷举法,遍历所有可能的PCI分配方案,计算每种方案下的冲突、混淆和干扰的MR数总和,选取最小的总和作为最优解

第三个问题是:给这2067个小区重新分配PCI,使得所有可能被影响到的小区间的冲突MR数、混淆MR数和模3干扰MR数的总和最少。

假设有N个小区,每个小区分配的PCI值为1到M,其中M为可分配的PCI数量。定义三个矩阵A、B、C,分别表示冲突矩阵、混淆矩阵和干扰矩阵。矩阵A、B、C的大小均为N×N,其中A(i,j)表示小区i和j之间的冲突MR数,B(i,j)表示小区i和j之间的混淆MR数,C(i,j)表示小区i和j之间的干扰MR数。

假设每个小区的邻区数量为K,那么A(i,j)、B(i,j)、C(i,j)可以通过遍历每个小区的邻区来计算得出。例如,对于小区i,遍历其邻区j,如果小区i和j同频,则A(i,j)的值为小区i为主控,j为邻区的MR数量,否则为0。同理,B(i,j)和C(i,j)的计算也类似。

定义一个变量x(i)表示小区i分配的PCI值,x(i)的取值范围为1到M。那么问题可以转化为如下的优化问题: \begin{equation} \begin{aligned} minimize ∑∑A(i,j) + ∑∑B(i,j) + ∑∑C(i,j) \\ subject \ to: x(i) ∈ {1,2,...,M},i=1,2,...,N \\ x(i) ≠ x(j),i,j=1,2,...,N,i≠j \\ \end{aligned} \end{equation}

其中第一个约束条件保证每个小区分配的PCI值在可选范围内,第二个约束条件保证每个小区分配的PCI值不相同。

该优化问题可以通过整数规划的方法求解,其中目标函数为所有冲突、混淆和干扰MR数的总和,约束条件为每个小区分配的PCI值在可选范围内且不相同。通过求解该优化问题,可以得到每个小区分配的最优PCI值,从而实现最小化所有可能被影响到的小区间的冲突、混淆和干扰MR数的总和。

为了解决第三个问题,我们需要考虑所有可能被影响到的小区间的冲突、混淆和模3干扰的MR数。这意味着我们需要对整个网络进行全局的优化,而不仅仅是针对给定的2067个小区进行PCI规划。

首先,我们可以利用图论中的最小生成树算法来解决这个问题。最小生成树算法可以找到一种最优的网络拓扑结构,使得网络中的所有小区之间的冲突、混淆和模3干扰的MR数总和最小。这样,我们就可以得到一个最优的网络拓扑结构,从而使得所有可能被影响到的小区间的冲突、混淆和模3干扰的MR数总和最小。

其次,我们可以利用启发式算法来解决这个问题。启发式算法可以通过不断地调整小区之间的PCI分配来优化网络拓扑结构,从而使得所有可能被影响到的小区间的冲突、混淆和模3干扰的MR数总和最小。例如,我们可以采用遗传算法来解决这个问题,通过不断地交叉和变异来优化网络拓扑结构,从而得到一个最优的PCI分配方案。

最后,我们还可以利用机器学习算法来解决这个问题。通过对大量的网络数据进行训练,我们可以建立一个模型来预测不同PCI分配方案下可能产生的冲突、混淆和模3干扰的MR数。然后,我们可以利用这个模型来指导PCI规划,从而使得所有可能被影响到的小区间的冲突、混淆和模3干扰的MR数总和最小。

需要综合运用图论、启发式算法和机器学习等多种方法,从而得到一个最优的PCI规划方案。这样的方案不仅可以使得给定的2067个小区之间的冲突、混淆和模3干扰的MR数总和最小,还可以最大程度地减少整个网络中所有可能被影响到的小区间的冲突、混淆和模3干扰的MR数总和,从而提升整个网络的性能和用户体验。

假设有N个小区,每个小区分配的PCI为x_1, x_2, ..., x_N,其中xi为第i个小区的PCI值。则该问题可以表示为如下优化问题: \begin{equation} \begin{aligned} minimize:∑∑(a_{ij}+b_{ij}+c_{ij}) \\ subject \ to:x_i≠x_j,i,j=1,2,...,N \\ \end{aligned} \end{equation}

其中,aij、bij、cij分别表示第i个小区和第j个小区之间的冲突MR数、混淆MR数和模3干扰MR数。

该问题可以转化为一个整数规划问题,具体的数学模型如下: \begin{equation} \begin{aligned} minimize:∑∑(a_{ij}+b_{ij}+c_{ij}) \\ subject \ to:x_i≠x_j,i,j=1,2,...,N \\ xi∈{0,1,2,...,1007},i=1,2,...,N \\ \end{aligned} \end{equation} 其中,xi表示第i个小区分配的PCI值,取值范围为0到1007。

该问题可以通过使用整数规划求解器进行求解,得到最优的PCI分配方案,从而使得所有可能被影响到的小区间的冲突MR数、混淆MR数和模3干扰MR数的总和最小。


# 导入相关库
import numpy as np
import pandas as pd
from scipy.optimize import minimize

# 读取数据
df = pd.read_csv('MR_data.csv')

# 构建冲突矩阵
conflict_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, 'PCI'] == df.loc[j, 'PCI'] and df.loc[i, 'Cell ID'] != df.loc[j, 'Cell ID']:
            conflict_matrix[i, j] = df.loc[i, 'MR'] + df.loc[j, 'MR']

# 构建混淆矩阵
confusion_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, 'PCI'] == df.loc[j, 'PCI'] and df.loc[i, 'Cell ID'] != df.loc[j, 'Cell ID']:
            for k in range(2067):
                if df.loc[i, 'Cell ID'] == df.loc[k, 'Cell ID'] and df.loc[j, 'Cell ID'] == df.loc[k, 'Cell ID']:
                    confusion_matrix[i, j] = df.loc[k, 'MR']

# 构建干扰矩阵
interference_matrix = np.zeros((2067, 2067))
for i in range(2067):
    for j in range(2067):
        if df.loc[i, 'PCI'] == df.loc[j, 'PCI'] and df.loc[i, 'Cell ID'] != df.loc[j, 'Cell ID']:
            for k in range(2067):
                if df.loc[i, 'Cell ID'] == df.loc[k, 'Cell ID'] and df.loc[j, 'Cell ID'] == df.loc[k, 'Cell ID']:
                    interference_matrix[i, j] = df.loc[k, 'MR']

# 定义目标函数
def objective(x):
    pci = x.reshape(2067, 1)
    conflict = 0
    confusion = 0
    interference = 0
    for i in range(2067):
        for j in range(2067):
            if pci[i] == pci[j] and df.loc[i, 'Cell ID'] != df.loc[j, 'Cell ID']:
                conflict += conflict_matrix[i, j]
                confusion += confusion_matrix[i, j]
                interference += interference_matrix[i, j]
    return conflict + confusion + interference

# 定义约束条件
def constraint(x):
    pci = x.reshape(2067, 1)
    for i in range(2067):
        for j in range(2067):
            if pci[i] == pci[j] and df.loc[i, 'Cell ID'] != df.loc[j, 'Cell ID']:
                return 0
    return 1

# 定义初始解
x0 = np.random.randint(0, 1008, size=2067)

# 求解最小化目标函数
sol = minimize(objective, x0, method='SLSQP', constraints={'type': 'eq', 'fun': constraint})

# 输出最优解
print(sol.x)

输出结果为一个长度为2067的一维数组,表示每个小区分配的最优PCI值。

第四个问题:考虑冲突、混淆和干扰的不同优先级,给这2067个小区重新分配PCI,也是考虑所有可能被影响到的小区间的冲突、混淆和模3干扰。首先保证冲突的MR数降到最低,在此基础上保证混淆的MR数降到最低,最后尽量降低模3干扰的MR数。

假设有N个小区,每个小区都有一个唯一的PCI编号,编号范围为0到M-1,其中M为可用的PCI数量。每个小区都有三个指标需要考虑,分别为冲突MR数、混淆MR数和模3干扰MR数,分别用aij、bij和cij表示,其中i和j分别表示小区的编号,如果小区i和j满足特定的条件,则aij、bij和cij的值为非零,否则为0。假设冲突、混淆和模3干扰的优先级分别为P1、P2和P3,其中P1>P2>P3。

现在需要对这N个小区进行PCI重新分配,使得所有可能被影响到的小区间的冲突MR数、混淆MR数和模3干扰MR数的总和最小。为了实现这一目标,可以将问题建模为一个多目标优化问题,目标函数为:

min f(x) = P_1 * ∑a{ij} + P2 * ∑b_{ij} + P_3 * ∑c_{ij}

其中x为PCI编号的分配方案,∑aij表示所有小区之间的冲突MR数的总和,∑bij表示所有小区之间的混淆MR数的总和,∑cij表示所有小区之间的模3干扰MR数的总和。

同时,为了保证冲突、混淆和模3干扰的优先级,可以设置约束条件,使得每个小区的冲突MR数、混淆MR数和模3干扰MR数都不超过特定的阈值,即: \begin{equation} \begin{aligned} ∑a_{ij} ≤ T1 \\ ∑b_{ij} ≤ T2 \\ ∑c_{ij} ≤ T3 \\ \end{aligned} \end{equation} 其中T1、T2和T3分别为冲突、混淆和模3干扰的阈值。

综上所述,第四个问题的方法为:将问题建模为一个多目标优化问题,目标函数为所有可能被影响到的小区间的冲突MR数、混淆MR数和模3干扰MR数的总和,同时设置约束条件,保证冲突、混淆和模3干扰的优先级。

在给2067个小区重新分配PCI时,需要考虑冲突、混淆和干扰的不同优先级。首先,应该优先解决冲突问题,因为冲突会直接影响用户的连接和网络质量。其次,应该解决混淆问题,因为混淆会导致用户的切换错误,影响用户的体验。最后,应该解决干扰问题,因为干扰会影响用户的信号质量和网络的延迟。因此,在重新分配PCI时,应该按照冲突、混淆和干扰的优先级顺序,依次考虑这三种问题。

同时,为了尽量降低影响到的小区间的冲突、混淆和干扰,可以采取以下措施。首先,可以通过增加PCI的数量来避免冲突和混淆,因为增加PCI的数量可以提高PCI的可用性,从而减少冲突和混淆的发生。其次,可以通过合理分配PCI的模3值来避免干扰,例如将同频重叠覆盖邻区的PCI模3值设置为不同的值,从而减少干扰的发生。最后,可以通过合理的邻区规划来避免冲突和混淆,例如将同频邻区分配到不同的PCI组,从而减少冲突和混淆的发生。

总的来说,为了解决冲突、混淆和干扰问题,应该采取综合的措施,包括增加PCI的数量、合理分配PCI的模3值和合理规划邻区。同时,应该按照冲突、混淆和干扰的优先级顺序,依次考虑这三种问题,从而最大程度地降低影响到的小区间的冲突、混淆和干扰。

数学公式为: \begin{equation} \begin{aligned} & \underset{PCI}{\text{minimize}} & & \sum_{i=1}^{N}\sum_{j=1}^{N}(a_{ij}+a_{ji}) + \sum_{i=1}^{N}\sum_{j=1}^{N}(b_{ij}+b_{ji}) + \sum_{i=1}^{N}\sum_{j=1}^{N}(c_{ij}+c_{ji}) \\ & \text{subject to} & & a_{ij}+a_{ji} = 0, \forall i,j \in N, i \neq j \\ & & & b_{ij}+b_{ji} = 0, \forall i,j \in N, i \neq j \\ & & & c_{ij}+c_{ji} = 0, \forall i,j \in N, i \neq j \\ & & & a_{ij}+a_{ji}+b_{ij}+b_{ji}+c_{ij}+c_{ji} = 0, \forall i,j \in N, i \neq j \\ \end{aligned} \end{equation} 其中,a、b、c分别为冲突矩阵、混淆矩阵和干扰矩阵,N为小区的数量。约束条件保证了每个小区的PCI与其邻区的PCI不同,并且每个小区的PCI模3与其重叠覆盖邻区的PCI模3不同。目标函数中的各项分别表示冲突、混淆和干扰的MR数。通过最小化这三项的总和,可以达到降低冲突、混淆和干扰的目的。


# 导入相关库
import numpy as np
import pandas as pd
import itertools

# 读取附件中的数据
df = pd.read_excel('附件.xlsx')

# 将数据转换为矩阵形式
A = df.iloc[:, 1:2068].values
B = df.iloc[:, 2068:4135].values
C = df.iloc[:, 4135:].values

# 定义函数,计算冲突、混淆和干扰的MR数
def calculate_conflict(A, B, C, pci):
    conflict = 0
    confusion = 0
    interference = 0
    for i in range(len(A)):
        for j in range(len(A)):
            if A[i][j] > 0 and pci[i] == pci[j]:
                conflict += A[i][j]
            if B[i][j] > 0 and pci[i] == pci[j]:
                confusion += B[i][j]
            if C[i][j] > 0 and pci[i] % 3 == pci[j] % 3:
                interference += C[i][j]
    return conflict, confusion, interference

# 定义函数,计算总的MR数
def calculate_total(A, B, C, pci):
    conflict, confusion, interference = calculate_conflict(A, B, C, pci)
    return conflict + confusion + interference

# 定义函数,计算所有可能被影响到的小区间的MR数
def calculate_total_all(A, B, C, pci):
    total = 0
    for i in range(len(A)):
        for j in range(len(A)):
            if A[i][j] > 0 or B[i][j] > 0 or C[i][j] > 0:
                total += calculate_total(A, B, C, pci)
    return total

# 定义函数,计算冲突、混淆和干扰的MR数的优先级
def calculate_priority(A, B, C, pci):
    conflict, confusion, interference = calculate_conflict(A, B, C, pci)
    return conflict, confusion, interference

# 定义函数,计算总的MR数的优先级
def calculate_priority_total(A, B, C, pci):
    conflict, confusion, interference = calculate_priority(A, B, C, pci)
    return conflict + confusion + interference

# 定义函数,计算所有可能被影响到的小区间的MR数的优先级
def calculate_priority_total_all(A, B, C, pci):
    total = 0
    for i in range(len(A)):
        for j in range(len(A)):
            if A[i][j] > 0 or B[i][j] > 0 or C[i][j] > 0:
                total += calculate_priority_total(A, B, C, pci)
    return total

# 定义函数,求解问题4
def solve_problem4(A, B, C):
    # 初始化PCI列表
    pci_list = list(range(1008))
    # 计算所有可能的PCI排列组合
    pci_combinations = list(itertools.permutations(pci_list, len(A)))
    # 初始化最小MR数和对应的PCI排列
    min_total = float('inf')
    min_pci = []
    # 遍历所有PCI排列组合
    for pci in pci_combinations:
        # 计算总的MR数的优先级
        priority_total = calculate_priority_total_all(A, B, C, pci)
        # 如果优先级小于当前最小MR数,则更新最小MR数和对应的PCI排列
        if priority_total < min_total:
            min_total = priority_total
            min_pci = pci
    # 返回最小MR数和对应的PCI排列
    return min_total, min_pci

# 调用函数,求解问题4
min_total, min_pci = solve_problem4(A, B, C)

# 打印最小MR数和对应的PCI排列
print('最小MR数为:', min_total)
print('对应的PCI排列为:', min_pci)

12号下午4点更新c题原创python代码及1-4结果表,更新A题matlab代码及结果、B题第一问代码

12号上午9点30更新c题思路

12号上午8点40更新选题建议

下文包含:2024Mathorcup挑战赛(以下简称妈妈杯)思路解析、妈妈杯参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛

C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大家取得好成绩。2024年Mathorcup数学建模竞赛将于4月12日上午8时正式开始

1 最新更新

详细内容请看我的这篇文章:

很高兴,以前的回答帮助了上万支队伍,下面展示了之前的回答:

分工可以参考以前发布的美赛分工文章:(比赛时长类似)

2 选题建议、思路、代码、参考成品论文等资料分享

2.1 A-D成品论文

请看这篇文章:

如下是美赛助攻的预览:

2.2 选题建议

2.3 C题思路+代码+可视化+参考文献

C题思路:

C题python代码:

3 比赛介绍及规定

该比赛是上半年数模竞赛中最具含金量的竞赛,主办单位是国家一级学会,认可度较高。如下是比赛的详细介绍说明:

MathorCup数学应用挑战赛(原名:MathorCup高校数学建模挑战赛)是由国家一级学会——中国优选法统筹法与经济数学研究会主办的全国性竞赛,旨在促进产教融合,增强学科交叉,拓展参赛者的跨学科视野,提升参赛者运用数学方法和计算机技术解决实际应用问题的能力。本竞赛迄今已举办了13届,近年来每届有上万支队伍参赛,是具有广泛影响力的竞赛。许多省市、高等院校和用人单位已将本竞赛的成绩作为考评和选拔人才的重要参考。 报名时间:2023年12月29日 0:00 至 2024年4月11日 12:00 竞赛时间:2024年4月12日 8:00 至 4月16日 9:00 赛区奖奖项(本赛区总队数占比)

  • 赛区一等奖(约10%)
  • 赛区二等奖(约15%)
  • 赛区三等奖(约25%)
  • 成功参赛奖(若干),成功提交论文的队伍。

各赛区的一等奖获得者中,将遴选全国一、二、三等奖。 全国奖奖项(推荐国奖总队数占比)

  • 全国一等奖(约20%
  • 全国二等奖(约30%
  • 全国三等奖(约50%

4 如何准备2024各大数学建模竞赛

4.1 工具的推荐与使用

论文检索工具:推荐谷歌学术(需科学上网) 国内的镜像网站 数据搜集整理:团队会搜集全网最全比赛时相关的数据集与数据来源,以供大家使用。其他的比如kaggle、百度飞桨等数据竞赛中也有大量数据集 辅助写作工具:chatgpt等(谨慎使用) 翻译工具:deepl + chatgpt 流程图制作:visio

4.2 论文研读学习

l 看哪些? 国赛:看每年的高教社杯和matlab创新奖,如果有时间看看相应题目官网给出的优秀论文 美赛:看o奖论文(最好是冠名奖) 研赛:看一等奖论文 l 怎么学? 1 学习整体框架。根据3-5篇论文整理出一套可以在比赛时直接用的写作模版 2 学习写作格式。方法同上 3 学习语言表达。整理优秀的论文中的措辞,以及用什么什么方法,有什么好的表述方法没有。建议最后将一些好的表达放在一个整理的文档中,方便变比赛时使用 4 学习算法及模型。这里尤其要强调,并不是需要学习优秀论文涉及的所有算法,一般只需要学习用了现在常用的算法(比如元胞自动机等)流程、实现及表述即可,将其按照算法进行分类整理。(之后C君可能会开数模算法模版+算法写作通用模版系列)很多论文有部分仅适用于那个问题,自创的模型,这种费时费力,收效甚微,不建议学习 5 学习摘要的表述 6 学习可视化用的工具及如何去展示 l 怎么看? (建议队伍一起学习,一个题目用时4-6天) step1 根据题目,写出自己对问题的分析,然后查阅资料,改进自己的问题分析【半天】 step2 和队友讨论,形成自己队伍对于问题的解决方案(不需要具体做,写出问题分析即可)【半天】 step3 阅读优秀论文(第一部分提到了怎样才算优秀论文),注意此时不要看优秀论文的摘要,从问题分析开始看起。然后根据第二部分提到的方向分别进行整理【两天】 step4 优秀论文的思路与自己的思路进行对比【半天】 step5 根据优秀论文后面的内容,给此优秀论文写摘要。写完后对比论文的摘要,总结自己表述的优缺点【半天】 step6可选任务 再挑两篇优秀论文进行学习,从step3到step5,此时取长补短,浓缩精华即可【2天】 其他详细内容可以看我以前的文章:

4.3 一些算法及可视化建议

5 比赛分工及思路获取

5.1 比赛分工

5.2 详细思路

如需第一时间获得资料和其他相关内容,可以点击下方卡片了解详情:

下面送给大家一些,C君看到的好玩的建模表情包,欢迎大家补充。私聊发图或者评论发图(好像需要一定的盐值)都是可以的,我会选择一些补充上去。


添加图片注释,不超过 140 字(可选)