PAES算法求解 ZDT1 双目标优化问题

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

内容由AI辅助生成,仅经笔者审核整理,请甄别食用。

文章目录

  • 前言
  • matlab代码
  • 代码简析
      • 一、核心数学公式与算法逻辑
      • 二、代码模块与公式对应解析
        • 1. ZDT1目标函数(数学定义与实现)
        • 2. 高斯变异(探索新解的数学逻辑)
        • 3. 支配关系判断(多目标优化的核心逻辑)
        • 4. 网格拥挤度(维护解分布性的工具)
        • 5. 存档维护(保留优质解的逻辑)
        • 6. 主循环(算法流程的串联)
      • 三、算法流程总结
      • 四、关键可视化与指标


matlab代码

function PAES_ZDT1_Complete()% PAES算法求解ZDT1问题 - 完整实现% Pareto Archived Evolution Strategy for ZDT1 Problemclc; clear; close all;fprintf('=== PAES算法求解ZDT1问题 ===\n');fprintf('开始优化...\n\n');% ==================== 算法参数设置 ====================params.max_iterations = 3*10000;    % 最大迭代次数params.archive_size = 100;        % 档案最大容量params.grid_divisions = 10;       % 网格划分数params.mutation_rate = 0.1;       % 变异率params.dimension = 30;            % 决策变量维数params.num_objectives = 2;        % 目标函数数量% ==================== 初始化 ====================% 随机生成初始解current_solution = rand(1, params.dimension);  % ZDT1变量范围[0,1]archive = current_solution;% 计算初始解的目标函数值current_obj = ZDT1_objective(current_solution);archive_obj = current_obj;% ==================== 主优化循环 ====================tic;for iter = 1:params.max_iterations% 1. 变异产生候选解candidate = mutate(current_solution, params.mutation_rate);candidate_obj = ZDT1_objective(candidate);% 2. 评估候选解[accept_candidate, new_current, archive, archive_obj] = ...evaluate_candidate(current_solution, current_obj, ...candidate, candidate_obj, ...archive, archive_obj, params);% 3. 更新当前解if accept_candidatecurrent_solution = new_current;current_obj = ZDT1_objective(current_solution);end% 4. 维护档案大小if size(archive, 1) > params.archive_size[archive, archive_obj] = maintain_archive(archive, archive_obj, params);end% 5. 显示进度if mod(iter, 2000) == 0fprintf('迭代 %d/%d: 档案大小 = %d\n', iter, params.max_iterations, size(archive, 1));endendelapsed_time = toc;% ==================== 结果输出和可视化 ====================fprintf('\n=== 优化完成 ===\n');fprintf('总耗时: %.2f秒\n', elapsed_time);fprintf('最终档案大小: %d\n', size(archive, 1));fprintf('f1范围: [%.4f, %.4f]\n', min(archive_obj(:, 1)), max(archive_obj(:, 1)));fprintf('f2范围: [%.4f, %.4f]\n', min(archive_obj(:, 2)), max(archive_obj(:, 2)));% 绘制结果plot_results(archive_obj);% ==================== 嵌套函数定义 ====================function objectives = ZDT1_objective(x)% ZDT1测试函数% f1(x) = x1% f2(x) = g(x) * h(f1, g)% g(x) = 1 + 9/(n-1) * sum(xi, i=2 to n)% h(f1, g) = 1 - sqrt(f1/g)n = length(x);% 第一个目标函数f1 = x(1);% 辅助函数gif n > 1g = 1 + 9 * sum(x(2:end)) / (n - 1);elseg = 1;end% 第二个目标函数h = 1 - sqrt(f1 / g);f2 = g * h;objectives = [f1, f2];endfunction mutated_solution = mutate(solution, mutation_rate)% 高斯变异操作mutated_solution = solution + mutation_rate * randn(size(solution));% 边界处理 - 确保变量在[0,1]范围内mutated_solution = max(0, min(1, mutated_solution));endfunction result = dominates(obj1, obj2)% 判断obj1是否支配obj2 (最小化问题)% 支配条件:obj1在所有目标上不劣于obj2,且至少在一个目标上严格优于obj2all_better_or_equal = all(obj1 <= obj2);at_least_one_better = any(obj1 < obj2);result = all_better_or_equal && at_least_one_better;endfunction grid_coords = calculate_grid_coordinates(objectives, archive_obj, grid_divisions)% 计算解在自适应网格中的坐标if size(archive_obj, 1) == 1grid_coords = zeros(1, length(objectives));return;end% 计算目标空间的边界min_obj = min(archive_obj, [], 1);max_obj = max(archive_obj, [], 1);% 避免除零错误range_obj = max_obj - min_obj;range_obj(range_obj == 0) = 1;% 计算归一化坐标normalized = (objectives - min_obj) ./ range_obj;% 计算网格坐标grid_coords = floor(normalized * grid_divisions);% 确保坐标在有效范围内grid_coords = max(0, min(grid_divisions - 1, grid_coords));endfunction crowding = calculate_crowding(grid_coords, archive_obj, grid_divisions)% 计算指定网格的拥挤度(该网格中解的数量)if size(archive_obj, 1) <= 1crowding = 1;return;end% 计算档案中所有解的网格坐标crowding = 0;for i = 1:size(archive_obj, 1)current_grid = calculate_grid_coordinates(archive_obj(i, :), archive_obj, grid_divisions);if isequal(current_grid, grid_coords)crowding = crowding + 1;endendendfunction [accept, new_current, new_archive, new_archive_obj] = ...evaluate_candidate(current, current_obj, candidate, candidate_obj, archive, archive_obj, params)% 根据PAES规则评估候选解是否被接受accept = false;new_current = current;new_archive = archive;new_archive_obj = archive_obj;% 情况1: 候选解支配当前解if dominates(candidate_obj, current_obj)accept = true;new_current = candidate;% 将候选解添加到档案new_archive = [new_archive; candidate];new_archive_obj = [new_archive_obj; candidate_obj];return;end% 情况2: 当前解支配候选解if dominates(current_obj, candidate_obj)return;  % 拒绝候选解end% 情况3: 两解互不支配,需要进一步判断% 3.1 检查候选解是否被档案中的解支配for i = 1:size(archive_obj, 1)if dominates(archive_obj(i, :), candidate_obj)return;  % 被档案中的解支配,拒绝endend% 3.2 检查候选解是否支配档案中的解dominated_indices = [];for i = 1:size(archive_obj, 1)if dominates(candidate_obj, archive_obj(i, :))dominated_indices = [dominated_indices, i];endend% 如果候选解支配档案中的某些解if ~isempty(dominated_indices)accept = true;new_current = candidate;% 从档案中移除被支配的解keep_indices = setdiff(1:size(archive, 1), dominated_indices);new_archive = new_archive(keep_indices, :);new_archive_obj = new_archive_obj(keep_indices, :);% 添加候选解到档案new_archive = [new_archive; candidate];new_archive_obj = [new_archive_obj; candidate_obj];return;end% 3.3 候选解与档案中所有解互不支配if size(archive, 1) < params.archive_size% 档案未满,直接接受accept = true;new_current = candidate;new_archive = [new_archive; candidate];new_archive_obj = [new_archive_obj; candidate_obj];else% 档案已满,根据拥挤度判断candidate_grid = calculate_grid_coordinates(candidate_obj, [archive_obj; candidate_obj], params.grid_divisions);current_grid = calculate_grid_coordinates(current_obj, [archive_obj; candidate_obj], params.grid_divisions);candidate_crowding = calculate_crowding(candidate_grid, [archive_obj; candidate_obj], params.grid_divisions);current_crowding = calculate_crowding(current_grid, [archive_obj; candidate_obj], params.grid_divisions);% 如果候选解所在网格的拥挤度更小,则接受if candidate_crowding < current_crowdingaccept = true;new_current = candidate;new_archive = [new_archive; candidate];new_archive_obj = [new_archive_obj; candidate_obj];endendendfunction [new_archive, new_archive_obj] = maintain_archive(archive, archive_obj, params)% 当档案超过容量限制时,移除拥挤度最高的解while size(archive, 1) > params.archive_size% 计算所有解的拥挤度crowding_values = zeros(size(archive, 1), 1);for i = 1:size(archive, 1)grid_coords = calculate_grid_coordinates(archive_obj(i, :), archive_obj, params.grid_divisions);crowding_values(i) = calculate_crowding(grid_coords, archive_obj, params.grid_divisions);end% 找到拥挤度最高的解的索引[~, max_crowding_indices] = max(crowding_values);% 如果有多个解具有相同的最高拥挤度,随机选择一个if length(max_crowding_indices) > 1remove_idx = max_crowding_indices(randi(length(max_crowding_indices)));elseremove_idx = max_crowding_indices(1);end% 移除选中的解archive(remove_idx, :) = [];archive_obj(remove_idx, :) = [];endnew_archive = archive;new_archive_obj = archive_obj;endfunction plot_results(archive_obj)% 绘制优化结果对比图figure('Position', [100, 100, 800, 600]);% 绘制PAES找到的解scatter(archive_obj(:, 1), archive_obj(:, 2), 60, 'ro', 'filled', 'MarkerEdgeColor', 'k');hold on;% 绘制ZDT1的真实Pareto前沿f1_true = linspace(0, 1, 1000);f2_true = 1 - sqrt(f1_true);plot(f1_true, f2_true, 'b-', 'LineWidth', 2.5);% 图形美化xlabel('f_1', 'FontSize', 14, 'FontWeight', 'bold');ylabel('f_2', 'FontSize', 14, 'FontWeight', 'bold');title('PAES算法求解ZDT1问题结果对比', 'FontSize', 16, 'FontWeight', 'bold');legend({'PAES找到的解', '真实Pareto前沿'}, 'FontSize', 12, 'Location', 'northeast');grid on;grid minor;% 设置坐标轴xlim([0, 1]);ylim([0, 1]);% 添加文本信息text(0.05, 0.95, sprintf('解的数量: %d', size(archive_obj, 1)), ...'FontSize', 12, 'BackgroundColor', 'white', 'EdgeColor', 'black');% 计算并显示一些性能指标fprintf('\n=== 性能分析 ===\n');% 计算分布均匀性(相邻解之间的平均距离)if size(archive_obj, 1) > 1[~, sort_idx] = sort(archive_obj(:, 1));sorted_obj = archive_obj(sort_idx, :);distances = sqrt(sum(diff(sorted_obj).^2, 2));avg_distance = mean(distances);std_distance = std(distances);fprintf('解的平均间距: %.4f\n', avg_distance);fprintf('间距标准差: %.4f\n', std_distance);end% 计算收敛性(与真实前沿的平均距离)min_distances = zeros(size(archive_obj, 1), 1);for i = 1:size(archive_obj, 1)f1_current = archive_obj(i, 1);f2_true_at_f1 = 1 - sqrt(f1_current);min_distances(i) = abs(archive_obj(i, 2) - f2_true_at_f1);endavg_convergence = mean(min_distances);fprintf('与真实前沿的平均距离: %.6f\n', avg_convergence);fprintf('\n算法运行完成!\n');endend

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

代码简析

相关引用:PAES (Pareto Archived Evolution Strategy)优化方法简介

以下结合数学公式和代码逻辑,对PAES求解ZDT1问题的完整实现进行拆解讲解,帮助理解算法如何通过“变异-评估-存档维护”流程逼近帕累托前沿。

一、核心数学公式与算法逻辑

PAES(Pareto Archived Evolution Strategy)的核心是通过高斯变异探索解空间用存档(archive)维护非支配解,并基于“支配关系”和“网格拥挤度”筛选解,最终逼近ZDT1的真实帕累托前沿f2=1−f1f_2 = 1 - \sqrt{f_1}f2=1f1

二、代码模块与公式对应解析

1. ZDT1目标函数(数学定义与实现)

ZDT1 双目标优化问题简介

ZDT1的两个目标函数:
f1(x)=x1(第一个目标,直接取第一个决策变量)g(x)=1+9⋅∑i=230xi29(辅助函数,平衡多变量影响)f2(x)=g(x)⋅(1−f1(x)g(x))(第二个目标,与f1和g相关)\begin{align*} f_1(x) &= x_1 \quad \text{(第一个目标,直接取第一个决策变量)} \\ g(x) &= 1 + 9 \cdot \frac{\sum_{i=2}^{30} x_i}{29} \quad \text{(辅助函数,平衡多变量影响)} \\ f_2(x) &= g(x) \cdot \left(1 - \sqrt{\frac{f_1(x)}{g(x)}}\right) \quad \text{(第二个目标,与} f_1 \text{和} g \text{相关)} \end{align*} f1(x)g(x)f2(x)=x1(第一个目标,直接取第一个决策变量)=1+929i=230xi(辅助函数,平衡多变量影响)=g(x)(1g(x)f1(x))(第二个目标,与f1g相关)

代码实现(嵌套函数 ZDT1_objective):

function objectives = ZDT1_objective(x)f1 = x(1);  % 直接取第一个变量g = 1 + 9 * sum(x(2:end))/(length(x)-1);  % 计算g(x)f2 = g * (1 - sqrt(f1/g));  % 计算第二个目标objectives = [f1, f2];  % 输出目标向量
end
2. 高斯变异(探索新解的数学逻辑)

PAES通过高斯变异生成候选解,公式:
xi′=xi+mutation_rate⋅N(0,1)x_i' = x_i + \text{mutation\_rate} \cdot \mathcal{N}(0, 1) xi=xi+mutation_rateN(0,1)
其中N(0,1)\mathcal{N}(0, 1)N(0,1)是标准正态分布随机数,mutation_rate 控制变异幅度(代码中设为 0.1)。

代码实现(嵌套函数 mutate):

function mutated_solution = mutate(solution, mutation_rate)% 高斯变异:给原解加正态分布噪声mutated_solution = solution + mutation_rate * randn(size(solution));  mutated_solution = max(0, min(1, mutated_solution));  % 边界截断(保证在[0,1])
end
3. 支配关系判断(多目标优化的核心逻辑)

Pareto 最优解(Pareto Optimal Solution)简介

若解AAA所有目标上不差于BBB,且至少一个目标严格优于BBB,则称AAA支配BBB,公式:
dominates(A,B)=(∀i,Ai≤Bi)∧(∃j,Aj<Bj)\text{dominates}(A, B) = \left( \forall i, A_i \leq B_i \right) \land \left( \exists j, A_j < B_j \right) dominates(A,B)=(i,AiBi)(j,Aj<Bj)

代码实现(嵌套函数 dominates):

function result = dominates(obj1, obj2)all_better_or_equal = all(obj1 <= obj2);  % 所有目标不差at_least_one_better = any(obj1 < obj2);    % 至少一个目标更优result = all_better_or_equal && at_least_one_better;  % 同时满足则支配
end
4. 网格拥挤度(维护解分布性的工具)

为避免解过度集中,PAES用网格划分量化拥挤度:

  1. 计算目标空间边界:min⁡_obj=min⁡(archive_obj,[],1)\min\_obj = \min(\text{archive\_obj}, [], 1)min_obj=min(archive_obj,[],1)max⁡_obj=max⁡(archive_obj,[],1)\max\_obj = \max(\text{archive\_obj}, [], 1)max_obj=max(archive_obj,[],1)
  2. 归一化目标值:normalized=objectives−min⁡_objmax⁡_obj−min⁡_obj\text{normalized} = \frac{\text{objectives} - \min\_obj}{\max\_obj - \min\_obj}normalized=max_objmin_objobjectivesmin_obj(避免除零,若范围为0则设为1)
  3. 计算网格坐标:grid_coords=⌊normalized⋅grid_divisions⌋\text{grid\_coords} = \lfloor \text{normalized} \cdot \text{grid\_divisions} \rfloorgrid_coords=normalizedgrid_divisions
  4. 拥挤度定义:同一网格内的解数量,数量越多则拥挤度越高。

代码实现(嵌套函数 calculate_crowding):

function crowding = calculate_crowding(grid_coords, archive_obj, grid_divisions)crowding = 0;for i = 1:size(archive_obj, 1)current_grid = calculate_grid_coordinates(archive_obj(i, :), archive_obj, grid_divisions);if isequal(current_grid, grid_coords)crowding = crowding + 1;  % 统计同网格解数量endend
end
5. 存档维护(保留优质解的逻辑)

外部存档(External Archive)机制

  • 添加解:若候选解不被支配,且存档未满则直接加入;若存档已满,比较“候选解所在网格”与“当前解所在网格”的拥挤度,拥挤度高的网格移除解。
  • 移除解:当存档超过容量(archive_size),持续移除“拥挤度最高网格”中的解,直到容量达标。

代码实现(嵌套函数 maintain_archive):

function [new_archive, new_archive_obj] = maintain_archive(archive, archive_obj, params)while size(archive, 1) > params.archive_size% 计算所有解的拥挤度crowding_values = zeros(size(archive, 1), 1);for i = 1:size(archive, 1)grid_coords = calculate_grid_coordinates(archive_obj(i, :), archive_obj, params.grid_divisions);crowding_values(i) = calculate_crowding(grid_coords, archive_obj, params.grid_divisions);end% 移除拥挤度最高的解(随机选一个拥挤度最高的)[~, max_crowding_indices] = max(crowding_values);remove_idx = max_crowding_indices(randi(length(max_crowding_indices)));archive(remove_idx, :) = [];  % 移除解archive_obj(remove_idx, :) = [];  % 移除对应目标值endnew_archive = archive;new_archive_obj = archive_obj;
end
6. 主循环(算法流程的串联)

PAES通过“变异→评估→更新→维护存档”的循环迭代优化:

for iter = 1:params.max_iterations% 1. 变异产生候选解candidate = mutate(current_solution, params.mutation_rate);candidate_obj = ZDT1_objective(candidate);% 2. 评估候选解(支配关系+存档规则)[accept_candidate, new_current, archive, archive_obj] = evaluate_candidate(...);% 3. 更新当前解if accept_candidatecurrent_solution = new_current;current_obj = ZDT1_objective(current_solution);end% 4. 维护存档大小if size(archive, 1) > params.archive_size[archive, archive_obj] = maintain_archive(archive, archive_obj, params);end
end

三、算法流程总结

PAES通过以下步骤求解ZDT1:

  1. 初始化:随机生成初始解,计算目标值并初始化存档。
  2. 变异:用高斯变异生成候选解,探索新的解空间。
  3. 评估:基于支配关系判断是否接受候选解,若接受则更新当前解和存档。
  4. 维护存档:通过网格拥挤度移除冗余解,保证存档解分布均匀。
  5. 循环迭代:重复“变异-评估-维护”,直到达到最大迭代次数。

四、关键可视化与指标

  1. 真实帕累托前沿f2_true = 1 - sqrt(f1_true),代码中用蓝色线绘制。
  2. 算法找到的解:存档中的非支配解,用红色点绘制,分布越接近蓝色线且均匀,说明算法性能越好。
  3. 性能指标
    • 平均间距:排序后相邻解的平均欧氏距离,反映分布均匀性。
    • 与真实前沿的平均距离:解到f2=1−f1f_2 = 1 - \sqrt{f_1}f2=1f1的垂直距离均值,反映收敛性。

该代码完整实现了PAES的核心逻辑,通过数学公式(如支配关系、高斯变异)与工程实现(如网格拥挤度、存档维护)的结合,有效求解ZDT1问题并逼近真实帕累托前沿。

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

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

相关文章

逻辑回归的应用

一参数逻辑回归参数及多分类策略等完整解析LogisticRegression 初始参数声明LogisticRegression(penaltyl2, dualFalse, tol0.0001, C1.0, fit_interceptTrue, intercept_scaling1, class_weightNone, random_stateNone, solverliblinear, max_iter100, multi_classovr, verbos…

C语言(长期更新)第7讲:VS实用调试技巧

C语言&#xff08;长期更新&#xff09; 第7讲 VS实用调试技巧 跟着潼心走&#xff0c;轻松拿捏C语言&#xff0c;困惑通通走&#xff0c;一去不回头~欢迎开始今天的学习内容&#xff0c;你的支持就是博主最大的动力。 目录 C语言&#xff08;长期更新&#xff09; 第7讲 …

CONTRASTIVE-KAN:一种用于稀缺标记数据的网络安全半监督入侵检测框架

研究背景与挑战​ ​工业环境需求​: 第四次工业革命中,物联网(IoT)和工业物联网(IIoT)的普及使网络安全成为关键挑战。 入侵检测系统需实时性高,尤其对关键基础设施(如燃气管道)的快速攻击检测至关重要。 ​核心问题​: ​标签数据稀缺​:工业系统多数时间处于正常…

综合:单臂路由+三层交换技术+telnet配置+DHCP

技术考核1 实验拓扑&#xff1a;实验需求 1.按照图示配置IP地址设备名 2.在SW1和SW2之间配置链路聚合增加链路带宽&#xff0c;提高可靠性 3.PC5和PC6属于VLAN10&#xff0c; PC7和PC8属于VLAN20 4.SW1和SW2属于二层交换机&#xff0c;SW3为三层交换机&#xff08;VLAN100用于对…

工业火焰识别漏报率↓78%!陌讯多模态融合算法实战解析

原创声明&#xff1a;本文技术方案解析基于陌讯技术白皮书2025版 标签&#xff1a;#陌讯视觉算法 #火焰识别优化 #工业安全监控 #边缘计算优化一、行业痛点&#xff1a;工业火灾监控的漏检危机据《2025工业安全白皮书》统计&#xff0c;化工场景传统火焰识别系统漏报率高达35%&…

C++引用:高效安全的别名机制详解

目录 一、引用的概念 二、引用的特性 1、定义时必须初始化 2、一个变量可以有多个引用 3、引用一旦绑定实体就不能更改 三、const引用&#xff08;常引用&#xff09; 1、const引用的基本特性 2、临时对象与const引用 3、临时对象的特性 4、const 引用作为函数形参 …

大语言模型API付费?

下面是目前主流 大语言模型 API 的付费情况总览&#xff1a; &#x1f9e0; 一、主要大语言模型 API&#xff1a;是否付费对比 提供方模型是否免费限制 / 说明OpenAIGPT-3.5 / GPT-4 / GPT-4o❌ 付费为主有免费额度&#xff08;如 ChatGPT 免费版&#xff09;&#xff0c;API …

巧用Wisdom SSH:容器化运维与传统运维的抉择

巧用Wisdom SSH&#xff1a;容器化运维与传统运维的抉择 在当下的技术领域&#xff0c;容器化运维与传统运维是运维人员面临的两大主要方向&#xff0c;对于从业者来说&#xff0c;如何抉择至关重要&#xff0c;而Wisdom SSH在其中能发挥显著作用。 传统运维&#xff1a;基石…

API征服者:Python抓取星链卫星实时轨迹

API征服者&#xff1a;Python抓取星链卫星实时轨迹从基础调用到工业级卫星追踪系统实战指南一、太空数据时代&#xff1a;星链卫星的全球覆盖​​星链卫星网络规模​​&#xff1a;已发射卫星数量&#xff1a;4,000目标卫星总数&#xff1a;42,000轨道高度&#xff1a;340km - …

《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》

当用户在内容平台无限滑动&#xff0c;或是在管理系统中处理成百上千条数据时&#xff0c;每一次无卡顿的交互&#xff0c;都是调和算法与虚拟DOM Diff机制协同工作的成果。理解这两者的底层逻辑&#xff0c;不仅是性能优化的钥匙&#xff0c;更是从“使用框架”到“理解框架”…

自动化与配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款开源的自动化运维工具&#xff0c;采用无代理&#xff08;Agentless&#xff09;架构&#xff0c;通过 SSH 协议实现对远程节点的管理。其核心特性包括&#xff1a;无代理架构&#xff1a;被管理节点无需安装代理软件&#xff0c;降…

Effective C++ 条款18:让接口容易被正确使用,不易被误用

Effective C 条款18&#xff1a;让接口容易被正确使用&#xff0c;不易被误用核心思想&#xff1a;设计接口时&#xff0c;应使正确使用方式直观自然&#xff0c;同时通过类型系统、行为约束等手段主动预防常见错误&#xff0c;减少用户犯错的可能性。 ⚠️ 1. 接口误用的常见陷…

nodejs读写文件

1.读文件 node有很多模块&#xff0c;可在node模块查看相应模块&#xff1b; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果发生错误&#xff0c;data是undefined 如果成功 err为null console.log(err); console.log(data); }) 2.写文件 var…

ConcurrentHashMapRedis实现二级缓存

1. 为什么使用ConcurrentHashMap&#xff1f;在Java中&#xff0c;ConcurrentHashMap 是一个线程安全且高效的哈希表实现&#xff0c;广泛用于高并发场景。将其用作一级缓存的原因主要包括以下几点&#xff1a;1.1. 线程安全性ConcurrentHashMap 是线程安全的&#xff0c;支持多…

Mysql集群技术

实验在RHEL7中做&#xff0c;因为9中缺少了一个关键的高可用组件环境&#xff1a;两台数据库&#xff0c;内存和CPU要多一点主流是MYSQL&#xff08;开源&#xff09;&#xff0c;Oracle收费较贵RHEL7中直接用make编译是有问题的&#xff0c;所以需要要gcc工具做好前置准备&…

自动驾驶嵌入式软件工程师面试题【持续更新】

文章目录前言请描述 CAN 帧的基本结构&#xff08;包括标识符、数据字段、CRC 等&#xff09;描述 WebSocket 协议的基本工作流程&#xff08;包括握手、数据帧结构&#xff09;请说明如何实现 WebSocket 连接的心跳机制以检测连接状态&#xff0c;并描述在断开后如何通过重连策…

vue(5)-组件

一.组件三大组成部分&#xff08;结构/样式/逻辑&#xff09;&#xff08;1&#xff09;组件样式冲突用scoped全局样式在组件中起全局作用&#xff0c;局部样式可以加scoped属性来只作用于当前组件图中只给baseone加这个样式&#xff0c;就在baseone中style加scoped&#xff08…

【机器学习】两大线性分类算法:逻辑回归与线性判别分析:找到分界线的艺术

文章目录一、核心概念&#xff1a;数据分类的"切分线"二、工作原理&#xff1a;从"找分界线"理解二、常见算法1、逻辑回归&#xff1a;二分类2、线性判别分析&#xff08;LDA&#xff09;&#xff1a;分类与降维3、两种算法对比分析三、实际应用&#xff1…

静态分析c/cpp源码函数调用关系图生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 静态代码调用结构图分析、构建、生成 doxygen doxygen在win和linux上均可运行&#xff0c;可以自动分析源码&#xff0c;对c语言项目友好&#xff0c;预处…

使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践

迁移背景与环境原来都是用mysqldump&#xff0c;DTS或者cdc迁移&#xff0c;这次8.0用了下新工具感觉挺好用的&#xff0c;简单快捷&#xff0c;30G数据不到源环境&#xff1a;单机 MySQL 8.0&#xff0c;地址为 172.23.3.28目标环境&#xff1a;InnoDB Cluster 集群&#xff0…