2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
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 timeclass PCIOptimizer:def __init__(self, N, PCI_range, A, B, C):self.N = Nself.PCI_range = PCI_rangeself.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 edgesdef _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] % 3for j, w in self.interf_edges[i]:if mod_i == (pci[j] % 3):total += wreturn totaldef _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 -= wif pci[j] == new_pci:delta += w# 混淆变化for j, w in self.confusion_edges[i]:if pci[j] == old_pci:delta -= wif pci[j] == new_pci:delta += w# 模3干扰变化old_mod = old_pci % 3new_mod = new_pci % 3for j, w in self.interf_edges[i]:current_mod = pci[j] % 3if current_mod == old_mod:delta -= wif current_mod == new_mod:delta += wreturn deltadef 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_costfor 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_valcurrent_cost += deltaif 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] = valreturn 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名片即可
相关文章:
2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...
伯努利分布和二项分布学习笔记
目录 1. 伯努利分布1.1定义1.2概率质量函数1.3数学期望与方差1.4应用示例 2. 二项分布2.1定义2.1概率质量函数2.2数学期望与方差2.3性质与图形 3. 伯努利分布与二项分布的关系4. 总结 1. 伯努利分布 伯努利分布(Bernoulli Distribution),又称…...
Redis实战常用二、缓存的使用
一、什么是缓存 在实际开发中,系统需要"避震器",防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache):就是数据交换的缓冲区&…...
G口服务器和普通服务器之间的区别
今天小编主要来为大家介绍一下G口服务器和普通服务器之间的区别! 首先,从硬件配置上看,普通服务器通常都会配备中央处理器、内存和硬盘等基本的硬件配置,能够适用于各种应用程序和服务;G口服务器除了基础的硬件配置还增…...
通过国内源在Ubuntu20.0.4安装repo
国内三大免费源: 清华大学:清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学:USTC Open Source Software Mirror阿里云:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到:…...
多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...
《Java到Go的平滑转型指南》
文章目录 **文章摘要****核心主题****关键内容提炼****决策者行动清单****核心结论** **第一章:转型决策:为什么要从Java转向Go?****1.1 性能对比:GC机制与并发模型差异****GC机制对比****并发模型基准测试** **1.2 开发效率&…...
【软件测试】:软件测试实战
1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…...
SpringMVC 请求处理
SpringMVC 请求处理深度解析:从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式,通过DispatcherServlet统一处理请求,相比传统Servlet的分散处理方式,实…...
unittest自动化测试实战
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…...
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[…...
Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)
一、引言 在 Android 开发领域,高效的状态管理对于构建响应式、高性能的应用程序至关重要,在 Jetpack Compose 中,derivedStateOf 和 rememberCoroutineScope 这两个与派生状态相关的特性在状态管理方面发挥着关键作用。派生状态允许我们根据…...
3.25-2request库
request库 一、介绍request库 (1)requests是用python语言编写的简单易用的http库,用来做接口测试的库; (2)接口测试自动化库有哪些? requests、urllib 、urllib2、urllib3、 httplib 等&…...
《破解老龄化的智能密钥:机器人四维战略与未来养老生态》
一、引言:老龄化社会与智能机器人的必然性 全球老龄化趋势与老年人核心需求(健康管理、生活辅助、心理陪伴、安全保障) 全球正面临着严峻的老龄化挑战。根据联合国发布的数据,全球60岁及以上人口数量在过去几十年中持续增长&…...
Docker-Volume数据卷详讲
Docker数据卷-Volume 一:Volume是什么,用来做什么的 当删除docker容器时,容器内部的文件就会跟随容器所销毁,在生产环境中我们需要将数据持久化保存,就催生了将容器内部的数据保存在宿主机的需求,volume …...
SpringMVC 配置
一、MVC 模式简介 在软件开发的广袤天地中,MVC 模式宛如一座明亮的灯塔,指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块,更是将 MVC 模式的优势发挥得淋漓尽致,堪称 Servlet 的强…...
Python 3.8 Requests 爬虫教程(2025最新版)
遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私! 一、环境配置与基础验证 # 验证 Python 版本(需 ≥3.8) import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库(若未安装) # 命令行执…...
蓝桥杯备考之 最长上升子序列问题(挖地雷)
这道题其实就是正常的最长上升子序列问题,但是我们还要把最优方案输出出来,我们可以用个pre数组来维护就行了,每当我们更新以i为结尾的最长子序列,如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…...
华为OD机试2025A卷 - 游戏分组/王者荣耀(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 2020年题: 英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要…...
【Python Cookbook】字符串和文本(二)
字符串和文本(二) 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写…...
Redisson 实现分布式锁简单解析
目录 Redisson 实现分布式锁业务方法:加锁逻辑LockUtil 工具类锁余额方法:工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法: 如图,简单…...
六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)
1. file [选项] 文件名 用于确定文件类型的实用工具。它会通过分析文件内容(而不仅仅是文件扩展名)来判断文件的实际类型 示例输出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…...
信源的分类及数学模型
信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源(一维离散信源) 信源输出的消息数有限或可数,且每次只输出符号集的一个消息 样本空间&…...
嵌入式硬件工程师从小白到入门-PCB绘制(二)
PCB绘制从小白到入门:知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能(如电源、信号处理、通信)。确定关键参数(电压、电流、频率、接口类型)。 原理图设计 元器件选型:匹配封装、电压、…...
抽象工厂设计模式及应用案例
引言 在软件开发中,合理的设计模式可以有效地提高代码的可维护性、可扩展性和可重用性。抽象工厂模式(Abstract Factory Pattern)便是一个重要的创建型设计模式,它允许我们在不指定具体类的情况下,创建一系列相关或相…...
LVS NAT模式实现三台RS的轮询访问
节点规划: 配置RS: RS1-RS3的网关配置均为 192.168.163.8 配置RS1: [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博客 方法二: rich-text | uni-app...
Docker+Ollama+Xinference+RAGFlow+Dify部署及踩坑问题
目录 一、Xinference部署 (一)简介 (二)部署 (三)参数 (四)错误问题 (五)Xinference配置Text-embedding模型 (六)Xinference配…...
CentOS 7 搭建基于匿名用户的 FTP 服务
1. 安装 VSFTPD yum install vsftpd -y 2. 配置 VSFTPD 编辑主配置文 vi /etc/vsftpd/vsftpd.conf 以下配置项存在或修改为对应值 anonymous_enableYES # 启用匿名用户 local_enableNO # 禁用本地用户 write_enableYES # 允许写入(若需要匿名上传࿰…...
