【数学建模】《实战数学建模:例题与讲解》第十四讲-模拟退火、遗传算法(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十四讲-模拟退火、遗传算法(含Matlab代码)

    • 基本概念
      • 模拟退火(Simulated Annealing)
      • 遗传算法(Genetic Algorithms)
    • 习题14.1(1)
      • 1. 题目要求
      • 2.解题过程——模拟退火算法
      • 3.程序
      • 4.结果
    • 习题14.1(2)
      • 1. 题目要求
      • 2.解题过程——遗传算法
      • 3.程序
      • 4.结果
    • 习题14.2(1)
      • 1. 题目要求
      • 2.解题过程——模拟退火算法
      • 3.程序
      • 4.结果
    • 习题14.2(2)
      • 1. 题目要求
      • 2.解题过程
      • 3.程序——遗传算法
      • 4.结果

本系列侧重于例题实战与讲解,希望能够在例题中理解相应技巧。文章开头相关基础知识只是进行简单回顾,读者可以搭配课本或其他博客了解相应章节,然后进入本文正文例题实战,效果更佳。

如果这篇文章对你有帮助,欢迎点赞与收藏~
在这里插入图片描述

基本概念

现代优化算法,自20世纪80年代初开始流行,主要包括了一系列基于启发式原理的算法。这些算法,如禁忌搜索(Tabu Search)、模拟退火(Simulated Annealing)、遗传算法(Genetic Algorithms)和人工神经网络(Neural Networks),被广泛应用于解决各种实际应用问题。它们在理论研究和实际应用领域均取得了显著发展。

尽管这些算法的产生背景各异,它们共同的目标是寻找NP-hard问题的全局最优解。NP-hard问题的复杂性使得这些算法通常以启发式的方式寻找问题的实际解决方案。

启发式算法的范畴非常广泛,包括了针对复杂优化问题设计的蚁群算法(Ant Colony Algorithms)。某些启发式算法是针对特定实际问题而开发的,例如那些解决解空间分解、解空间限制等问题的算法。另外,还有一类算法是集成算法,它们结合了多种启发式算法的优点。

在解决组合优化问题方面,如旅行商问题(Traveling Salesman Problem, TSP)、二次分配问题(Quadratic Assignment Problem, QAP)和作业车间调度问题(Job-shop Scheduling Problem, JSP)等,现代优化算法表现出色。这些算法不仅在理论上有其独特之处,也在实际应用中展现了强大的效能。

模拟退火(Simulated Annealing)

模拟退火是一种概率型优化算法,其灵感来源于金属加热后再缓慢冷却的退火过程。在这个过程中,金属原子会随着温度的降低逐渐趋于稳定的状态,最终达到能量最低的结构。

工作原理:

  1. 算法开始时设定一个较高的“温度”,随着迭代过程逐步降低。
  2. 在每个温度下,算法通过随机选取解的邻域并计算其能量(或成本)来探索解空间。
  3. 如果邻域解的能量低于当前解,或者即便能量高但满足一定的概率条件(依赖于温度和能量差),算法也会接受这个新解。
  4. 随着温度的逐渐降低,接受劣质解的概率降低,算法趋于稳定。

遗传算法(Genetic Algorithms)

遗传算法是一种模拟生物进化过程的搜索启发式算法。它基于自然选择的原理,通过生物遗传机制中的交叉(crossover)、变异(mutation)和选择(selection)等操作进行优化。

工作原理:

  1. 算法初始化时生成一个包含多个候选解的种群。
  2. 每个解(通常称为个体)都有一个与之相关的适应度值,用于评估其优劣。
  3. 算法通过选择过程保留适应度高的个体,并通过交叉和变异操作生成新个体。
  4. 交叉操作模拟了染色体的交换,而变异则是对个体的随机调整。
  5. 经过多代的进化,种群中的个体逐渐趋于最优解。

习题14.1(1)

1. 题目要求

假设有12件物品,质量和价值如下表所示。包的最大允许质量是46公斤。

试使用模拟退火算法和遗传算法求解包中可装载物品的最大价值。

物品编号质量(公斤)价值(元)
125
2510
31813
434
523
6511
71013
8410
9118
10716
11147
1264

2.解题过程——模拟退火算法

解:

记12件物品的的质量和价值为 m i , v i , i = 1 , 2 , . . , 12 m_i,v_i,i=1,2,..,12 mi,vi,i=1,2,..,12 最大容量为 c n t = 46 cnt=46 cnt=46

(1)解空间

解空间可以写为:
S = { ( π 1 , π 2 , . . . , π 12 ) ∣ π i = 0 o r 1 , i = 1 , 2 , . . . , 12 } \mathbf{S}=\{(\pi_1,\pi_2,...,\pi_{12})|\pi_i=0\ or\ 1,i=1,2,...,12\} S={(π1,π2,...,π12)πi=0 or 1,i=1,2,...,12}
π i = 1 \pi_i=1 πi=1 时,表示选择第 i i i 个物品,否则表示不选。

(2)目标函数

目标函数为最终的物品价值。我们求价值最大值,首先通过转换求价值相反数的最小值,即:
min ⁡ f ( π 1 , π 2 , . . . , π 12 ) = − ∑ i = 1 12 v i π i \min f(\pi_1,\pi_2,...,\pi_{12})=-\sum_{i=1}^{12}v_i\pi_i minf(π1,π2,...,π12)=i=112viπi
一次迭代由下列三步产生。

(3)新解的产生

任选序号 u , v , 1 ≤ u ≤ v ≤ 12 u,v,1\leq u\leq v\leq12 u,v,1uv12 ,将 π u , π v \pi_u,\pi_v πu,πv取反,此时新的选取方法为:
π 1 . . . π u − 1 ( 1 − π u ) π u + 1 . . . π v − 1 ( 1 − π v ) π v + 1 . . . π 12 \pi_1...\pi_{u-1}(1-\pi_u)\pi_{u+1}...\pi_{v-1}(1-\pi_v)\pi_{v+1}...\pi_{12} π1...πu1(1πu)πu+1...πv1(1πv)πv+1...π12
计算此时的重量:
M = ∑ i = 1 12 m i π i M=\sum_{i=1}^{12}m_i\pi_i M=i=112miπi
M ≤ c n t M\leq cnt Mcnt 则新解有效,否则重新生成。

(4)代价函数差

路径差可以表示为:
Δ f = − ( 1 − π u ) v u − ( 1 − π v ) v v + π u v u + π v v v \Delta f=-(1-\pi_u)v_u-(1-\pi_v)v_v+\pi_uv_u+\pi_vv_v Δf=(1πu)vu(1πv)vv+πuvu+πvvv
(5)接受准则
P = { 1 , Δ f < 0 e − Δ f T , Δ f ≥ 0 \begin{align*} P=\begin{cases} 1,&\Delta f<0\\ e^{\frac{-\Delta f}{T}},&\Delta f \geq 0 \end{cases} \end{align*} P={1,eTΔf,Δf<0Δf0
(6)降温

选定降温系数 α = 0.999 \alpha=0.999 α=0.999 降温,取新温度 T = α T T=\alpha T T=αT ,初始温度 T = 1 T=1 T=1

(7)结束条件

选定终止温度 e = 1 0 − 30 e=10^{-30} e=1030 判断退火是否结束,当 T ≤ e T\leq e Te 时,结束模拟,输出当前状态。

3.程序

求解的MATLAB程序如下:

clc, clearmass = [2, 5, 18, 3, 2, 5, 10, 4, 11, 7, 14, 6]; % 物品质量
value = [5, 10, 13, 4, 3, 11, 13, 10, 8, 16, 7, 4]; % 物品价值
solution = zeros(1, length(mass)); % 初始化解
max_mass = 46; % 最大允许质量
min_temperature = 0.1^30;
iterations = 20000;
alpha = 0.999;
temperature = 1;for k = 1:iterationsold_value = -sum(solution.*value);temp_solution = solution;while 1item = 1 + floor(length(mass)*rand(1, 2));temp_solution(item) = ~temp_solution(item); % 改变选取物品的状态if sum(temp_solution.*mass) > max_mass % 如果超过背包最大允许质量,重新选取temp_solution = solution;continueelsebreakendendnew_value = -sum(temp_solution.*value);df = new_value - old_value;if df < 0 || exp(-df/temperature) >= rand % 接受新解solution = temp_solution;endtemperature = temperature * alpha; % 降温if temperature < min_temperaturebreakend
endsolution, total_mass = sum(solution.*mass), best_value = sum(solution.*value)

4.结果

image-20230524155333136

得到结果为:
π i = 1 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 \pi_i=1,1,0,0,1,1,1,1,1,1,0,0 πi=1,1,0,0,1,1,1,1,1,1,0,0
即选取第1,2,5,6,7,8,9,10件物品,总重量为46,价值为76。

习题14.1(2)

1. 题目要求

同上。

2.解题过程——遗传算法

解:

设定种群大小 M = 100 M=100 M=100 ,最大迭代次数 G = 30 G=30 G=30 ,交叉率 p c = 0.95 p_c=0.95 pc=0.95 ,变异率 p m = 0.15 p_m=0.15 pm=0.15

基因采取编码:
π 1 , π 2 , . . . , π 12 , π i = 0 o r 1 , i = 1 , 2 , . . , 12 \pi_1,\pi_2,...,\pi_{12},\pi_i=0\ or\ 1,i=1,2,..,12 π1,π2,...,π12,πi=0 or 1,i=1,2,..,12
使用改良圈算法产生 M M M 个可行解,转化为初始基因编码,目标函数为最终的物品价值即
max ⁡ f ( π 1 , π 2 , . . . , π 12 ) = ∑ i = 1 12 v i π i \max f(\pi_1,\pi_2,...,\pi_{12})=\sum_{i=1}^{12}v_i\pi_i maxf(π1,π2,...,π12)=i=112viπi
接下来每一次的迭代都以概率 p c , p m p_c,p_m pc,pm 进行基因重组和基因变异,最后选择目标函数值最大的 M M M 个个体进化到下一代。

3.程序

求解的MATLAB程序如下:

clc, clear% 输入数据
weights = [2, 5, 18, 3, 2, 5, 10, 4, 11, 7, 14, 6];
values = [5, 10, 13, 4, 3, 11, 13, 10, 8, 16, 7, 4];num_items = length(weights);
cross_rate = .95; % 交叉概率
mutation_rate = .15; % 变异概率
max_iter = 30; % 最大迭代次数
pop_size = 100; % 种群大小
max_capacity = 46; % 背包最大承重% 构建初始种群
population = init_population(pop_size, num_items, weights, max_capacity);% 初始化统计指标
avg_values = zeros(1, max_iter);
max_values = zeros(1, max_iter);% 迭代进化
for i = 1:max_iter% 交叉offspring_cross = crossover(population, cross_rate, weights, max_capacity);% 变异offspring_mutate = mutation(population, mutation_rate, weights, max_capacity);% 选择population = selection([population; offspring_cross; offspring_mutate], pop_size, values);% 统计当前迭代的平均价值和最大价值avg_values(i) = mean(sum(population*values', 2));max_values(i) = max(sum(population*values', 2));
end% 输出结果
best_solution = population(1, :)
best_value = sum(best_solution*values')
best_mass = sum(best_solution*weights')% ************************* 以下为函数实现 *************************
% 初始化种群函数
function population = init_population(pop_size, num_items, weights, max_capacity)
population = zeros(pop_size, num_items);
for i = 1:pop_sizechromosome = round(rand(1, num_items));while sum(chromosome.*weights) > max_capacitychromosome = round(rand(1, num_items));endpopulation(i, :) = chromosome;
end
end% 交叉函数
function offspring = crossover(population, cross_rate, weights, max_capacity)
offspring = population;
num_individuals = size(population, 1);
for i = 1:2:num_individualsif rand < cross_ratecross_point = ceil(rand * size(population, 2));temp1 = offspring(i, :);temp2 = offspring(i+1, :);temp1(cross_point) = temp2(cross_point);temp2(cross_point) = offspring(i, cross_point);if (temp1 * weights' <= max_capacity) && (temp2 * weights' <= max_capacity)offspring(i, :) = temp1;offspring(i+1, :) = temp2;endend
end
end% 变异函数
function offspring = mutation(population, mutation_rate, weights, max_capacity)
offspring = population;
for i = 1:size(population, 1)if rand < mutation_ratemutate_point = ceil(rand * size(population, 2));temp = offspring(i, :);temp(mutate_point) = ~temp(mutate_point);if sum(temp.*weights) <= max_capacityoffspring(i, :) = temp;endend
end
end% 选择函数
function new_population = selection(population, pop_size, values)
fitness_values = sum(population*values', 2);
[~, sorted_indices] = sort(fitness_values, 'descend');
new_population = population(sorted_indices(1:pop_size), :);
end

4.结果

image-20230524153007945

得到结果为:
π i = 1 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 \pi_i=1,1,0,0,1,1,1,1,1,1,0,0 πi=1,1,0,0,1,1,1,1,1,1,0,0
即选取第1,2,5,6,7,8,9,10件物品,总重量为46,价值为76。

习题14.2(1)

1. 题目要求

假设有一个旅行商人要拜访全国 31 个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。

全国 31 个省会城市的坐标如下表所示。

试使用模拟退火算法和遗传算寻找最短路径。

城市编号坐标(X)坐标(Y)
113042312
236391315
341772244
437121399
534881535
633261556
732381229
841961004
94312790
104386570
1130071970
1225621756
1327881491
1423811676
151332695
1637151678
1739182179
1840612370
1937802212
2036762578
2140292838
2242632931
2334291908
2435072367
2533942643
2634393201
2729353240
2831403550
2925452357
3027782826
3123702975

2.解题过程——模拟退火算法

解:

设城市 i , j i,j i,j 之间的距离 d i j = ( x i − x j ) 2 + ( y i − y j ) 2 d_{ij}=\sqrt{(x_i-x_j)^2+(y_i-y_j)^2} dij=(xixj)2+(yiyj)2

(1)解空间

解空间可以表示为:
KaTeX parse error: Undefined control sequence: \mbox at position 68: …2,...,\pi_{31})\̲m̲b̲o̲x̲{为}\{1,2,...,31…
特别的,规定 π 0 = π 31 , π 32 = π 1 \pi_0=\pi_{31},\pi_{32}=\pi_1 π0=π31,π32=π1

初始解可以选择为 ( 1 , 2 , . . . , 31 ) (1,2,...,31) (1,2,...,31)

(2)目标函数

目标函数为路径长度:
min ⁡ f ( π 1 , π 2 , . . . , π 31 ) = ∑ i = 1 31 d π i π i + 1 \min f(\pi_1,\pi_2,...,\pi_{31})=\sum_{i=1}^{31}d_{\pi_i\pi_{i+1}} minf(π1,π2,...,π31)=i=131dπiπi+1
一次迭代由下列三步产生.

(3)新解的产生

任选序 u , v , 1 ≤ u ≤ v ≤ 31 u,v,1\leq u\leq v\leq 31 u,v,1uv31 ,交换 u , v u,v u,v 之间的顺序交换,此时新路径为:
π 1 . . . π u − 1 π u π u + 1 . . . π v − 1 π v π v + 1 . . . π 31 \pi_1...\pi_{u-1}\pi_u\pi_{u+1}...\pi_{v-1}\pi_v\pi_{v+1}...\pi_{31} π1...πu1πuπu+1...πv1πvπv+1...π31
(4)代价函数差
Δ f = d π u − 1 π v + d π u π v + 1 − d π u − 1 π u − d π v π v + 1 \Delta f=d_{\pi_{u-1}\pi_v}+d_{\pi_{u}\pi_{v+1}}-d_{\pi_{u-1}\pi_{u}}-d_{\pi_{v}\pi_{v+1}} Δf=dπu1πv+dπuπv+1dπu1πudπvπv+1
(5)接受准则
P = { 1 , Δ f < 0 e − Δ f T , Δ f ≥ 0 \begin{align*} P=\begin{cases} 1,&\Delta f<0\\ e^{\frac{-\Delta f}{T}},&\Delta f \geq 0 \end{cases} \end{align*} P={1,eTΔf,Δf<0Δf0
(6)降温

选定降温系数 α = 0.9999 \alpha=0.9999 α=0.9999 降温,取新温度 T = α T T=\alpha T T=αT ,初始温度 T = 100 T=100 T=100.

(7)结束条件

选定终止温度 e = 1 0 − 30 e=10^{-30} e=1030 ,当 T ≤ e T\leq e Te时,结束模拟。

3.程序

求解的MATLAB程序如下:

clc, clear% 城市坐标
city_coordinates = [1304, 2312; 3639, 1315; 4177, 2244; 3712, 1399; 3488, 1535; 3326, 1556; ...3238, 1229; 4196, 1004; 4312, 790; 4386, 570; 3007, 1970; 2562, 1756; ...2788, 1491; 2381, 1676; 1332, 695; 3715, 1678; 3918, 2179; 4061, 2370; ...3780, 2212; 3676, 2578; 4029, 2838; 4263, 2931; 3429, 1908; 3507, 2367; ...3394, 2643; 3439, 3201; 2935, 3240; 3140, 3550; 2545, 2357; 2778, 2826; ...2370, 2975];num_cities = size(city_coordinates, 1);% 初始化路径
path = 1:num_cities;% 计算距离矩阵
distances = pdist2(city_coordinates, city_coordinates);% 初始化总距离
total_distance = sum(distances(sub2ind(size(distances), path, [path(2:end), path(1)])));% 设置退火参数
initial_temperature = 100;
alpha = 0.9999;
final_temperature = 0.1^30;temperature = initial_temperature;while temperature > final_temperature% 随机选择两个城市cities_to_swap = sort(randperm(num_cities, 2));% 生成新路径new_path = path;new_path(cities_to_swap(1):cities_to_swap(2)) = new_path(cities_to_swap(2):-1:cities_to_swap(1));% 计算新距离new_distance = sum(distances(sub2ind(size(distances), new_path, [new_path(2:end), new_path(1)])));% 判断是否接受新解if new_distance < total_distance || rand < exp((total_distance - new_distance) / temperature)path = new_path;total_distance = new_distance;end% 降温temperature = temperature * alpha;
end% 输出结果
disp('Optimal path:');
disp(path);
disp('Total distance:');
disp(total_distance);% 绘制图像
plot(city_coordinates([path, path(1)], 1), city_coordinates([path, path(1)], 2), '-o');

4.结果

image-20230524163331639

image-20230524163405197

最终得到的结果如图,路径长度 D = 15437 D=15437 D=15437

习题14.2(2)

1. 题目要求

同上。

2.解题过程

解:

设定种群大小 M = 100 M=100 M=100 ,最大迭代次数 G = 100 G=100 G=100

交叉率 p c = 1 p_c=1 pc=1

变异率 p m = 0.15 p_m=0.15 pm=0.15

基因编码用随机数列 ω 1 ω 2 . . . ω 31 , 0 ≤ ω i ≤ 1 \omega_1\omega_2...\omega_{31},0\leq\omega_i\leq1 ω1ω2...ω31,0ωi1 其中 ω i \omega_i ωi 在整个序列中的升序排序位置为城市 i i i 所在的位置。

使用改良圈算法产生 M M M个可行解,转化为初始基因编码,目标函数为最终的物品价值即:
max ⁡ f ( π 1 , π 2 , . . . , π 12 ) = ∑ i = 1 12 v i π i \max f(\pi_1,\pi_2,...,\pi_{12})=\sum_{i=1}^{12}v_i\pi_i maxf(π1,π2,...,π12)=i=112viπi
接下来每一次的迭代都以概率 p c , p m p_c,p_m pc,pm 进行基因重组和基因变异,最后选择目标函数值最大的 M M M 个个体进化到下一代。

3.程序——遗传算法

求解的MATLAB程序如下:

clc, cleardistanceMatrix = zeros(31);
optimalPath = zeros(1, 31);
coordinates = [1304, 2312; 3639, 1315; 4177, 2244; 3712, 1399; 3488, 1535; 3326, 1556; ...3238, 1229; 4196, 1004; 4312, 790; 4386, 570; 3007, 1970; 2562, 1756; ...2788, 1491; 2381, 1676; 1332, 695; 3715, 1678; 3918, 2179; 4061, 2370; ...3780, 2212; 3676, 2578; 4029, 2838; 4263, 2931; 3429, 1908; 3507, 2367; ...3394, 2643; 3439, 3201; 2935, 3240; 3140, 3550; 2545, 2357; 2778, 2826; ...2370, 2975];for i = 1:31optimalPath(i) = i;for j = 1:31distanceMatrix(i, j) = sqrt((coordinates(i, 1) - coordinates(j, 1))^2+(coordinates(i, 2) - coordinates(j, 2))^2);end
enddistance = 0;
for i = 1:30distance = distance + distanceMatrix(optimalPath(i), optimalPath(i+1));
enddistance = distance + distanceMatrix(optimalPath(1), optimalPath(31));
w = 100;
g = 100; 
rand('state', sum(clock)); % 初始化随机数发生器for k = 1:w  % 通过改良圈算法选取初始种群c1 = randperm(31);  % 产生1,..,31的一个全排列for t = 1:100  % 该层循环是修改圈flag = 0;  % 修改圈退出标志for m = 1:31for n = m + 1:31m1 = m - 1;n1 = n + 1;if m == 1 && n == 31continueendif m1 == 0m1 = 31;endif n1 == 32n1 = 1;endif distanceMatrix(c1(m1), c1(n)) + distanceMatrix(c1(m), c1(n1)) < ...distanceMatrix(c1(m), c1(m1)) + distanceMatrix(c1(n), c1(n1))c1 = [c1(1:m-1), c1(n:-1:m), c1(n+1:31)];flag = 1; % 修改圈endendendif flag == 0chromosomeMatrix(k, c1) = 1:31;break % 记录下较好的解并退出当前层循环endend
endchromosomeMatrix(:, 1) = 0;
chromosomeMatrix = chromosomeMatrix / 31; % 把整数序列转换成[0,1]区间上的实数,即转换成染色体编码
for k = 1:g % 该层循环进行遗传算法的操作childPopulation = chromosomeMatrix; % 交配产生子代 A 的初始染色体c = randperm(w); % 产生下面交叉操作的染色体对for i = 1:2:wF = 1 + floor(31*rand(1)); % 产生交叉操作的地址temp = childPopulation(c(i), [F:31]); % 中间变量的保存值childPopulation(c(i), [F:31]) = childPopulation(c(i+1), [F:31]); % 交叉操作childPopulation(c(i+1), F:31) = temp;endby = []; % 为了防止下面产生空地址,这里先初始化while ~length(by)by = find(rand(1, w) < 0.15); % 产生变异操作的地址endmutationList = childPopulation(by, :); % 产生变异操作的初始染色体for j = 1:length(by)bw = sort(1+floor(31*rand(1, 3))); % 产生变异操作的3个地址mutationList(j, :) = mutationList(j, [1:bw(1) - 1, bw(2) + 1:bw(3), bw(1):bw(2), bw(3) + 1:31]); % 交换位置endG = [chromosomeMatrix; childPopulation; mutationList];  % 父代和子代种群合在一起[SG, indl] = sort(G, 2);populationSize = size(G, 1);pathLengths = zeros(1, populationSize);  % 路径长度的初始值for j = 1:populationSizefor i = 1:31if i == 31pathLengths(j) = pathLengths(j) + distanceMatrix(indl(j, i), indl(j, 1));elsepathLengths(j) = pathLengths(j) + distanceMatrix(indl(j, i), indl(j, i+1)); % 计算每条路径长度endendend[slong, ind2] = sort(pathLengths); % 对路径长度从小到大排序chromosomeMatrix = G(ind2(1:w), :); % 精选前 w 个较短的路径对应的染色体
end
optimalPath = indl(ind2(1), :), optimalPathLength = slong(1)
plot([coordinates(optimalPath, 1); coordinates(optimalPath(1), 1)], [coordinates(optimalPath, 2); coordinates(optimalPath(1), 2)], '- o')

4.结果

image-20230524201724742

最终得到的结果如图,路径长度 D = 15437 D=15437 D=15437

如果这篇文章对你有帮助,欢迎点赞与收藏~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STL容器】详解vector的使用和模拟实现

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; STL函数专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一…

LeetCode刷题--- 全排列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 【 http://t.csdnimg.cn/yUl2I 】 【C】 【 http://t.csdnimg.cn/6AbpV 】 数据结构与算法 【 http://t.csdnimg.cn/hKh2l 】 前言&…

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

openEuler商业化进展可观:累计装机量超610万套,市场持续扩容

12月15日至16日&#xff0c;以“崛起数字时代&#xff0c;引领数智未来”为主题的操作系统大会&#xff06;openEuler Summit 2023在北京国家会议中心举办。大会旨在汇聚全球产业界创新力量&#xff0c;构筑坚实的基础软件根基&#xff0c;推动基础软件技术持续创新&#xff0c…

喝葡萄酒时观酒闻香尝味究竟有什么用?

对许多人来说&#xff0c;在品尝葡萄酒时能发现大多数人闻不到的香气和尝不到的味道似乎是一种神奇的能力。其他人则认为这是学究式葡萄酒爱好者过于活跃的想象&#xff0c;或者是保持葡萄酒鉴赏精英声誉的一种方式&#xff0c;但两者都不是。 部分是艺术&#xff0c;部分是科…

巨杉数据库入选“2023信创独角兽企业100强”

近日&#xff0c;《互联网周刊》、eNet研究院、德本咨询联合发布了“2023信创独角兽企业100强”榜单&#xff0c;巨杉数据库凭借卓越的技术实力和出色的研发能力荣登榜单&#xff0c;本次上榜既是对巨杉数据库长期深耕信创领域的高度认可&#xff0c;也是对其在分布式文档型数据…

【问题解决】Buildroot文件系统dropbear 上位机scp命令Permission denied, please try again.

前提&#xff1a; 上位机&#xff1a;Ubuntu虚拟机与开发板同局域网开发板&#xff1a;Buildroot文件系统&#xff0c;开启了dropbear&#xff0c;已经联网与虚拟机同局域网 liefyuanubuntu:~/tcp-test/tcp-c-client$ scp tcp_client root192.168.8.199:/opt root192.168.8.1…

break用法

break他是用于从循环语句中跳出一层循环体的&#xff0c;提前结束循环 但是值得注意的点事break只能用在循环语句和switch当中 那么我们上代码进行具体的理解&#xff1a; 如果圆的面积大于100就会终止循环&#xff0c;那么如何体现出他只能终结一个循环呢&#xff0c;请看下…

软考、PMP 区别

软考 考试时间&#xff1a;一年两次&#xff0c;报名3月&#xff0c;8月&#xff1b;对应考试&#xff1a;5月最后一个周末&#xff0c;11月第一个周末 报名费&#xff1a;50-200元&#xff0c;每个城市不同北京57每科 报名网站&#xff1a;中国计算机技术职业资格网 考试等…

基于SSM的中文学习系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的中文学习系统(有报告)。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis JspMave…

Dagger2基本使用3之其他使用

一&#xff0c;Dagger容器中添加不是Dagger创建的实力对象 在实际使用中&#xff0c;有些类的已经创建好了&#xff0c;dagger需要使用这些类&#xff0c;就需要通过参数传入&#xff0c;下面是android中传入application实例的一个例子 1&#xff0c;创建module //创建需要传…

关于技术架构的思考

技术选型实则是取舍的艺术 这句话是我偶然在一篇技术架构方面的文章上看到的&#xff0c;每当我需要给新项目进行技术选型&#xff0c;决定技术架构时&#xff0c;一直坚信的。 当我们做技术选型时&#xff0c;需要考虑的东西非常多。比如&#xff0c;用关系型数据库还是非关…