当前位置: 首页 > 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…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...