Baltamatica 北太天元 —— 基于模拟退火算法的旅行商问题

文章目录

    • 北太天元(Baltamatica)简介
    • Baltamatica 复现基于Matlab的旅行商问题
      • 问题描述
      • 模拟退火算法
      • Metropolis准则
      • 算法流程图:
    • Demo1:只考虑累计距离,通过模拟退火算法求解最短路径
      • matlab代码:
      • Baltam代码:
        • 北太天元运行中的效果:
      • matlab求解情况:
      • 适应度进行曲线:
    • Demo2:考虑每个站点的病人数量,优先给病人数量多的站点配送,同时兼顾累计最短距离
      • matlab代码:
      • 最优解之一:
      • 适应度进行曲线:
      • baltam 代码:
        • 北太天元运行中的效果:
    • matlab2023a与baltam2.3.1版本的求解速度对比:
    • 结束语:

北太天元(Baltamatica)简介

北太天元(Baltam)是一款对标矩阵实验室(Matlab)的国产通用科学计算软件,目前版本还在持续更新迭代中,并在国内不断提升知名度,营造良好的生态社区氛围。在很多外行、内行人都不看好Matlab国产化,甚至面对工业软件国产化的项目“谈虎色变”的形势下,北太天元横空出世,带着一股国人特有的骨气踏实迈进,此举可谓意义重大。

北太天元官网:baltamatica.com
卢朓-研发北太天元的意义

Baltamatica 复现基于Matlab的旅行商问题

研0开学前还比较自由,由于已经决定研二期间参加一次数学建模研赛(在此立flag,三牌楼通院/物联网有意向组队的可以加个v噢),并听说现在很多数模竞赛都鼓励学生使用北太天元作为编程仿真工具,就尝试下载了 Baltamatica 2.3.1 想跑个demo看看,但实际上遇到的问题其实比想象的要多,甚至官方给出的example中也会有运行时闪退的情况。最后还是花了个把小时才把之前用matlab写的模拟退火TSP问题完整复现为 Baltamatica 版本,当结果都能正常运行时,感觉还是挺惊奇的,向国内有这样一支热血的研发团队致敬!

Matlab版本:Matlab【旅行商问题】—— 基于模拟退火算法的无人机药品配送路线最优化

Matlab【路径规划】—— 无人机药品配送路线最优化

问题描述

某市引进一架专业大型无人机用于紧急状态下的药品投递,每个站点只能投放一次,可选择指派任意站点的无人机起飞出发完成投递任务,但必须在配送完毕后返回原来的站点。站点地理位置坐标(单位为公理)如下图所示。每个站点及容纳的病人数量见附件data_all.mat数据,现要求通过数学建模,在保证速度和优先救治病人数量多的站点前提下,提供药品紧急配送策略,具体问题如下:

请制订无人机的飞行路线,使尽可能多的病人尽早得到救治。
在这里插入图片描述

模拟退火算法

模拟退火算法是一种基于随机搜索的优化算法,其灵感来源于铸炼工具时,先将固体加热至高温后缓慢冷却,就能使固体获得更好的韧性(可弯折),其原理是退火降温过程中固体内部的晶粒能够以较低的能量重新排列,模拟退火算法就是模拟加热后的退火过程。它的目标是在解空间中寻找全局最优解或接近最优解的解(不一定能找到全局最优,可能是比较接近全局最优的局部最优)。

在模拟退火算法中,首先随机生成一个初始解,然后通过一系列的状态转移来搜索更优的解。状态转移的过程(即马尔可夫链)中,算法会引入一个控制参数(温度),使得算法在搜索过程中能够以一定的概率接受劣解,从而避免陷入局部最优解。随着搜索的进行,温度会逐渐降低,接受劣解的概率也会逐渐减小,最终收敛到全局最优解或接近最优解。

Metropolis准则

模拟退火的主要思想是:在搜索区间随机游走(即随机选择点),再利用Metropolis抽样准则,使随机游走逐渐收敛于局部最优解。而温度是Metropolis算法中的一个重要控制参数,可以认为这个参数的大小控制了随机过程向局部或全局最优解移动的快慢。

Metropolis准则是用于决定在Metropolis算法中是否接受状态转移的准则。根据Metropolis准则,状态转移被接受的概率为1或 e x p ( − Δ E / T ) ) exp(-ΔE/T)) exp(ΔE/T)),其中ΔE表示当前状态与下一个状态的能量差,T表示当前的温度。

具体来说,
如果ΔE小于0,即下一个状态的能量比当前状态更低,那么状态转移被接受(被接受的概率为1);
如果ΔE大于0,即下一个状态的能量比当前状态更高,那么状态转移被接受的概率为 e x p ( − Δ E / T ) exp(-ΔE/T) exp(ΔE/T)即有一定概率放弃状态转移).

当温度较高时,接受劣解的概率较高,有助于跳出局部最优解;当温度较低时,接受劣解的概率较低,有助于收敛到全局最优解。

Metropolis准则的核心思想是通过接受概率来探索状态空间,从而达到对系统的采样和模拟。这种准则在Metropolis算法中起到了重要的作用,使得算法能够在搜索过程中兼顾探索和利用,从而更好地找到系统的平衡分布。

算法流程图:

在这里插入图片描述

Demo1:只考虑累计距离,通过模拟退火算法求解最短路径

先通过Demo1,感受一下模拟退火算法处理旅行商问题的优化过程。

matlab代码:

clc,clear,close all;
%% ------------------------------------------------------------------------
%加载数据
load data_all.mat
data = zeros(25,2);
data(:,1) = data_all(:,2);
data(:,2) = data_all(:,3);
%% ------------------------------------------------------------------------
%模拟退火参数设置
n = size(data,1);  %站点数量
T = 100*n;         %初始温度
L = 100;           %马尔可夫链长度
K = 0.99;          %衰减参数
%% ------------------------------------------------------------------------
%站点坐标结构体
cp = struct([]);
for i = 1:ncp(i).x = data(i,1);cp(i).y = data(i,2);
end
le = 1;            %迭代次数
len(le) = funcp(cp,n);
figure(1);
while T > 0.001    %停止迭代温度%多次迭代扰动,温度降低前多次实验for i = 1:L%计算原路线距离len1 = funcp(cp,n);%产生随机扰动%随机置换两个不同站点的坐标p1 = floor(1+n*rand());p2 = floor(1+n*rand());while p1 == p2p1 = floor(1+n*rand());p2 = floor(1+n*rand());endtmp_cp = cp;tmp = tmp_cp(p1);tmp_cp(p1) = tmp_cp(p2);tmp_cp(p2) = tmp;%% ----------------------------------------------------------------%计算新路线总距离len2 = funcp(tmp_cp,n);%% ----------------------------------------------------------------%新老距离的差值,相当于能量delta_e = len2-len1;%% ----------------------------------------------------------------%若新路线好于旧路线,用新路线代替旧路线if delta_e < 0cp = tmp_cp;else%依概率选择是否接收新解if exp(-delta_e/T) > rand()cp = tmp_cp;endendendle = le+1;%% --------------------------------------------------------------------%计算新路线距离len(le) = funcp(cp,n);%温度不断下降T =T*K;for i = 1:n-1plot([cp(i).x, cp(i+1).x], [cp(i).y, cp(i+1).y], "o-","LineWidth", 1.2);hold on;grid on;endplot([cp(n).x, cp(1).x], [cp(n).y, cp(1).y],'ro--',"LineWidth", 1.5);title(['优化最短距离:', num2str(len(le))]);disp(['优化最短距离:', num2str(len(le))])hold off;pause(0.001);
end
figure(2);
plot(len, 'LineWidth', 1.1)
grid on;
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进行曲线')
disp('优化结束')
%% ------------------------------------------------------------------------
%计算路线总长度函数
function len = funcp(cp,n)
len = 0;
for i = 1:n-1len = len+sqrt((cp(i).x-cp(i+1).x)^2+(cp(i).y-cp(i+1).y)^2);  %累计欧氏距离
end
len = len+sqrt((cp(n).x-cp(1).x)^2+(cp(n).y-cp(1).y)^2);
end

Baltam代码:

clc;
clear;
clf;
%% ------------------------------------------------------------------------
%加载数据
cp_x = load('cp_x.mat');
cp_y = load('cp_y.mat');
data = zeros(25,2);
%% ------------------------------------------------------------------------
%模拟退火参数设置
n = size(data,1);  %站点数量
indx = 1:n;
T = 100*n;         %初始温度
L = 100;           %马尔可夫链长度
K = 0.99;          %衰减参数
%% ------------------------------------------------------------------------
%站点坐标结构体
cp = struct('x',cp_x.cp_x,'y',cp_y.cp_y);
cpx = cp.x;
cpy = cp.y;
xx = cp.x;
yy = cp.y;
lem = 1;            %迭代次数
len(lem) = funcp(cpx,cpy,n);
figure('Color','white');
while T > 0.001    %停止迭代温度%多次迭代扰动,温度降低前多次实验for cnt = 1:L%计算原路线距离len1 = funcp(cpx,cpy,n);%产生随机扰动%随机置换两个不同站点的坐标p1 = floor(1+n*rand());p2 = floor(1+n*rand());while p1 == p2p1 = floor(1+n*rand());p2 = floor(1+n*rand());endtmp_cpx = cpx;tmpx = tmp_cpx(p1);tmp_cpx(p1) = tmp_cpx(p2);tmp_cpx(p2) = tmpx;tmp_cpy = cpy;tmpy = tmp_cpy(p1);tmp_cpy(p1) = tmp_cpy(p2);tmp_cpy(p2) = tmpy;%% ----------------------------------------------------------------%计算新路线总距离len2 = funcp(tmp_cpx,tmp_cpy,n);%% ----------------------------------------------------------------%新老距离的差值,相当于能量delta_e = len2-len1;%% ----------------------------------------------------------------%若新路线好于旧路线,用新路线代替旧路线if delta_e < 0cpx = tmp_cpx;cpy = tmp_cpy;else%依概率选择是否接收新解if exp(-delta_e/T) > rand()cpx = tmp_cpx;cpy = tmp_cpy;endendendlem = lem+1;%% --------------------------------------------------------------------%计算新路线距离len(lem) = funcp(cpx,cpy,n);disp(["优化最短距离:", num2str(len(lem))])disp(["起点坐标:", num2str([cpx(1), cpy(1)])])disp(["最后一个站点坐标:", num2str([cpx(n), cpy(n)])])%温度不断下降T =T*K;for jj = 1:n-1plot([cpx(jj), cpx(jj+1)], [cpy(jj), cpy(jj+1)], "o-","LineWidth", 1.2);hold on;endfor kk = 1:ntext(xx(kk)+0.5,yy(kk)+0.75,num2str(indx(kk)),'fontsize',10);endplot([cpx(n), cpx(1)], [cpy(n), cpy(1)],'r-.',"LineWidth", 1.5);axis([0,120,-2,58]);title(['优化最短距离:', num2str(len(lem))]);hold off;
end
figure('2');
plot(len, 'LineWidth', 1.1)
axis([0,length(len),floor(min(len)),ceil(max(len))])
xlabel("迭代次数")
ylabel("目标函数值")
title('适应度进行曲线')
disp("优化结束")
%% ------------------------------------------------------------------------
计算路线总长度函数
function len = funcp(cpx,cpy,n)
tar = 0;
len = 0;
for ii = 1:n-1len = len+sqrt((cpx(ii)-cpx(ii+1))^2+(cpy(ii)-cpy(ii+1))^2);
end
len = len+sqrt((cpx(n)-cpx(1))^2+(cpy(n)-cpy(1))^2);
end

北太天元运行中的效果:

在这里插入图片描述

其实可以看出Baltam的代码风格已尽可能地贴近Matlab,这对于从matlab转入baltam来说是非常重要的,但还不足以达到直接把Matlab的代码、工程导入进去一键运行。

matlab求解情况:

由于模拟退火算法的优化过程具有随机性,所以得到的解不一定就是全局最优,但肯定比瞎猜一个局部最优要好。可以重复运行几次程序,观察最优解的变化,正常应该差距不大。

最优解之一:
在这里插入图片描述
只考虑距离的情况不用考虑路线顺序,因为正反走都是一样的距离。

适应度进行曲线:

在这里插入图片描述
可见适应度随着退火过程逐渐趋于稳定的最优解,算法具有收敛性。

Demo2:考虑每个站点的病人数量,优先给病人数量多的站点配送,同时兼顾累计最短距离

新建目标值变量tar,tar包含了累计距离变量len的大小,且加入了病人数量这个变量var,并乘以权重10,用1000-var是为了反向考虑优化过程中需要使得目标值tar越来越小:

tar = tar+sqrt((cp(i).x-cp(i+1).x)^2+(cp(i).y-cp(i+1).y)^2)+10*(1000-var(i)); 

matlab代码:

clc,clear,close all;
%% ------------------------------------------------------------------------
%加载数据
load data_all.mat
data = zeros(25,2);
data(:,1) = data_all(:,2);
data(:,2) = data_all(:,3);
var = data_all(:,4);
%% ------------------------------------------------------------------------
%模拟退火参数设置
n = size(data,1);  %站点数量
T = 100*n;         %初始温度
L = 100;           %马尔可夫链长度
K = 0.99;          %衰减参数
%% ------------------------------------------------------------------------
%站点坐标结构体
cp = struct([]);
for i = 1:ncp(i).x = data(i,1);cp(i).y = data(i,2);
end
le = 1;            %迭代次数
[tar(le), len(le)] = funcp(cp,n);
figure(1);
while T > 0.001    %停止迭代温度%多次迭代扰动,温度降低前多次实验for i = 1:L%计算原路线距离[tar1, ~] = funcp(cp,n);%产生随机扰动%随机置换两个不同站点的坐标p1 = floor(1+n*rand());p2 = floor(1+n*rand());while p1 == p2p1 = floor(1+n*rand());p2 = floor(1+n*rand());endtmp_cp = cp;tmp = tmp_cp(p1);tmp_cp(p1) = tmp_cp(p2);tmp_cp(p2) = tmp;%% ----------------------------------------------------------------%计算新路线总距离[tar2, ~] = funcp(tmp_cp,n);%% ----------------------------------------------------------------%新老距离的差值,相当于能量delta_e = tar2-tar1;%% ----------------------------------------------------------------%若新路线好于旧路线,用新路线代替旧路线if delta_e < 0cp = tmp_cp;else%依概率选择是否接收新解if exp(-delta_e/T) > rand()cp = tmp_cp;endendendle = le+1;%% --------------------------------------------------------------------%计算新路线距离[tar(le), len(le)] = funcp(cp,n);%温度不断下降T =T*K;for i = 1:n-1plot([cp(i).x, cp(i+1).x], [cp(i).y, cp(i+1).y], "o-","LineWidth", 1.2);hold on;grid on;endplot([cp(n).x, cp(1).x], [cp(n).y, cp(1).y],'r-.',"LineWidth", 1.5);for k = 1:ntext(data(k,1)+0.5,data(k,2)+0.75,num2str(var(k)),'fontsize',10);endtitle(['优化最短距离:', num2str(len(le))]);disp(['优化最短距离:', num2str(len(le))])disp(['起点坐标:', num2str([cp(1).x, cp(1).y])])disp(['最后一个站点坐标:', num2str([cp(n).x, cp(n).y])])hold off;pause(0.001);
end
figure(2);
plot(tar, 'LineWidth', 1.1)
grid on;
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进行曲线')
disp('优化结束')
%% ------------------------------------------------------------------------
%计算目标函数和路线总长度函数
function [tar, len] = funcp(cp,n)
tar = 0;
len = 0;
for i = 1:n-1tar = tar+sqrt((cp(i).x-cp(i+1).x)^2+(cp(i).y-cp(i+1).y)^2)+10*(1000-var(i)); len = len+sqrt((cp(i).x-cp(i+1).x)^2+(cp(i).y-cp(i+1).y)^2);
end
tar = tar+sqrt((cp(n).x-cp(1).x)^2+(cp(n).y-cp(1).y)^2)+10*(1000-var(1));
len = len+sqrt((cp(n).x-cp(1).x)^2+(cp(n).y-cp(1).y)^2);
end

最优解之一:

在这里插入图片描述
查看路线的起点和终点(最后一个配送站点):

>> disp(['起点坐标:', num2str([cp(1).x, cp(1).y])])
起点坐标:18  28
>> disp(['最后一个站点坐标:', num2str([cp(n).x, cp(n).y])])
最后一个站点坐标:21  30

可在data_all.mat的第一列数据中看到各坐标点对应的节点标号。

适应度进行曲线:

在这里插入图片描述

baltam 代码:

clc;
clear;
clf;
%% ------------------------------------------------------------------------
%加载数据
cp_x = load('cp_x.mat');
cp_y = load('cp_y.mat');
vars = load('var.mat');
data = zeros(25,2);
%% ------------------------------------------------------------------------
%模拟退火参数设置
n = size(data,1);  %站点数量
indx = 1:n;
T = 100*n;         %初始温度
L = 100;           %马尔可夫链长度
K = 0.99;          %衰减参数
%% ------------------------------------------------------------------------
%站点坐标结构体
varm = vars.var;
cp = struct('x',cp_x.cp_x,'y',cp_y.cp_y);
cpx = cp.x;
cpy = cp.y;
xx = cp.x;
yy = cp.y;
lem = 1;            %迭代次数
[tar(lem), len(lem)] = funcp(cpx,cpy,n,varm);
figure('Color','white');
while T > 0.001    %停止迭代温度%多次迭代扰动,温度降低前多次实验for cnt = 1:L%计算原路线距离[tar1, ~] = funcp(cpx,cpy,n,varm);%产生随机扰动%随机置换两个不同站点的坐标p1 = floor(1+n*rand());p2 = floor(1+n*rand());while p1 == p2p1 = floor(1+n*rand());p2 = floor(1+n*rand());endtmp_cpx = cpx;tmpx = tmp_cpx(p1);tmp_cpx(p1) = tmp_cpx(p2);tmp_cpx(p2) = tmpx;tmp_cpy = cpy;tmpy = tmp_cpy(p1);tmp_cpy(p1) = tmp_cpy(p2);tmp_cpy(p2) = tmpy;%% ----------------------------------------------------------------%计算新路线总距离[tar2, ~] = funcp(tmp_cpx,tmp_cpy,n,varm);%% ----------------------------------------------------------------%新老距离的差值,相当于能量delta_e = tar2-tar1;%% ----------------------------------------------------------------%若新路线好于旧路线,用新路线代替旧路线if delta_e < 0cpx = tmp_cpx;cpy = tmp_cpy;else%依概率选择是否接收新解if exp(-delta_e/T) > rand()cpx = tmp_cpx;cpy = tmp_cpy;endendendlem = lem+1;%% --------------------------------------------------------------------%计算新路线距离[tar(lem), len(lem)] = funcp(cpx,cpy,n,varm);disp(["优化最短距离:", num2str(len(lem))])disp(["起点坐标:", num2str([cpx(1), cpy(1)])])disp(["最后一个站点坐标:", num2str([cpx(n), cpy(n)])])%温度不断下降T =T*K;for jj = 1:n-1plot([cpx(jj), cpx(jj+1)], [cpy(jj), cpy(jj+1)], "o-","LineWidth", 1.2);hold on;endplot([cpx(n), cpx(1)], [cpy(n), cpy(1)],'r-.',"LineWidth", 1.5);axis([0,120,-2,58]);for kk = 1:ntext(xx(kk)+0.5,yy(kk)+0.75,num2str(varm(kk)),'fontsize',10);text(xx(kk)+0.5,yy(kk)-0.75,num2str(indx(kk)),'fontsize',8);endtitle(['优化最短距离:', num2str(len(lem))]);hold off;
end
figure('2');
plot(tar, 'LineWidth', 1.1)
axis([0,length(len),floor(min(len)),ceil(max(len))])
xlabel("迭代次数")
ylabel("目标函数值")
title('适应度进行曲线')
disp("优化结束")
%% ------------------------------------------------------------------------
计算目标函数和路线总长度函数
function [tar, len] = funcp(cpx,cpy,n,varm)
tar = 0;
len = 0;
for ii = 1:n-1tar = tar+sqrt((cpx(ii)-cpx(ii+1))^2+(cpy(ii)-cpy(ii+1))^2)+10*(1000-varm(ii)); len = len+sqrt((cpx(ii)-cpx(ii+1))^2+(cpy(ii)-cpy(ii+1))^2);
end
tar = tar+sqrt((cpx(n)-cpx(1))^2+(cpy(n)-cpy(1))^2)+10*(1000-varm(1));
len = len+sqrt((cpx(n)-cpx(1))^2+(cpy(n)-cpy(1))^2);
end

北太天元运行中的效果:

在这里插入图片描述
在这里插入图片描述

matlab2023a与baltam2.3.1版本的求解速度对比:

baltam2.3.1中的运行效果:
在这里插入图片描述
baltam的界面非常简约,丝滑~

虽然matlab一直以来的感受就是非常笨重,但本题在matlab2023a环境(含pause(0.001)延时)中的求解速度与baltma2.3.1目前的速度相较而言,其实是非常快了:
在这里插入图片描述

结束语:

最后还是希望北太天元能越做越好,早日解决卡脖子问题!

免费代码包已附上,感兴趣的同学可以下载尝试运行,如果运行太久还是没有收敛出最优解,在命令行ctrl+c可以强行终止程序。

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

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

相关文章

win如何使用OpenSSL生成自签名证书,使 http 升级为 https

win如何使用OpenSSL生成自签名证书&#xff0c;使 http 升级为 https 前言 HTTPS其实就是HTTP over SSL&#xff0c;也就是让HTTP连接建立在SSL安全连接之上。 创建自签名证书需要安装openssl。参考本文安装OpenSSL部分。 使用OpenSSL生成自签名证书的步骤&#xff1a;参考…

给LLM装上知识:从LangChain+LLM的本地知识库问答到LLM与知识图谱的结合

第一部分 基于LangChain ChatGLM-6B的本地知识库问答的应用实现 1.1 什么是LangChain&#xff1a;连接本地知识库与LLM的桥梁 作为一个 LLM 应用框架&#xff0c;LangChain 支持调用多种不同模型&#xff0c;提供相对统一、便捷的操作接口&#xff0c;让模型即插即用&#x…

从零实现深度学习框架——Seq2Seq机器翻译实战

引言 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架&#xff0c;该框架类似PyTorch能实现自动求导。 &#x1f4a1;系列文章完整目录&#xff1a; &#x1f449;点此&#x1f448; 要深入理解…

Android Studio实现内容丰富的安卓自行车租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号105 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

使用itextpdf填充表单域并生成pdf

文章目录 前言一、准备工作1.1 安装软件1.2 准备pdf1.3 设置表单域 二、创建项目三、编写代码3.1 编写工具类3.2 测试 四、测试结果 前言 最近手上有个任务&#xff0c;就是需要做一个pdf导出的功能。 可选择的技术点比较多&#xff0c;我这边综合考虑之后&#xff0c;使用的…

【单例模式】—— 每天一点小知识

&#x1f4a7; 单例模式 \color{#FF1493}{单例模式} 单例模式&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x1f995;生动形…

基于卷积变分自动编码器的3D数据处理与重建【CVAE】

在这个项目中&#xff0c;我们将学习如何使用卷积变分自动编码器 (CVAE) 来处理和重建 3D 湍流数据。 我们使用计算流体动力学 (CFD) 方法生成 3D 湍流立方体&#xff0c;每个 3D 立方体沿着三个速度分量携带物理信息&#xff08;与图像数据类似&#xff0c;被视为单独的通道&…

Http host 标头攻击

一、什么是http host 标头攻击 HTTP Host 标头攻击是一种网络安全攻击技术&#xff0c;利用了 HTTP 协议中的 Host 标头字段的漏洞。Host 标头字段用于指定客户端请求的目标主机名或域名。 攻击者可以通过构造恶意的 HTTP 请求&#xff0c;伪造或篡改 Host 标头字段的值&#x…

Linux系统安全:安全技术和防火墙

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Linux系统安全&#xff1a;安全技术和防火墙1.安全技术&#xff1a;2.入侵防御系统 (Intrusion Prevention System) :3.防火墙 ( Erewall ) :4.防水墙&#xff…

GPT模型训练实践(3)-参数训练和代码实践

一、参数训练 GPT模型参数的训练过程宏观上有两个大环节&#xff0c;先从上往下进行推理&#xff0c;再从下往上进行训练&#xff0c;具体过程为&#xff1a; 1、模型初始化参数随机取得&#xff1b; 2、计算模型输出与真实数据的差距&#xff08;损失值和梯度&#xff09; …

Linux 6.5增加对高通开源GPU Adreno 690的支持

导读即将推出的Linux 6.5内核将把对高通Adreno 690 GPU的支持添加到开源的MSM内核图形/显示驱动程序中。A690主要用于骁龙8cx第三代&#xff08;SC8280XP&#xff09;平台&#xff0c;而联想ThinkPad X13s笔记本电脑和其他硬件也采用了该平台。 新的支持将包含近200行代码&…

JS数据分组引发的思考

我们经常需要对数据进行分组(分类)&#xff0c;得到需要的格式。 1.简单示例 例如有一份对象数组的数据 const data [{ name: Liam, age: 18, sex: male },{ name: Bob, age: 20, sex: male },{ name: Diana, age: 21, sex: female },{ name: Grace, age: 20, sex: female }…