2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

news2025/7/9 14:41:17

2024年第十四届MathorCup高校数学建模挑战赛

A题 移动通信网络中PCI规划问题

原题再现:

  物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少物理层的小区间互相干扰(ICI),增加物理下行控制信道(PDCCH)的吞吐量有着重要的作用,尤其是对于基站小区覆盖边缘的用户和发生信号切换的用户,能有效地降低信号干扰,提升用户的体验。
  在一个移动通信系统中,PCI的数量是十分有限的,但实际网络中小区的数量巨大,因此必须对PCI进行复用,这就带来了PCI资源的合理复用配置的问题。错误的PCI配置方式会显著地增加下行网络的ICI,从而会严重影响网络质量。为了降低ICI,在进行PCI规划时需要综合地考虑同频邻区之间的三种场景:PCI冲突、PCI混淆以及PCI模3干扰。
  在无线通信系统中,如果小区i的主控连接的设备同时可以接收到小区j的信号,则称小区j为小区i的邻区。如果小区j与小区i的频点相同,则小区j是小区i的同频邻区。如果小区i的某主控连接设备接收到小区i的信号强度pi与邻区j的信号强度pj的差小于等于给定门限δ,即pi-pj≤δ,则称小区j为小区i的重叠覆盖邻区。
  PCI冲突发生在主控小区和其同频邻区分配了相同的PCI的情况下,如图1所示,小区1和它的一个同频邻小区2被分配了相同的PCI值A,此时便会发生PCI冲突。应被小区1连接的用户设备可能会错误地连接到小区2,但小区1才是真正要连接的目标小区。由于对于用户设备来说很难有效地区分场强相差不大的小区1和小区2的信号,错误的连接判断最终会导致无线信号服务的中断,最终导致下行网络资源的错误分配。
在这里插入图片描述
  PCI 混淆通常发生在一个主控小区的两个或者多个同频邻区之间,如图 2 所示。设小区 1 的两个邻小区 2 和 3 被分配了相同的 PCI 值 B,当小区 1 中的用户由于移动等原因需要切换连接到小区 2 时,由于小区 2 和小区 3 的 PCI 相同,用户很可能错误的切换到小区 3。PCI 混淆会导致下行网络中的用户在进行服务切换时的信号中断和资源的错误分配。
在这里插入图片描述
  PCI 模 3 干扰发生在主控小区和其同频重叠覆盖邻区分配的 PCI 模 3
相同的情况下,如图 3 所示,小区 1 和它的一个同频重叠覆盖邻小区 2 被分配了模 3 相同的 PCI 值(例如小区 1 分配的 PCI 是 1,小区 2 分配的 PCI是 7,则小区 1 和 2 的 PCI 模 3 的值相同,都是 1),此时便会发生 PCI 模3 干扰。当 PCI 模 3 干扰现象发生时,由于小区 1 和小区 2 的参考信号的相互叠加,用户设备接收的信号质量会明显的下降,同时这种现象会造成CQI的错误评估和下行网络的延迟。
在这里插入图片描述
  PCI规划问题的目标就是,给每个小区分配PCI,使网络中的PCI冲突、混淆和模3干扰的尽量的少。

  实际网络中,表示PCI冲突混淆和模3干扰数量的方式有很多,可以
用路测数据点的情况,也可以对整个城市进行栅格化用所有栅格的情况,这些方法中,网优部门最常用的就是测量报告(MR)数据。MR数据是UE设备在通信过程中定时上报的报告,每条MR数据中,主要包括UE通信时接入的主控小区及接收到的邻区信息以及相应的信号强度值。由于测量报告是定间隔时间上报,因此MR数据的分布情况基本可以反映业务量的分布情况。同时,由于MR数据在时间和空间上的全面性,因此用MR数据的冲突、混淆和模3干扰的数量,来反映网络中的PCI指标,是比较准确的。

  基于MR数据的PCI规划问题具体为:给定N个小区,遍历这些小区的全部MR数据,生成3个N×N的矩阵,分别为:
  ● 冲突矩阵A=[a_ij]_N×N,其中若小区i和j同频,则a_ij的值为小区i为主控,j为邻区的MR数量,否则a_ij的值为0。
  ● 混淆矩阵B=[b_ij]_N×N,其中若小区i和j同频,则b_ij的值为小区i和j同时为另一个小区k的邻区的MR数量,否则b_ij的值为0。
  ● 干扰矩阵C=[c_ij]_N×N,其中若小区i和j同频,则c_ij的值为小区i为主控,j为i的重叠覆盖邻区的MR数量,否则c_ij的值为0。若小区i和j分配相同的PCI值,则冲突数增加a_ij,混淆数增加b_ij+b_ji,如果小区i和j分配的PCI模3的值相同,则模3干扰数增加c_ij+c_ji。实际网络中,总共可分配的PCI是0到1007共1008个。根据附件提供的数据,对某区域中2067个小区进行PCI规划。

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

  问题2:考虑冲突、混淆和干扰的不同优先级,给这2067个小区重新分配PCI,也是考虑这2067个小区之间的冲突、混淆和模3干扰。首先保证冲突的MR数降到最低,在此基础上保证混淆的MR数降到最低,最后尽量降低模3干扰的MR数。实际网络中,给这2067个小区重新分配PCI,会对这些小区以外的一些距离较近的小区产生影响,也就是这些小区和外围小区之间会产生冲突、混淆和模3干扰的MR数的变化。

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

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

整体求解过程概述(摘要)

  5G 技术的深化与发展显著提升了通信速度,这种高速通信体验为人们的日常生活和工作带来了极大的便利。PCI是网络中用来标识每个物理小区的数字,它是基站配置的一部分,PCI的选择与规划对网络性能有着重要影响。不合理的PCI分配方案会导致用户设备发生信号干扰、网络拥塞、切换到错误小区等问题。考虑到PCI在无线通信中的重要作用,6G作为未来的通信技术很有可能还会继续沿用,而对于数量有限的PCI码,不可避免地会被不同小区重复使用,因此解决这类问题对提高用户上网体验具有十分重大的现实意义。
  本文对待解决的PCI 规划分配的四种问题,均使用模因算法作为主体框架,它是一种结合基于种群的全局搜索和局部搜索的优化技术。在种群的进化中,我们使用基于K-锦标赛的选择方案,通过两种交叉算子,分别为二进制匹配交叉和两点交叉,以及一个变异算子来帮助种群在前中期的快速收敛。并以拉马克进化方式使用我们针对此类问题设计的四个启发式的局部搜索算子对个体进行改进,拉马克进化的思想是后天获取的特征可以遗传给下一代,本算法中体现的是经过四个局部搜索算子改进后的个体,可以参与种群的进化中,这有助于将优质PCI分配方案的特征传递给下一代,同时我们还使用精英策略,这将进一步提升模型的搜索性能。在具体实现上,我们以Visual Studio Code 为主要软件编程求解,在四个待求解问题上取得优异的效果。
  针对问题一:构建以最小化待优化小区之间的总PCI冲突MR数、混淆MR数、模3 干扰MR数之和为目标函数的单目标规划模型,并建立相关约束条件。通过上述进化算法框架对目标函数进行优化,经过一定次数的迭代后,我们找到了目标函数值为26833855 的解,并且到最后还有持续降低的趋势,具体收敛过程如图3-10,体现算法模型具备强大的搜索能力。事实上在四个问题所提供的数据上,我们大约都是给计算机1到2小时左右运行得出的结果,通过相关曲线可以明显看出,模型在算法后期仍然具有求得更优质解的能力,这是因为我们在模型中通过各种优质的局部搜索算子与基于种群的全局搜索,它们在邻域空间上形成互补关系,在一定次数后总是存在几率跳出当前的局部最小值,从而向全局最优值更进一步。
  针对问题二:我们将模型优化过程分为三个阶段,第一阶段以最小化冲突MR数为目标函数。第二阶段以最小化混淆 MR 数为目标函数,并新增关于冲突 MR 数的约束,即优化过程中保存冲突MR数不大于第一阶段结束时的最小值。第三阶段实现模3干扰MR数的优化,类似的,以前两个阶段的结果作为约束条件进行优化。在三个阶段的优化中,均使用固定的模因算法模型,体现模型在不同场景下的适应性。在一定迭代次数后,我们的模型将冲突MR数和混淆MR数都优化到0,模 3干扰MR数为28079222,并还在持续降低,并非模型所能找到的极限最优解,具体收敛过程如图4-2。
  针对问题三:问题三考虑的是所有小区的冲突MR数、混淆MR数以及干扰MR数。由于问题的高度相似性,因此我们在问题一的基础上修改了目标函数设计的部分的算法,即可适用于问题三直接求解。我们同样在随机一次实验上,将目标函数值优化到31374770,且目标函数曲线仍然在持续下降,继续给予时间将获得更优质的解,如图51。
  针对问题四:类似的,我们对模型的只需要在问题二的基础上,修改目标函数计算部分的极少量相关算法代码,即可实现问题求解。在一定迭代次数后,我们的模型同样将冲突MR数和混淆MR数都优化到了最优的0,另外模3干扰MR数为31531882,如图6-1。

模型假设:

  假设1、各小区的频点不变
  假设2、各小区的相对位置和形状不变
  假设3、在模型中上传MR信息的用户设备UE所在位置不变
  假设4、用户设备UE能及时且准确无误地上传相应MR信息
  假设5、通信网络内不发生任何会影响模型计算的设备故障
  假设6、MR数据与时间无关
  假设7、重新分配PCI码后,MR数据不变
  假设8、每个小区都必须且只能分配一个PCI值

问题分析:

  问题一的分析
  问题一所描述的是一个带约束的单目标组合优化问题,它要求我们给 2067 个小区设计PCI分配方案,使得小区之间产生的PCI冲突MR数、PCI混淆MR数、以及PCI模3干扰MR数之和最少,可以将冲突MR数、混淆MR数和模3干扰MR数之和直接作为目标函数进行优化。在大规模优化问题上,以动态规划、整数规划等为代表的精确算法难以高效求解,启发式或元启发式算法是解决PCI规划问题的较好选择,基于问题解空间的庞大性,设计了一种多模因的模因算法模型来实现此问题,能够很好的做到全局搜索,同时又具备强大的局部求精能力。

  问题二的分析
  问题二要求我们考虑冲突、混淆、干扰的优先级,需要的是找到一种PCI分配方案,使得冲突MR数达到最小,冲突MR数达到最优的情况下让混淆MR数尽可能小,并且不破坏冲突MR数、混淆MR数最优的前提下最后再优化模3干扰MR数。与第一题的区别在于目标函数的不同,从问题一的单目标优化转变为多目标优化。 在此我们构建一个多层优化模型,PCI分配方案为一个解,首先设计第一个目标函数计算最优的冲突MR数,记录当前的PCI分配方案;在此基础上,设计第二个目标函数,让冲突MR数不再增大的约束下,对PCI分配方案进行更新,尝试找到满足约束条件下的更优解,使得混淆MR数尽可能小,并记录当前最优的PCI分配方案;最后再通过第三个目标函数计算PCI模3干扰的MR数,扰动当前解,找到一个不增加前两个目标函数值情况下使得模3干扰MR数降到最小的解。由此将一个带约束的多层优化问题转化为三个带约束的单目标优化问题,便于高效求解。 所设计的多个模因算子在三个目标函数下发挥的性能不完全相同,我们的优化模型可以灵活的调整不同算子的权重来契合三个目标函数,在这种分层优化模式下模型可以发挥更出色的性能。

  问题三的分析
  问题三是问题一的扩展,更加符合现实的网络结构,它要求我们考虑附件一中其他小区的情况。在调整给定2067个小区PCI分配方案后,不仅有可能改变这些小区内的PCI 冲突、混淆和模3干扰的状态,而且可能与它们相邻的小区之间发生冲突MR数、混淆MR数和模3干扰MR数的变化。本题只需要在问题一的模型基础上略微修改对PCI 分配方案的评价函数即可。

  问题四的分析
  同样的,问题四在问题二的基础上,额外考虑了其他小区的情况,求解思路仍然是分层级去优化,与问题三类似地,本题只需要在问题二的基础上,调整对PCI分配方案的评价函数模块即可。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:

from deap import algorithms, base, creator, tools

# 1. 定义目标函数和个体编码
def evaluate(individual):
    # 计算冲突、混淆、模3干扰MR数
    return (sum(conflict_mr + confusion_mr + mod3_mr),)

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

# 2. 注册遗传操作
toolbox = base.Toolbox()
toolbox.register("attr_pci", random.randint, 0, 1007)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_pci, n=小区数量)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.register("mate", tools.cxTwoPoint)  # 两点交叉
toolbox.register("mutate", tools.mutUniformInt, low=0, up=1007, indpb=0.05)  # 均匀变异
toolbox.register("select", tools.selTournament, tournsize=3)
toolbox.register("evaluate", evaluate)

import numpy as np
import random
import math
import time

class PCIOptimizer:
    def __init__(self, N, PCI_range, A, B, C):
        self.N = N
        self.PCI_range = PCI_range
        self.A = A  # 冲突矩阵
        self.B = B  # 混淆矩阵
        self.C = C  # 干扰矩阵
        
        # 预处理邻区关系
        self.conflict_edges = self._preprocess_edges(self.A)
        self.confusion_edges = self._preprocess_edges(self.B)
        self.interf_edges = self._preprocess_edges(self.C)
        
    def _preprocess_edges(self, matrix):
        """将邻接矩阵转换为稀疏邻区列表"""
        edges = [[] for _ in range(self.N)]
        for i in range(self.N):
            for j in range(self.N):
                if i != j and matrix[i][j] > 0:
                    edges[i].append( (j, matrix[i][j]) )
        return edges
    
    def _compute_initial_cost(self, pci):
        """计算初始总代价"""
        total = 0
        
        # 冲突代价
        for i in range(self.N):
            for j, w in self.conflict_edges[i]:
                if pci[i] == pci[j]:
                    total += w
        
        # 混淆代价
        for i in range(self.N):
            for j, w in self.confusion_edges[i]:
                if j > i and pci[i] == pci[j]:
                    total += w  # 避免重复计算
        
        # 模3干扰
        for i in range(self.N):
            mod_i = pci[i] % 3
            for j, w in self.interf_edges[i]:
                if mod_i == (pci[j] % 3):
                    total += w
        
        return total
    
    def _compute_delta(self, i, old_pci, new_pci, pci):
        """计算单点变更的代价变化"""
        delta = 0
        
        # 冲突变化
        for j, w in self.conflict_edges[i]:
            if pci[j] == old_pci:
                delta -= w
            if pci[j] == new_pci:
                delta += w
        
        # 混淆变化
        for j, w in self.confusion_edges[i]:
            if pci[j] == old_pci:
                delta -= w
            if pci[j] == new_pci:
                delta += w
        
        # 模3干扰变化
        old_mod = old_pci % 3
        new_mod = new_pci % 3
        for j, w in self.interf_edges[i]:
            current_mod = pci[j] % 3
            if current_mod == old_mod:
                delta -= w
            if current_mod == new_mod:
                delta += w
        
        return delta
    
    def optimize(self, max_iter=10000, temp=1000, cooling_rate=0.95):
        """模拟退火优化"""
        current_pci = [random.randint(0, self.PCI_range-1) for _ in range(self.N)]
        current_cost = self._compute_initial_cost(current_pci)
        
        best_pci = current_pci.copy()
        best_cost = current_cost
        
        for step in range(max_iter):
            # 生成新解
            i = random.randint(0, self.N-1)
            old_val = current_pci[i]
            new_val = random.choice([x for x in range(self.PCI_range) if x != old_val])
            
            # 计算代价变化
            delta = self._compute_delta(i, old_val, new_val, current_pci)
            
            # 决定是否接受
            if delta < 0 or math.exp(-delta/(temp + 1e-6)) > random.random():
                current_pci[i] = new_val
                current_cost += delta
                
                if current_cost < best_cost:
                    best_pci = current_pci.copy()
                    best_cost = current_cost
            
            # 动态降温
            temp *= cooling_rate
            
            # 进度输出
            if step % 100 == 0:
                print(f"Iter {step}: Temp={temp:.2f}, Cost={best_cost}")
        
        return best_pci, best_cost

# 数据加载函数
def load_matrix(file_path, N):
    matrix = np.zeros((N, N), dtype=int)
    with open(file_path, 'r') as f:
        for line in f:
            parts = line.strip().split()
            i = int(parts[0])
            j = int(parts[1])
            val = int(parts[2])
            matrix[i][j] = val
    return matrix

# 参数设置
N = 2067
PCI_range = 1008
conflict_file = 'conflict.txt'
confusion_file = 'confusion.txt'
interf_file = 'interf.txt'

# 加载数据
print("Loading matrices...")
A = load_matrix(conflict_file, N)
B = load_matrix(confusion_file, N)
C = load_matrix(interf_file, N)

# 运行优化
optimizer = PCIOptimizer(N, PCI_range, A, B, C)
print("Starting optimization...")
start_time = time.time()
best_pci, best_cost = optimizer.optimize(max_iter=5000, temp=1000, cooling_rate=0.99)
print(f"Optimization completed in {time.time()-start_time:.2f}s")
print(f"Minimum total MR: {best_cost}")

# 保存结果
with open('optimized_pci.txt', 'w') as f:
    for pci in best_pci:
        f.write(f"{pci}\n")
#### 全部论文请见下方“ 只会建模 QQ名片”  点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis实战常用二、缓存的使用

一、什么是缓存 在实际开发中,系统需要"避震器"&#xff0c;防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache)&#xff1a;就是数据交换的缓冲区&…

通过国内源在Ubuntu20.0.4安装repo

国内三大免费源&#xff1a; 清华大学&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学&#xff1a;USTC Open Source Software Mirror阿里云&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到&#xff1a;…

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…

unittest自动化测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…

leetcode3.无重复字符的最长字串

采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…

3.25-2request库

request库 一、介绍request库 &#xff08;1&#xff09;requests是用python语言编写的简单易用的http库&#xff0c;用来做接口测试的库&#xff1b; &#xff08;2&#xff09;接口测试自动化库有哪些&#xff1f; requests、urllib 、urllib2、urllib3、 httplib 等&…

Docker-Volume数据卷详讲

Docker数据卷-Volume 一&#xff1a;Volume是什么&#xff0c;用来做什么的 当删除docker容器时&#xff0c;容器内部的文件就会跟随容器所销毁&#xff0c;在生产环境中我们需要将数据持久化保存&#xff0c;就催生了将容器内部的数据保存在宿主机的需求&#xff0c;volume …

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题&#xff0c;但是我们还要把最优方案输出出来&#xff0c;我们可以用个pre数组来维护就行了&#xff0c;每当我们更新以i为结尾的最长子序列&#xff0c;如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…

LVS NAT模式实现三台RS的轮询访问

节点规划: 配置RS&#xff1a; RS1-RS3的网关配置均为 192.168.163.8 配置RS1&#xff1a; [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.163.7/24 ipv4.gateway 192.168.163.8 conne…

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二&#xff1a; rich-text | uni-app

Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…

【机器学习】什么是线性回归?

什么是线性回归&#xff1f; 线性回归是一种 监督学习算法&#xff0c;它通过拟合一个直线&#xff08;或平面&#xff0c;高维空间下是超平面&#xff09;来建立 输入特征 和 输出目标 之间的关系。简单来说&#xff0c;线性回归就是找出一个数学方程&#xff08;通常是线性方…

零、ubuntu20.04 安装 anaconda

1.anaconda下载 地址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择&#xff1a;Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录&#xff0c;选在在终端中打开&#xff0c;然后在终端输入安装命…

Web纯前端实现在线打开编辑保存PPT幻灯片

很多项目中有时会需要在线打开PPT并编辑保存到服务器。猿大师办公助手可以完美调用本地office在线打开ppt文件&#xff0c;跟本地打开效果一样。还可以在线打开word、excel、pdf等文件&#xff0c;支持本机OFFICE完整嵌入模式&#xff0c;本机OFFICE所有功能基本都可以在网页上…

LeetCode热题100精讲——Top3:最长连续序列【哈希】

你好&#xff0c;我是安然无虞。 文章目录 题目背景最长连续序列C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题&#xff0c;用这3种数据类型足矣 最长连续序列 题目链接&#x…

2025年渗透测试面试题总结-某 长亭(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 长亭 一、Spring SpEL表达式注入漏洞 1. 技术原理 2. 利用条件 3. 攻击方法 4. 防御策略 二、Jav…

Ubuntu部署Dufs文件服务器

安装dufs 安装cargo apt install cargo升级rust工具链 apt install rustup rustup update stable查看rust版本&#xff0c;需要>1.81 rustc --version安装dufs cargo install dufs将dufs加入环境变量 sudo vim ~/.bashrc export PATH"$HOME/.cargo/bin:$PATH" sou…