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?=1?f1??

二、代碼模塊與公式對應解析

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+9?29i=230?xi??(輔助函數,平衡多變量影響)=g(x)?(1?g(x)f1?(x)??)(第二個目標,與f1?g相關)?

代碼實現(嵌套函數 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_rate?N(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,Ai?Bi?)(?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_obj?min_objobjectives?min_obj?(避免除零,若范圍為0則設為1)
  3. 計算網格坐標:grid_coords=?normalized?grid_divisions?\text{grid\_coords} = \lfloor \text{normalized} \cdot \text{grid\_divisions} \rfloorgrid_coords=?normalized?grid_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?=1?f1??的垂直距離均值,反映收斂性。

該代碼完整實現了PAES的核心邏輯,通過數學公式(如支配關系、高斯變異)與工程實現(如網格擁擠度、存檔維護)的結合,有效求解ZDT1問題并逼近真實帕累托前沿。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94121.shtml
英文地址,請注明出處:http://en.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…