当前位置: 首页 > news >正文

2024/8/18周报

文章目录

  • 摘要
  • Abstract
  • 蚁群算法
    • 背景
    • 基本步骤
    • 应用
    • TSP问题蚁群算法具体实现
  • 遗传算法
    • 基本原理
    • 主要步骤
    • 遗传算法的主要组件
    • 遗传算法的应用
    • 遗传算法的优点
    • 遗传算法的局限性
    • 示例代码
  • 多目标优化算法
    • 多目标优化的基本概念
    • 多目标优化算法的分类
    • NSGA-II 算法示例
  • 总结

摘要

本周对项目申报书中提及的蚁群算法、遗传算法与多目标优化算法的一些基础内容进行学习,遗传算法(Genetic Algorithm, GA)与蚁群算法(Ant Colony Optimization, ACO)都是元启发式算法,它们被设计用来解决复杂的优化问题。虽然这两种算法都属于同一类算法家族,但它们的灵感来源、基本原理以及实现机制有所不同。遗传算法和蚁群算法都是强大的优化工具,它们各自有独特的应用领域。在某些情况下,将这两种算法结合起来可以更好地解决特定问题。对于MOPs,不可能使得所有的目标同时达到最优状态,只能得到一组均衡解,称之为Pareto最优集合。进化算法(Evolutionary algorithm,EA)是一类基于群体搜索的随机优化方法。EA运行一次可以获得一组解,而且对待复杂问题的数学性质不做严格假设,因而被广泛地应用于求解各类MOPs,并因此产生了许多经典的多目标进化算法(Multi-objective evolutionary algorithm,MOEA)。

Abstract

This week, I studied some basic contents of ant colony algorithm, genetic algorithm and multi-objective optimization algorithm mentioned in the project declaration. Genetic Algorithm, GA) and Ant Colony Optimization, ACO) are meta-heuristic algorithms, which are designed to solve complex optimization problems. Although these two algorithms belong to the same kind of algorithm family, their inspiration sources, basic principles and implementation mechanisms are different. Genetic algorithm and ant colony algorithm are powerful optimization tools, and they have their own unique application fields. In some cases, combining these two algorithms can solve specific problems better.For MOPs, it is impossible to make all the objectives reach the optimal state at the same time, and only a set of equilibrium solutions can be obtained, which is called Pareto optimal set. Evolutionary algorithm (EA) is a kind of stochastic optimization method based on group search. EA can get a set of solutions once, and it doesn’t make strict assumptions about the mathematical properties of complex problems, so it is widely used to solve all kinds of MOPs, and thus many classic multi-objective evolutionary algorithms (MOEA) have been produced.

蚁群算法

背景

蚁群算法(Ant Colony Optimization, ACO)是一种模拟自然界中蚂蚁寻找食物路径行为的元启发式优化算法。这种算法最初是由意大利学者Marco Dorigo在1992年提出的,用于求解组合优化问题。

在自然界中,蚂蚁能够通过释放一种称为信息素的化学物质来相互沟通,从而找到从蚁巢到食物源之间的最短路径。蚁群算法正是基于这一原理设计的。在算法中,人工“蚂蚁”在解决问题的过程中会在可行解的空间内移动,并根据之前探索过的路径上的信息素强度来决定下一步的行动。随着时间的推移,信息素会被不断更新,引导蚂蚁更倾向于选择较优的路径。

基本步骤

蚁群算法的基本步骤通常包括:

1.初始化信息素水平。
2.生成蚂蚁,并让它们根据当前的信息素分布和启发式信息(如距离等)来构建解。
3.根据所得到的解的质量来更新信息素水平。
4.重复步骤2和3直到满足停止条件(例如达到最大迭代次数或解的质量不再有显著改进)。

应用

蚁群算法已被广泛应用于解决各种复杂问题,比如旅行商问题(TSP)、车辆路径规划、网络路由选择、任务调度等。它的一个重要特点是能够在搜索过程中平衡全局最优与局部最优之间的关系,具有较好的鲁棒性和适应性。

1.旅行商问题 (TSP)
问题描述:旅行商问题要求找到一条最短的路线,使得旅行商能够访问所有城市恰好一次后回到起点。
解决方案:在TSP问题中,蚁群算法中的每只“蚂蚁”都会构建一条可能的路线,每条边上的信息素量会随着更好的路线被发现而增加。这样,随着时间的推移,蚂蚁们更有可能选择那些构成较短路线的边。

2.车辆路径问题 (VRP)
问题描述:车辆路径问题是物流领域的一个经典问题,需要确定一组车辆如何从仓库出发,访问一系列客户并返回仓库,同时满足客户需求和车辆容量限制。
解决方案:蚁群算法可用于寻找最佳的配送路径,通过调整每条路径上的信息素浓度来指导蚂蚁选择更优的路径。

3.网络路由问题
问题描述:在网络通信中,需要确定数据包的最佳传输路径,以满足服务质量(QoS)的要求,如最小化延迟、带宽使用等。
解决方案:蚁群算法可以通过模拟数据包在网络中的传播来寻找满足特定约束条件下的最优路径。

4.任务调度问题
问题描述:任务调度是指将一系列任务分配给有限数量的资源(如处理器),以便最高效地完成所有任务。
解决方案:蚁群算法可以用来分配任务给资源,通过优化信息素更新策略来改善调度方案。

5.车间调度问题
问题描述:在制造业中,需要有效地安排生产流程以减少生产成本或缩短生产周期。
解决方案:蚁群算法可以帮助确定加工零件的最优顺序,以及机器使用的最优方式。
波分复用光网络中的动态选路和波长分配 (RWA)
问题描述:在波分复用光网络中,动态选路和波长分配是一个重要的问题,涉及到在网络中为新建立的连接选择最佳的路径和波长。
解决方案:通过改进的蚁群算法,可以有效地降低光路的阻塞率,提高网络资源的利用率。

6.图着色问题
问题描述:图着色问题是要为图中的节点分配颜色,使得相邻节点的颜色不同,且使用的颜色数量最少。
解决方案:蚁群算法可以用来寻找最优的颜色分配方案,通过调整节点间的信息素浓度来引导蚂蚁选择合适的颜色。

TSP问题蚁群算法具体实现

下面我将提供一个简单的蚁群算法(ACO)的Python实现示例,以解决旅行商问题(TSP)。在这个例子中,我们将使用一个固定的城市数量和随机生成的城市坐标。蚁群算法的核心在于信息素更新和路径选择过程。

首先,我们需要定义一些基本参数和函数,然后实现主要的蚁群算法循环。

步骤 1: 定义基本参数
n_ants: 蚂蚁的数量
n_cities: 城市的数量
n_iterations: 迭代次数
alpha: 信息素的重要程度
beta: 启发因子的重要程度
rho: 信息素挥发速度
q: 信息素更新的系数

步骤 2: 实现辅助函数
计算距离矩阵
更新信息素
选择下一个城市

步骤 3: 实现蚁群算法

import numpy as np
import random# 定义参数
n_ants = 10
n_cities = 30
n_iterations = 50
alpha = 1  # 信息素重要度
beta = 5  # 启发因子重要度
rho = 0.5  # 信息素挥发速度
q = 100  # 信息素更新系数def distance_matrix(cities):"""计算城市之间的距离矩阵"""n = len(cities)dist = np.zeros((n, n))for i in range(n):for j in range(i + 1, n):dist[i, j] = np.sqrt((cities[i][0] - cities[j][0]) ** 2 + (cities[i][1] - cities[j][1]) ** 2)dist[j, i] = dist[i, j]return distdef initialize_pheromones(n_cities):"""初始化信息素矩阵"""return np.ones((n_cities, n_cities)) / n_citiesdef update_pheromones(pheromones, ants, dist):"""更新信息素矩阵"""pheromones *= (1 - rho)for ant in ants:for i in range(len(ant.path) - 1):current_city = ant.path[i]next_city = ant.path[i + 1]pheromones[current_city, next_city] += q / dist[current_city, next_city]pheromones[next_city, current_city] = pheromones[current_city, next_city]return pheromonesdef select_next_city(ant, allowed_cities, pheromones, dist):"""选择下一个城市"""total_prob = 0probabilities = []for city in allowed_cities:try:prob = (pheromones[ant.current_city, city] ** alpha) * ((1.0 / dist[ant.current_city, city]) ** beta)except ZeroDivisionError:prob = 0total_prob += probprobabilities.append(prob)# 轮盘赌选择下一个城市if total_prob > 0:probabilities = [p / total_prob for p in probabilities]# 确保允许的城市是一个一维数组allowed_cities_array = np.array(list(allowed_cities))selected_city = np.random.choice(allowed_cities_array, p=probabilities)else:# 如果所有概率都为0,则随机选择一个城市selected_city = random.choice(allowed_cities)return selected_cityclass Ant:def __init__(self, n_cities):self.path = []  # 当前路径self.total_distance = 0.0  # 总距离self.current_city = Noneself.allowed_cities = set(range(n_cities))  # 允许访问的城市集合def reset(self, start_city):self.path = [start_city]self.total_distance = 0.0self.current_city = start_cityself.allowed_cities = set(range(n_cities)) - set([start_city])def find_path(self, pheromones, dist):for _ in range(n_cities - 1):next_city = select_next_city(self, self.allowed_cities, pheromones, dist)self.path.append(next_city)self.total_distance += dist[self.current_city, next_city]self.current_city = next_cityself.allowed_cities.remove(next_city)# 返回起点self.total_distance += dist[self.current_city, self.path[0]]self.path.append(self.path[0])def ant_colony_optimization(n_ants, n_cities, n_iterations, alpha, beta, rho, q):# 随机生成城市坐标cities = [(random.uniform(0, 100), random.uniform(0, 100)) for _ in range(n_cities)]# 计算距离矩阵dist = distance_matrix(cities)# 初始化信息素矩阵pheromones = initialize_pheromones(n_cities)best_path = Nonebest_distance = float('inf')for iteration in range(n_iterations):ants = [Ant(n_cities) for _ in range(n_ants)]# 每只蚂蚁从随机城市开始for ant in ants:start_city = random.randint(0, n_cities - 1)ant.reset(start_city)# 构建路径for ant in ants:ant.find_path(pheromones, dist)# 更新信息素pheromones = update_pheromones(pheromones, ants, dist)# 更新最佳路径for ant in ants:if ant.total_distance < best_distance:best_distance = ant.total_distancebest_path = ant.path[:]print(f"Iteration {iteration + 1}: Best distance = {best_distance:.2f}")return best_path, best_distance# 运行蚁群算法
best_path, best_distance = ant_colony_optimization(n_ants, n_cities, n_iterations, alpha, beta, rho, q)
print("Best Path:", best_path)
print("Best Distance:", best_distance)

运行结果如下所示:
在这里插入图片描述

遗传算法

遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,它模拟了自然界中的遗传学和进化过程来寻找优化问题的解决方案。这种算法非常适合于解决那些难以使用传统数学方法求解的问题,特别是在解空间非常大或解空间具有复杂结构的情况下。

基本原理

遗传算法的基本思想是从一个由潜在解决方案组成的种群开始,通过迭代过程逐步改进这些解决方案。每个解决方案通常被称为一个“个体”或“染色体”,并且每个个体都有一个适应度值来衡量它的优劣。

主要步骤

遗传算法的主要步骤包括:

1.初始化种群:随机生成一定数量的初始解决方案作为种群。
2.评估适应度:对种群中的每个个体计算其适应度值。
3.选择操作:基于个体的适应度值选择个体用于繁殖下一代。
4.交叉操作:通过组合两个父代个体的部分特征产生新的子代个体。
5.变异操作:随机改变子代个体的一部分特征,以引入种群多样性。
6.新种群形成:替换旧种群中的个体或直接组成新一代种群。
7.终止条件:重复上述步骤直到满足某个停止条件(如达到最大迭代次数或找到足够好的解)。

遗传算法的主要组件

编码:将问题的解表示为染色体,通常是二进制字符串或更复杂的结构。
适应度函数:定义一个函数来评估每个个体的适应度值,即解的好坏。
选择:根据个体的适应度值来选择哪些个体将参与遗传操作。
交叉(配对):通过组合两个父代个体的部分特征产生新的子代个体。
变异:以小概率随机改变子代个体的一部分特征,以引入种群多样性。
替换:决定如何用新产生的子代个体替换旧种群中的个体。

遗传算法的应用

遗传算法可以应用于各种各样的问题,包括但不限于:

函数优化:寻找使函数达到最大值或最小值的参数集。
组合优化:如旅行商问题(TSP)、图着色问题等。
机器学习:如特征选择、超参数调优等。
调度问题:如作业调度、资源分配等。
电路设计:如VLSI布局问题。
神经网络训练:用于优化神经网络的权重和结构。

遗传算法的优点

全局搜索能力:遗传算法能够有效地探索解空间的各个部分,从而避免陷入局部最优解。
并行性:遗传算法可以很容易地并行化,从而加快搜索过程。
易于实现:遗传算法的实现相对简单,不需要深入了解问题的细节。
适应性强:遗传算法可以应用于各种不同类型的问题,只需要适当调整适应度函数即可。

遗传算法的局限性

收敛速度:遗传算法可能需要较长的时间才能找到最优解,尤其是在解空间非常大的情况下。
参数选择:遗传算法的效果高度依赖于参数的选择,如种群大小、交叉率、变异率等。
早熟收敛:有时遗传算法可能会过早收敛到一个局部最优解,而无法跳出这个区域去探索其他可能的解。

示例代码

下面是一个简单的遗传算法示例流程,假设我们要解决的是一个最小化函数的问题:

import random
import numpy as np# 定义目标函数
def fitness_function(x):return x ** 2  # 示例:最小化 x^2# 初始化种群
def initialize_population(population_size, chromosome_length):population = []for _ in range(population_size):chromosome = [random.choice([0, 1]) for _ in range(chromosome_length)]population.append(chromosome)return population# 评估适应度
def evaluate_fitness(population):fitness_values = []for chromosome in population:# 将二进制串转换为实数decimal_value = int(''.join(str(gene) for gene in chromosome), 2)# 映射到所需范围,例如 [-5, 5]x = decimal_value * 10 / (2 ** len(chromosome) - 1) - 5fitness = fitness_function(x)fitness_values.append((chromosome, fitness))return fitness_values# 选择操作
def selection(fitness_values, k=3):selected = []for _ in range(len(fitness_values)):tournament = random.sample(fitness_values, k)winner = min(tournament, key=lambda x: x[1])selected.append(winner[0])return selected# 交叉操作
def crossover(parents, crossover_rate=0.8):offspring = []for i in range(0, len(parents), 2):parent1 = parents[i]parent2 = parents[i + 1]if random.random() < crossover_rate:point = random.randint(1, len(parent1) - 2)child1 = parent1[:point] + parent2[point:]child2 = parent2[:point] + parent1[point:]else:child1, child2 = parent1, parent2offspring.extend([child1, child2])return offspring# 变异操作
def mutation(offspring, mutation_rate=0.05):mutated_offspring = []for chromosome in offspring:mutated_chromosome = [gene if random.random() > mutation_rate else 1 - gene for gene in chromosome]mutated_offspring.append(mutated_chromosome)return mutated_offspring# 主循环
def genetic_algorithm(population_size, chromosome_length, max_generations):population = initialize_population(population_size, chromosome_length)for generation in range(max_generations):fitness_values = evaluate_fitness(population)selected_parents = selection(fitness_values)offspring = crossover(selected_parents)mutated_offspring = mutation(offspring)population = mutated_offspring# 打印每一代的最佳适应度值best_fitness = min(fitness_values, key=lambda x: x[1])[1]print(f"Generation {generation + 1}: Best Fitness = {best_fitness}")# 最终结果best_solution = min(evaluate_fitness(population), key=lambda x: x[1])return best_solution# 设置参数
population_size = 50
chromosome_length = 16
max_generations = 100# 运行遗传算法
best_solution = genetic_algorithm(population_size, chromosome_length, max_generations)
print("Best Solution:", best_solution)

运行结果如下图:
在这里插入图片描述

多目标优化算法

多目标优化算法(Multi-Objective Optimization Algorithms, MOOA)是一类专门用于解决具有多个相互冲突的目标函数的优化问题的方法。在现实世界中,许多问题都涉及多个目标,例如在工程设计中既要考虑成本又要考虑性能,在资源分配中既要考虑效率又要考虑公平性等。这类问题往往没有单一的最佳解,而是存在一组解,这些解在不同的目标之间形成了权衡,通常称为Pareto最优解集。

多目标优化的基本概念

Pareto最优:在多目标优化中,一个解被认为是Pareto最优的,如果不存在另一个解在所有目标上都不劣于它,并且至少有一个目标优于它。
Pareto前沿:所有Pareto最优解构成的集合称为Pareto前沿。这些解代表了不同目标间的最优权衡。

多目标优化算法的分类

多目标优化算法可以分为两大类:

基于排序的方法:
NSGA-II(Non-dominated Sorting Genetic Algorithm II):这是一种常用的多目标遗传算法,它通过快速非支配排序和拥挤距离来选择个体。
SPEA2(Strength Pareto Evolutionary Algorithm 2):这是一种基于精英的多目标遗传算法,使用一种基于优势的适应度评价机制。
基于分解的方法:
MOEA/D(Multi-Objective Evolutionary Algorithm based on Decomposition):这种方法通过将多目标问题分解为多个单目标子问题来解决。
ε-MOEA(Epsilon-Dominance Based Multi-Objective Evolutionary Algorithm):这种方法通过引入ε-支配关系来促进种群多样性。

NSGA-II 算法示例

NSGA-II 是一个流行的多目标遗传算法,它结合了快速非支配排序和拥挤距离选择来维护种群多样性。下面是一个简单的 NSGA-II 算法流程:

import numpy as np
from scipy.spatial.distance import pdist, squareform# 定义目标函数
def objective_functions(x):f1 = x[0]  # 示例:第一个目标f2 = (x[0] - 1)**2  # 示例:第二个目标return [f1, f2]# 快速非支配排序
def fast_non_dominated_sort(population):dominated_counts = np.zeros(len(population))domination_sets = [[] for _ in range(len(population))]fronts = [[]]for p in range(len(population)):for q in range(len(population)):if all([population[p][i] <= population[q][i] for i in range(len(population[p]))]) and any([population[p][i] < population[q][i] for i in range(len(population[p]))]):dominated_counts[q] += 1domination_sets[p].append(q)if dominated_counts[p] == 0:fronts[0].append(p)i = 0while len(fronts[i]) > 0:Q = []for p in fronts[i]:for q in domination_sets[p]:dominated_counts[q] -= 1if dominated_counts[q] == 0:Q.append(q)i += 1fronts.append(Q)return fronts[:-1]  # 去除最后一个空列表# 计算拥挤距离
def calculate_crowding_distance(front):distances = np.zeros(len(front))for m in range(len(front[0])):sorted_indices = np.argsort([individual[m] for individual in front])distances[sorted_indices[0]] = np.infdistances[sorted_indices[-1]] = np.infif max([individual[m] for individual in front]) != min([individual[m] for individual in front]):for i in range(1, len(front) - 1):distances[sorted_indices[i]] += (front[sorted_indices[i + 1]][m] - front[sorted_indices[i - 1]][m]) / (max([individual[m] for individual in front]) - min([individual[m] for individual in front]))return distances# 主循环
def nsga_ii(population_size, num_objectives, num_generations):population = np.random.rand(population_size, num_objectives)  # 初始化种群for generation in range(num_generations):objectives = np.array([objective_functions(individual) for individual in population])# 快速非支配排序fronts = fast_non_dominated_sort(objectives)# 计算拥挤距离crowding_distances = np.zeros(len(population))for front in fronts:crowding_distances[front] = calculate_crowding_distance(objectives[front])# 选择操作new_population = []for front in fronts:if len(new_population) + len(front) <= population_size:new_population.extend(population[front])else:front_sorted_by_crowding = [population[i] for i in sorted(front, key=lambda i: -crowding_distances[i])]new_population.extend(front_sorted_by_crowding[:population_size - len(new_population)])break# 交叉和变异操作offspring = []for _ in range(population_size):parent1, parent2 = np.random.choice(new_population, size=2, replace=False)child = np.mean([parent1, parent2], axis=0) + np.random.normal(scale=0.1, size=num_objectives)  # 示例:简单的交叉和变异offspring.append(child)# 替换操作population = offspring# 最终结果objectives = np.array([objective_functions(individual) for individual in population])fronts = fast_non_dominated_sort(objectives)pareto_front = objectives[fronts[0]]return pareto_front# 设置参数
population_size = 50
num_objectives = 2
num_generations = 100# 运行 NSGA-II
pareto_front = nsga_ii(population_size, num_objectives, num_generations)
print("Pareto Front:")
for solution in pareto_front:print(solution)

总结

三种算法都是属于启发式优化算法的范畴,它们不保证找到全局最优解,但在很多情况下可以高效地找到接近最优解的解,都采用了种群演化的思想,即通过一系列迭代过程不断改善解的质量,最终达到一个满意的解集。蚁群算法受到自然界中蚂蚁寻找食物路径的行为启发,遗传算法受到生物进化过程中的自然选择、遗传和变异现象启发。
多目标优化算法虽然不是直接模仿自然现象,但它也是基于自然选择中“生存竞争”的思想,通过种群进化来寻找多个目标之间的权衡解。

相关文章:

2024/8/18周报

文章目录 摘要Abstract蚁群算法背景基本步骤应用TSP问题蚁群算法具体实现 遗传算法基本原理主要步骤遗传算法的主要组件遗传算法的应用遗传算法的优点遗传算法的局限性示例代码 多目标优化算法多目标优化的基本概念多目标优化算法的分类NSGA-II 算法示例 总结 摘要 本周对项目…...

端点安全新纪元:EDR与XDR技术的融合应用

在数字时代&#xff0c;随着网络威胁的日益复杂化和多样化&#xff0c;端点安全成为了企业组织不可或缺的重要防线。传统的防病毒软件和防火墙等安全解决方案已难以满足当前的安全需求&#xff0c;而EDR&#xff08;端点检测与响应&#xff09;和XDR&#xff08;扩展检测与响应…...

机器学习:多元线性回归模型

目录 前言 一、讲在前面 1.多元_血压.csv&#xff1a; 2.完整代码&#xff1a; 3.运行结果&#xff1a; 二、实现步骤 1.导入库 2.导入数据 3.绘制散点图&#xff08;这步可以省略&#xff09; ​编辑 4.求特征和标签的相关系数 5.建立并训练线性回归模型 6.检验模…...

树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器

树莓派5虚拟环境配及第三方库的安装&#x1f680; 在完成了树莓派的系统下载和各项基础配置之后进入到了&#xff0c;传感器开发部分&#xff0c;在测试传感器开发之前我打算先安装一下自己需要的库&#xff0c;但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…...

浅谈Winform

一、Winform简介说明 C# 是一种面向对象的编程语言&#xff0c;由微软开发并作为.NET框架的主要编程语言。C# 设计时考虑了易用性&#xff0c;并且具有丰富的特性&#xff0c;如垃圾回收、异常处理、泛型、LINQ&#xff08;Language Integrated Query&#xff09;、异步编程等。…...

MySQL(二)——CRUD

文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充&#xff1a;别名去重查询排序条件查询 补充&#xff1a;运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…...

presto高级用法(grouping、grouping sets)

目录 准备工作&#xff1a; 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 ​编辑 按照爱好分组 统计人数 ​编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…...

二十五年后,Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事

二十五年后&#xff0c;Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事 你可能不知道&#xff0c;FAT32文件系统的32GB分区限制是怎么来的。这个限制其实是1994年Windows前开发者Dave Plummer无心插柳的结果&#xff0c;也是"草台班子"式开发的…...

Java二十三种设计模式-命令模式(18/23)

命令模式&#xff1a;将请求封装为对象的策略 概要 本文全面探讨了命令模式&#xff0c;从基础概念到实现细节&#xff0c;再到使用场景、优缺点分析&#xff0c;以及与其他设计模式的比较&#xff0c;并提供了最佳实践和替代方案&#xff0c;旨在帮助读者深入理解命令模式并…...

Kafka系列之:Dead Letter Queue死信队列DLQ

Kafka系列之:Dead Letter Queue死信队列DLQ 一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客: Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列一、死信队列 死信队列(DLQ)仅适用于接…...

Fragment学习笔记

静态加载 <fragment android:name"com.example.serviceapplication.fragment.TestFragment"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintStart_toStartOf"parent"app:layout_cons…...

NGINX 基础参数与功能

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 实现 Nginx 账户认证功能 1.1 创建htpasswd 认证文件 1.2 创建数据目录 1.3 指定认证文件路径 1.4 测试效果 2 定义重定向错误日志 2.1 指定错误日志访问路…...

css设置元素居中显示

CSS中实现居中显示可以通过不同的属性来实现&#xff0c;取决于你是要水平居中还是垂直居中&#xff0c;或者两者都要。以下是一些常用的居中方法&#xff1a; 1.水平居中 - 行内元素或文本 .center-text {text-align: center; } 2.水平居中 - 块级元素 .center-block {mar…...

js判断一个任意值为空包括数组和对象

在JavaScript中&#xff0c;判断一个变量是否为空可以考虑以下几种情况&#xff1a; 如果变量可能是null或undefined&#xff0c;可以直接判断。 对于数组&#xff0c;如果想要判断数组为空&#xff08;长度为0&#xff09;&#xff0c;可以检查其length属性。 对于对象&…...

EmguCV学习笔记 VB.Net和C# 下的OpenCv开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 笔者的博客网址&#xff1a;https://blog.csdn.net/uruseibest 本教程将分为VB.Net和C#两个版本分别进行发布。 教程VB.net版本请…...

“TCP粘包”不是TCP的问题!

前言 写RPC用了Netty。涉及到粘包拆包问题。想复习一下。发现网上博客多是概念模糊不清。没有触及本质或者没有讲清楚。 遂决定自己写一篇 “TCP粘包”是谁的问题&#xff1f; 首先我们要明确TCP是面向字节流的协议。也就是说我们在应用层想使用TCP来传输数据时&#xff0c;…...

Electron项目依赖管理:最佳实践与常见错误

问题一 问题描述: 输入命令 pnpm add electron 后&#xff0c; electron 包在执行 postinstall 脚本时&#xff0c;尝试从网络上下载 Electron 二进制文件&#xff0c;但由于网络问题&#xff08;如连接超时或代理设置问题&#xff09;&#xff0c;导致下载失败。 λ pnpm a…...

华为数通路由交换HCIP/HCNP

2017-2022年软考高级网络规划设计师真题解析视频&#xff01;软考复习一定要多做历年真题&#xff01; 2022年软考网络规划设计师真题解析_哔哩哔哩_bilibili 2024年5月软考网络工程师真题解析合集&#xff0c;考后估分版【综合知识案例分析】 2024年5月软考网络工程师真题解…...

搜索面试题

1、目前怎么构建样本的&#xff1f;如果排序中第5个被点了&#xff0c;前面的作为负样本&#xff0c;后面的不要怎么样&#xff1b;为什么不好&#xff0c;为什么好。 点击作为负样本&#xff0c;曝光未点击作为负样本&#xff1b; 可以这样理解。您提到的排序中第5个被点的对…...

WPF学习(8) --Windows API函数的使用

一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄&#xff08;IntPtr…...

Linux系统-用户账号文件

文章目录 文件一&#xff08;passwd&#xff09; 文件二&#xff08;shadow&#xff09; 加密密码部分 举例理解 文件三&#xff08;gshadow&#xff09; 文件四&#xff08;group&#xff09; 文件五&#xff08;skel&#xff09; 文件六&#xff08;login.defs&#…...

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...

C语言实现排序之堆排序算法

一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法&#xff0c;其基本思想是&#xff1a; 构建最大堆&#xff1a;首先将待排序的数组构建成一个最大堆&#xff0c;即对于每个非叶子节点&#xff0c;它的值都大于或等于其子节点的值。排序&#xff1a;然后将堆顶元素…...

【STM32 Blue Pill编程】-外部中断配置及使用

外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...

MySQL 安装与配置教程:单机、主从复制与集群模式

目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;具有高性能、高可靠性和易用性等特点。它支持多种部署模式&#xff0c;包括单机模式、主从复制模式&#xff08;用于高…...

JavaEE 的相关知识点(一)

一、过滤器 过滤器&#xff08;Filter&#xff09;是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用&#xff0c;通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术&#xff0c;可以让请求达到目标servlet之…...

使用Python实现深度学习模型:智能医疗影像识别与诊断

介绍 智能医疗影像识别与诊断是现代医疗技术的重要应用,通过深度学习模型,可以自动分析和识别医疗影像,提高诊断的准确性和效率。本文将介绍如何使用Python和深度学习技术来实现智能医疗影像识别与诊断。 环境准备 首先,我们需要安装一些必要的Python库: pip install …...

24.给定一个链表,实现一个算法交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。

24. Swap Nodes in Pairs 题目 给定一个链表,交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。 Example: Given 1->2->3->4, you should return the list as 2->1->4->3....

Python 通过UDP传输超过64k的信息

Python 通过UDP传输超过64k的信息 在网络编程中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是一种常用的传输协议。与TCP不同&#xff0c;UDP是无连接的&#xff0c;并且不保证数据包的顺序、完整性及交付。尽管如此&#xff0c;UDP因其较低的延迟和开销而被广泛应…...

微服务设计原则——高性能:批量

能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作&#xff0c;那么这个接口设计就可能有问题。 比如获取数据的接口&#xff0c;如果仅仅提供getData(int id)接口&#xff0c;那么使用方如果要一次性获取 20 个数据&#xff0c;它就需要循环遍历调用…...

C:指针学习-指针变量—学习笔记

今日伊雷娜&#xff1a; 目录 前言&#xff1a; 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量&#xff1f; 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …...

【MySQL 07】表的增删查改 (带思维导图)

文章目录 &#x1f308; 一、insert 添加数据⭐ 1. 单行数据 全列插入⭐ 2. 多行数据 指定列插入⭐ 3. 插入否则更新⭐4. 插入否则替换 &#x1f308; 二、select 查询数据⭐ 1. select 列&#x1f319; 1.1 全列查询&#x1f319; 1.2 指定列查询&#x1f319; 1.3 查询字段…...

快速上手Git

Git相关概念 Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds在2005年创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。它是由 Linux 之父 Linus Torvalds 开发的&#xff0c;并已经成为了现代软件开发领域中最流行的版本控制系统之一。 git的工…...

RTC时钟测试

1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock&#xff0c;简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟&#xff0c;而硬件时钟则是主板上由电池供电的时钟&#xff0c;这个硬件时钟可以在BIO…...

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表&#xff0c;要求具备交互功能&#xff0c;以及进行自助分析的能力&#xff0c;…...

Android studio模拟制作-简易的订餐交易小案例

一、最终呈现效果 订餐支付小案例效果 二、布局设计activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…...

【Vue3】路由Params传参

【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…...

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限

CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件&#xff0c;同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾&#xff0c;快速释放磁盘内存&#xff0c;缓解卡顿现象&#xff0c;保障系统顺畅地运行。 全磁盘访问权限&#xff0c;就好比机场内进行的安全检查。…...

Ubuntu/18.04 LTS下编译 BoringSSL 库

1、准备一个 Ubuntu/18.04 LTS 系统的设备 2、安装软件 GIT、GCC、CMAKE、G、Golang:1.16 及以上版本 3、克隆仓库源 git clone https://boringssl.googlesource.com/boringssl cd boringssl 4、使用特定版本 git checkout 9fc1c33e9c21439ce5f87855a6591a9324e569fd 5、编…...

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…...

xss靶场详解

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边&#xff0c;innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的&#xff0c;这里是访问spaghet这个元素的&#xff0c;并通过括号里面的东西搜索当前…...

华为的流程管理

华为建设流程体系始于2000年&#xff0c;那时华为公司面临着快速扩张和全球化发展的挑战&#xff0c;意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势&#xff0c;华为决定启动流程体系的建设。在建设过程中&#xff0c;华为借鉴了业界最佳…...

操作系统Linux

1.Linux命令 ls&#xff1a;查看当前目录下所有目录和文件ps&#xff1a;查看所有正在运行的进程top&#xff1a;显示当前系统中占用资源最多的一些进程&#xff0c;shiftm按照内存查看大小netstat&#xff1a;查看端口的命令vi&#xff1a;查看文件的命令rm&#xff1a;删除文…...

1、.Net UI框架:MAUI - .Net宣传系列文章

.NET MAUI(Multi-platform App UI)是一个跨平台的UI框架&#xff0c;它是.NET统一应用模型的一部分&#xff0c;允许开发者使用C#和.NET来创建适用于iOS、Android、macOS和Windows的应用程序。MAUI继承了Xamarin.Forms的一些概念&#xff0c;但提供了更多的原生平台集成和改进的…...

Spring boot 使用 jSerialComm 对串口使用发送信息并接收

什么是 jSerialComm&#xff1f; jSerialComm 是一个 Java 库&#xff0c;旨在提供一种独立于平台的方式来访问标准串行端口&#xff0c;而无需外部库、本机代码或任何其他工具。它旨在替代 RxTx 和&#xff08;已弃用的&#xff09;Java Communications API&#xff0c;具有更…...

江协科技STM32学习笔记(第10章 SPI通信)

第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线&#xff1b; 串行外设接口&#xff1b; I2C无论是软件还是软件电路&#xff0c;设计的都还是比较复杂的&#xff0c;硬件…...

力扣热题100_回溯_22_括号生成

文章目录 题目链接解题思路解题代码 题目链接 22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()…...

【k8s】ubuntu24.04 containerd 手动从1.7.15 换为1.7.20

24.04的这个应该是apt 安装的1.7.20-1 root@k8s-master-pfsrv:~# sudo apt update && sudo apt install containerd.io -y 命中:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu noble InRelease 命中:2 https://dl.google.com/linux/chrome/deb stable InRelease…...

Java二十三种设计模式-备忘录模式(19/23)

本文深入探讨了备忘录模式&#xff0c;从定义、组成、实现到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;全面解析了如何在软件开发中有效地保存和恢复对象状态&#xff0c;以支持复杂的撤销操作和历史状态管理。 备忘录模式&#xff1a…...