遗传算法原理与实战(python、matlab)
遗传算法
1.什么是遗传算法
遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化论和遗传学原理的全局优化搜索算法。它通过模拟自然界中生物种群的遗传机制和进化过程来解决复杂问题,如函数优化、组合优化、机器学习等。遗传算法具有并行性、全局搜索能力和对问题描述的简单性,在很多领域有着广泛应用。

2.遗传算法的基本原理
遗传算法的基本思想是将问题的解表示为“染色体”(Chromosome),每个染色体由一系列“基因”(Gene)组成,这些基因可以是二进制编码、实数或离散值。算法通过选择、交叉(也称为杂交)、变异等遗传操作,模仿自然选择和遗传变异的过程,使种群中的个体逐渐适应环境,即找到问题的最优解或近似最优解。
下面我试着用通俗一点的例子来解释什么是“遗传算法”:
想象一下,在一座起伏的山脉中,住着一群人。这些人散居在山脉的不同高度上,有的住在山顶,有的住在半山腰,还有的住在山谷里。突然有一天,洪水来袭,水位不断上升,那些住在低处的人们开始面临危险。但住在高处的人因为地势较高,所以能够幸免于难,我们可以说,这些人对这种“洪水”环境的适应能力更强。
为了确保人类的延续,这些适应能力强的人开始繁衍后代。他们的目标是希望通过繁殖,能够产生出生活在山脉最高点的后代,这样就能完全避免洪水的威胁,相当于找到了最完美的生存策略。在这个过程中,父母双方的特征(我们称之为“基因”)会通过一种类似“混合”的方式传递给子女,有时候,子女身上还会出现一些意料之外的新特征,这就是“基因变异”。
遗传算法就像是指导这群人在面对洪水时如何繁衍出能在最高山峰生存的后代的一种智慧。它通过模拟自然界中的选择、交配和变异过程,帮助寻找出最适应环境的解决方案。在这个例子中,“最高山峰”的横坐标就是我们要找的答案,也就是那组能让人们在任何情况下都能生存下来的最优“DNA”。

即变成了求解该函数在区间[0 , 5]上的最大值点的问题。
简而言之,遗传算法就像是一种搜索策略,它通过模仿自然进化的过程,逐步改进并找到解决问题的最佳方案。在这个过程中,那些表现更好(适应度更高)的解决方案会被优先保留和进一步优化,直到找到最优解。
3.遗传算法的名词解释
种群(Population):遗传算法中的一组可能解的集合。每个解都是一个染色体。
染色体(Chromosome):代表一个可能的解,由多个基因组成。
基因(Gene):染色体上的基本单元,通常是一个二进制位或数值,表示解的一个部分。
适应度函数(Fitness Function):用于评估染色体的好坏,即解的质量。适应度高的染色体有更大的机会被选中进行遗传操作。
选择(Selection):根据适应度函数,从当前种群中选择优秀的个体进入下一代种群的过程。常用的选择方法有轮盘赌选择、锦标赛选择等。
交叉(Crossover):两个染色体交换部分基因,生成新的染色体。这是遗传算法中实现全局搜索的主要方式。
变异(Mutation):以很小的概率改变染色体中的某个基因,增加种群的多样性,防止算法过早收敛。
收敛(Convergence):当种群中的个体适应度不再显著提高时,认为算法已经找到最优解或近似最优解,此时算法结束。
遗传算法通过迭代上述过程,不断优化种群,最终找到满足要求的解。
4.遗传算法程序实现过程
遗传算法实现的一般流程如下:

(1)初始化种群
生成一个初始种群,种群中的每一个个体(染色体)都代表了一个可能的解。
每个个体由一组基因构成,基因的编码形式取决于问题的特性,可以是二进制、实数或符号编码等。
(2)评估适应度
使用适应度函数(Fitness Function)来评估每个个体的适应度,这反映了个体在解决特定问题上的性能。
适应度函数应该设计得能够量化个体解的质量,以便于比较不同个体的优劣。
(3)选择(Selection)
根据个体的适应度值进行选择,适应度较高的个体有更高的概率被选中参与后续的遗传操作。
常见的选择策略包括轮盘赌选择、锦标赛选择、排名选择等。
(4)遗传操作
交叉(Crossover):选定的个体之间进行基因信息的交换,以产生新的后代个体。
变异(Mutation):以小概率随机改变后代个体的某些基因,以增加种群的多样性。
这些操作通常遵循一定的概率规则,例如交叉概率和变异概率。
(5)替换(Replacement)
新产生的后代个体可能会替代旧的种群成员,这个过程可以通过多种策略进行,如世代替换、稳态遗传算法等。
有时会使用精英策略(Elitism),确保种群中最好的个体被保留到下一代。
(6)终止条件检查
检查是否达到预定的终止条件,这可能是固定的迭代次数、种群的平均适应度或最佳适应度达到某个阈值。
如果满足终止条件,则算法停止;否则,继续回到步骤3。
(7)输出结果
算法结束后,输出种群中适应度最高的个体作为最优解。

5.遗传算法代码实现
5.1python代码实现
种群类设计:
import numpy as np
# 定义种群类
class Population:def __init__(self, pop_size, chromosome_size):# 初始化种群大小和染色体大小self.pop_size = pop_sizeself.chromosome_size = chromosome_size# 随机生成初始种群,每个基因是0或1self.population = np.round(np.random.rand(pop_size, chromosome_size)).astype(np.int)# 初始化适应度值为0self.fit_value = np.zeros((pop_size, 1))# 选择染色体方法def select_chromosome(self):# 计算总适应度值total_fitness_value = self.fit_value.sum()# 计算每个个体的选择概率p_fit_value = self.fit_value / total_fitness_value# 计算累积概率p_fit_value = np.cumsum(p_fit_value)# 生成随机点,用于轮盘赌选择point = np.sort(np.random.rand(self.pop_size, 1), 0)# 初始化选择和新的种群索引fit_in = 0new_in = 0new_population = np.zeros_like(self.population)# 轮盘赌选择新种群while new_in < self.pop_size:if point[new_in] < p_fit_value[fit_in]:new_population[new_in, :] = self.population[fit_in, :]new_in += 1else:fit_in += 1# 更新种群self.population = new_population# 交叉染色体方法def cross_chromosome(self, cross_rate):# 获取种群大小和染色体大小x = self.pop_sizey = self.chromosome_sizenew_population = np.zeros_like(self.population)# 对种群中的染色体进行交叉操作for i in range(0, x-1, 2):# 根据交叉率决定是否交叉if np.random.rand(1) < cross_rate:# 生成交叉点insert_point = int(np.round(np.random.rand(1) * y).item())# 交叉染色体new_population[i, :] = np.concatenate([self.population[i, 0:insert_point], self.population[i+1, insert_point:y]], 0)new_population[i+1, :] = np.concatenate([self.population[i+1, 0:insert_point], self.population[i, insert_point:y]], 0)else:# 不交叉则直接复制new_population[i, :] = self.population[i, :]new_population[i + 1, :] = self.population[i + 1, :]# 更新种群self.population = new_population# 寻找最佳个体方法def best(self):# 初始化最佳个体和适应度值best_individual = self.population[0, :]best_fit = self.fit_value[0]# 遍历种群寻找最佳个体for i in range(1, self.pop_size):if self.fit_value[i] > best_fit:best_individual = self.population[i, :]best_fit = self.fit_value[i]return best_individual, best_fit# 突变染色体方法def mutation_chromosome(self, mutation_rate):# 获取种群大小x = self.pop_size# 对种群中的染色体进行突变操作for i in range(x):if np.random.rand(1) < mutation_rate:# 生成突变点m_point = int(np.round(np.random.rand(1) * self.chromosome_size).item())# 突变操作if self.population[i, m_point] == 1:self.population[i, m_point] = 0else:self.population[i, m_point] = 1# 二进制转十进制方法def binary2decimal(self, population):pop1 = np.zeros_like(population)y = self.chromosome_size# 转换二进制到十进制for i in range(y):pop1[:, i] = 2 ** (y - i - 1) * population[:, i]pop = np.sum(pop1, 1)pop2 = pop * 10 / (1 << y)return pop2# 计算目标函数值方法def cal_obj_value(self):# 将二进制表示转换为十进制表示x = self.binary2decimal(self.population)# 计算并更新适应度值self.fit_value = 10 * np.sin(5 * x) + 7 * np.abs(x - 5) +
*测试:*
from GA遗传算法.Population import Population
import numpy as npcross_rate = 0.6
mutation_rate = 0.001
pop_size = 100
chromosome_size = 10
population = Population(100, 10)for i in range(100):population.cal_obj_value()population.select_chromosome()population.cross_chromosome(cross_rate)population.mutation_chromosome(mutation_rate)best_individual, best_fit = population.best()best_individual = np.expand_dims(best_individual, 0)x = population.binary2decimal(best_individual)print("X:", x, "\t Y: ", best_fit)
5.3结果展示

在某些情况下遗传算法可能陷入局部最优。
- 早熟收敛(Premature Convergence)
原因:种群中的个体过早地变得相似,导致遗传多样性下降,使得算法无法探索解空间的其他区域。
表现:种群的适应度值在算法早期迅速上升,但随后停滞不前。 - 选择压力过大
原因:选择操作过于偏向适应度高的个体,可能导致适应度较低的个体被过早淘汰,减少了种群的多样性。
表现:算法快速收敛到某个局部最优解,而忽略了可能存在更好解的区域。 - 交叉和突变概率设置不当
原因:交叉率和突变率太低,无法有效地探索新的解空间;交叉率和突变率太高,可能导致算法变成随机搜索。
表现:交叉和突变不足时,算法容易在局部最优解附近徘徊;过度交叉和突变则可能导致算法无法收敛。 - 适应度函数设计不当
原因:适应度函数未能准确反映解的质量,或者存在多个局部最优解,而适应度函数无法有效区分。
表现:算法可能收敛到非目标解的局部最优解。 - 解的表示方法
原因:解的编码方式可能不适合特定问题,导致算法难以找到全局最优解。
表现:即使算法能够探索解空间,但由于编码的限制,仍可能无法表示全局最优解。 - 种群大小
原因:种群大小太小,无法维持足够的遗传多样性;种群大小太大,计算成本过高。
表现:种群太小容易陷入局部最优,种群太大则可能导致算法效率低下。 - 算法停止条件
原因:算法停止条件设置过早,可能导致算法未能充分探索解空间。
表现:算法在达到停止条件时可能刚好处于局部最优解。

遗传算法的MATLAB代码
%ga_1
clc
clear
close all%% 画出函数图
figure(1);
hold on;lb = 1; ub= 2; %函数自变量范围【1.2】
ezplot('sin(10*pi*X)/X',[lb,ub]); %画出函数曲线
xlabel('自变量/x')
ylabel('自变量/y')%% 定义遗传算法参数
NIND = 40; %种群大小
MAXGEN = 20; %最大遗传代数
PRECI = 20; %个体长度
GGAP = 0.95; %代沟
px = 0.7; %交叉概率
pm = 0.01; %变异概率
trace = zeros(2,MAXGEN); %寻优结果的初始值
FieldD = [PRECI;lb;ub;1;0;1;1]; %区域描述器
Chrom = crtbp(NIND,PRECI); %创建任意离散随机种群%% 优化
gen = 0; %代计数器
X = bs2rv(Chrom,FieldD); %初始种群二进制到十进制转换
ObjV = sin(10*pi*X)./X; %计算目标函数值
while gen<MAXGENFitnV = ranking(ObjV); %分配适应度值SelCh = select('sus',Chrom,FitnV,GGAP); %选择SelCh = recombin('xovsp',SelCh,px); %重组SelCh = mut(SelCh,pm); %变异X = bs2rv(SelCh,FieldD); %自带个体的十进制转换ObjVSel = sin(10*pi*X)./X; %计算自带的目标函数值[Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群X = bs2rv(Chrom,FieldD);gen = gen+1; % 代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I] = min(ObjV);trace(1,gen) = X(I); %记下每代的最优值trace(2,gen) = Y; %记下每代的最优值
endplot(trace(1,:),trace(2,:),'bo'); %画出每代的最优点
grid on;
plot(X,ObjV,'b*'); %画出最后一代的种群hold off
hold off
%% 画进化图
figure(2);
plot(1:MAXGEN,trace(2,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestY = trace(2,end);
bestX = trace(1,end);
fprintf(['最优解:\nX = ',num2str(bestX),'\nY = ',num2str(bestY),'\n'])
% ga_2
clc
clear all
close all%% 画出函数图
figure(1);
lbx = -2;ubx = 2;
lby = -2;uby = 2;
ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线
hold on;%% 定义遗传算法参数
NIND = 40; %种群大小
MAXGEN = 50; %最大遗传代数
PRECI = 20; %个体长度
GGAP = 0.95; %代沟
px = 0.7; %交叉变异
pm = 0.01; %变异概率
trace = zeros(3,MAXGEN); %寻优结果的初始值
FieldD = [PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %区域扫描器
Chrom = crtbp(NIND,PRECI*2); %创建任意离散随即种群%% 优化
gen = 0; %代计数器
XY = bs2rv(Chrom,FieldD); %初代种群的十进制转换
X = XY(:,1); Y = XY(:,2);
ObjV = Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算目标函数值
while gen<MAXGENFitnV = ranking(-ObjV); %分配适应度值SelCh = select('sus',Chrom,FitnV,GGAP); %选择SelCh = recombin('xovsp',SelCh,px); %重组SelCh = mut(SelCh,pm); %变异XY = bs2rv(SelCh,FieldD); %子代个体的十进制转换X = XY(:,1); Y = XY(:,2);ObjVSel = Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子代的目标函数[Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群XY= bs2rv(Chrom,FieldD);gen = gen + 1 ; %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I] = max(ObjV);trace(1:2,gen) = XY(I,:); %记下每代的最优值trace(3,gen) = Y; %记下每代的最优解
end
plot3(trace(1,:),trace(2,:),trace(3,:),'bo'); %画出每代的最优点
grid on;
plot3(XY(:,1),XY(:,2),ObjV,'bo'); %画出最后一代的种群
hold off%% 画进化图
figure(2);
plot(1:MAXGEN,trace(3,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化进程')
bestZ = trace(3,end);
bestX = trace(1,end);
bestY = trace(2,end);
fprintf(['最优解:\nX =',num2str(bestX),'\nY = ',num2str(bestY),'\nz = ',num2str(bestZ),'\n'])
% ga_tsp
clear;clc;
% 输入数据
vertexs=importdata('city.txt'); %城市坐标
n=length(vertexs); %城市数目
dist=zeros(n); %城市距离矩阵
for i = 1:nfor j = 1:ndist(i,j)=distance(vertexs(i,:),vertexs(j,:));end
end
% 遗传算法参数设置
NIND=50; %种群大小
MAXGEN=150; %迭代次数
Pm=0.9; %交叉概率
Pc=0.1; %变异概率
pSwap=0.2; %选择交换结构的概率
pReversion=0.5; %选择逆转结构的概率
pInsertion=0.3; %选择插入结构的概率
N=n; %染色体长度=城市数目
% 种群初始化
Chrom=InitPop(NIND,N);
% 优化
gen=1; %计数器
bestChrom=Chrom(1,:); %初始全局最优个体
bestL=RouteLength(bestChrom,dist);%初始全局最优个体的总距离
BestChrom=zeros(MAXGEN,N); %记录每次迭代过程中全局最优个体
BestL=zeros(MAXGEN,1); %记录每次迭代过程中全局最优个体的总距离
while gen<=MAXGENSelCh=BinaryTourment_Select(Chrom,dist); %二元锦标赛选择 SelCh=Recombin(SelCh,Pm); %OX交叉SelCh=Mutate(SelCh,Pc,pSwap,pReversion,pInsertion); %变异Chrom=SelCh; %将Chrom更新为SelChObj=ObjFunction(Chrom,dist); %计算当前代所有个体总距离[minObj,minIndex]=min(Obj); %找出当前代中最优个体if minObj<=bestL %将当前代中最优个体与全局最优个体进行比较,如果当前代最优个体更好,则将全局最优个体进行替换bestChrom=Chrom(minIndex,:); bestL=minObj;endBestChrom(gen,:)=bestChrom; %记录每一代全局最优个体,及其总距离BestL(gen,:)=bestL;disp(['第' num2str(gen) '次迭代:全局最优路线总距离 = ' num2str(bestL)]); %显示外层循环每次迭代的信全局最优路线的总距离figure(1); %画出每次迭代的全局最优路线图PlotRoute(bestChrom,vertexs(:,1),vertexs(:,2))pause(0.01);gen=gen+1; %计数器加1
end
figure; % 打印每次迭代的全局最优个体的总距离变化趋势图
plot(BestL,'LineWidth',1);
title('优化过程')
xlabel('迭代次数');
ylabel('总距离');function dist = distance(a,b)
%a 第一个城市坐标
%b 第二个城市坐标
%dist 两个城市之间距离x = (a(1)-b(1))^2;y = (a(2)-b(2))^2;dist = (x+y)^(1/2);
endfunction Dist=ObjFunction(Chrom,dist)
%Chrom 种群
%dist 距离矩阵
%Dist 每个个体的目标函数值,即每个个体的总距离NIND=size(Chrom,1); %种群大小Dist=zeros(NIND,1); %目标函数初始化为0for i=1:NINDroute=Chrom(i,:); %当前个体Dist(i,1)=RouteLength(route,dist); %计算当前个体的总距离end
endfunction L=RouteLength(route,dist)
%route 路线
%dist 距离矩阵
%L 该路线总距离n=length(route);route=[route route(1)];L=0;for k=1:n i=route(k);j=route(k+1); L=L+dist(i,j); end
endfunction Chrom=InitPop(NIND,N)
%种群初始化
%NIND 种群大小
%N 染色体长度
%Chrom 随机生成的初始种群Chrom=zeros(NIND,N); %种群初始化为NIND行N列的零矩阵for i=1:NINDChrom(i,:)=randperm(N); %每个个体为1~N的随机排列end
endfunction FitnV=Fitness(Obj)
%适应度函数,总距离的倒数
%输入Obj: 每个个体的总距离
%输出FitnV: 每个个体的适应度值,即总距离的倒数FitnV=1./Obj;
endfunction Selch=BinaryTourment_Select(Chrom,dist)
%Chrom 种群
%dist 距离矩阵
%Selch 二元锦标赛选择出的个体Obj=ObjFunction(Chrom,dist); %计算种群目标函数值,即每个个体的总距离FitnV=Fitness(Obj); %计算每个个体的适应度值,即总距离的倒数[NIND,N]=size(Chrom); %NIND-种群个数、N-种群长度Selch=zeros(NIND,N); %初始化二元锦标赛选择出的个体for i=1:NINDR=randperm(NIND); %生成一个1~NIND的随机排列index1=R(1); %第一个比较的个体序号index2=R(2); %第二个比较的个体序号fit1=FitnV(index1,:); %第一个比较的个体的适应度值(适应度值越大,说明个体质量越高)fit2=FitnV(index2,:); %第二个比较的个体的适应度值%如果个体1的适应度值 大于等于 个体2的适应度值,则将个体1作为第i选择出的个体if fit1>=fit2Selch(i,:)=Chrom(index1,:);else%如果个体1的适应度值 小于 个体2的适应度值,则将个体2作为第i选择出的个体Selch(i,:)=Chrom(index2,:);endend
endfunction SelCh=Recombin(SelCh,Pc)
% 交叉操作
%SelCh 被选择的个体
%Pc 交叉概率
% SelCh 交叉后的个体NSel=size(SelCh,1);for i=1:2:NSel-mod(NSel,2)if Pc>=rand %交叉概率Pc[SelCh(i,:),SelCh(i+1,:)]=OX(SelCh(i,:),SelCh(i+1,:));endend
end
function [a,b]=OX(a,b)
%输入:a和b为两个待交叉的个体
%输出:a和b为交叉后得到的两个个体L=length(a);while 1r1=randsrc(1,1,[1:L]);r2=randsrc(1,1,[1:L]);if r1~=r2s=min([r1,r2]);e=max([r1,r2]);a0=[b(s:e),a];b0=[a(s:e),b];for i=1:length(a0)aindex=find(a0==a0(i));bindex=find(b0==b0(i));if length(aindex)>1a0(aindex(2))=[];endif length(bindex)>1b0(bindex(2))=[];endif i==length(a)breakendenda=a0;b=b0;breakendend
endfunction SelCh=Mutate(SelCh,Pm,pSwap,pReversion,pInsertion)
% 变异操作
%SelCh 被选择的个体
%Pm 变异概率
%pSwap 选择交换结构的概率
%pReversion 选择逆转结构的概率
%pInsertion 选择插入结构的概率
%SelCh 变异后的个体NSel=size(SelCh,1);for i=1:NSelif Pm>=randindex=Roulette(pSwap,pReversion,pInsertion);route1=SelCh(i,:);if index==1 %交换结构route2=Swap(route1);elseif index==2 %逆转结构route2=Reversion(route1);else %插入结构route2=Insertion(route1);endSelCh(i,:)=route2;endend
endfunction index=Roulette(pSwap,pReversion,pInsertion)
%pSwap 选择交换结构的概率
%pReversion 选择逆转结构的概率
%pInsertion 选择插入结构的概率
%index 最终选择的邻域结构p=[pSwap pReversion pInsertion];r=rand;c=cumsum(p);index=find(r<=c,1,'first');
endfunction route2=Swap(route1)
%交换操作
%route1 原路线1
%route2 经过交换结构变换后的路线2n=length(route1);seq=randperm(n);I=seq(1:2);i1=I(1);i2=I(2);route2=route1;route2([i1 i2])=route1([i2 i1]);
endfunction route2=Reversion(route1)
%逆转变换
%route1 路线1
%route2 经过逆转结构变换后的路线2n=length(route1);seq=randperm(n);I=seq(1:2);i1=min(I);i2=max(I);route2=route1;route2(i1:i2)=route1(i2:-1:i1);
endfunction route2=Insertion(route1)
%插入变换
%route1 路线1
%route2 经过插入结构变换后的路线2n=length(route1);seq=randperm(n);I=seq(1:2);i1=I(1);i2=I(2);if i1<i2route2=route1([1:i1-1 i1+1:i2 i1 i2+1:end]);elseroute2=route1([1:i2 i1 i2+1:i1-1 i1+1:end]);end
endfunction PlotRoute(route,x,y)
%route 路线
%x,y x,y坐标route=[route route(1)];plot(x(route),y(route),'k-o','MarkerSize',10,'MarkerFaceColor','w','LineWidth',1.5);xlabel('x');ylabel('y');
end
相关文章:
遗传算法原理与实战(python、matlab)
遗传算法 1.什么是遗传算法 遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化论和遗传学原理的全局优化搜索算法。它通过模拟自然界中生物种群的遗传机制和进化过程来解决复杂问题,如函数优化、组合优化、机器学习等。遗传…...
《黑神话:悟空》媒体评分解禁 M站均分82
《黑神话:悟空》媒体评分现已解禁,截止发稿时,M站共有43家媒体评测,均分为82分。 部分媒体评测: God is a Geek 100: 毫无疑问,《黑神话:悟空》是今年最好的动作游戏之一ÿ…...
安卓中携程和线程的区别。携程是指什么?
在安卓和其他编程环境中,协程(Coroutine)和线程(Thread)是两种不同的并发处理机制。它们各自有独特的特点和适用场景: 线程(Thread): 线程是操作系统能够进行运算调度的最…...
部署flannel网络(master服务器执行)遇到错误
出现错误 “The connection to the server 192.168.0.23:6443 was refused - did you specify the right host or port?” 的原因通常是因为 Kubernetes API 服务器未能启动或无法访问。以下是一些可能的原因和解决方案: 解决方案 确认 Kubernetes API 服务器的状…...
超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。
阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了…...
使用托管竞价实例在Amazon SageMaker上运行机器学习训练
这是本系列文章的第二篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon SageMaker …...
AIoT智能物联网平台定义
随着科技的飞速发展,我们正步入一个由智能设备和互联网络构成的新时代。AIoT,即人工智能物联网(Artificial Intelligence of Things),是这个时代的标志性产物。本文旨在探讨AIoT智能物联网平台的定义、核心组件、应用场…...
微服务设计原则——高性能:存储设计
文章目录 1.读写分离2.分库分表3.动静分离4.冷热分离5.重写轻读6.数据异构参考文献 任何一个系统,从单机到分布式,从前端到后台,功能和逻辑各不相同,但干的只有两件事:读和写。而每个系统的业务特性可能都不一样&#…...
hbase-manager图形化界面的安装与配置
相关资料下载 夸克网盘分享 1、上传项目到linux上 解压: 切换到conf目录下:/opt/installs/hbase-manager-2.0.8-hbase-2.x/conf/ 2、修改数据库配置信息 application-druid.yml 3、创建hbase-manager数据库(注意字符集编码),导入数据库脚本…...
STM32之继电器与震动传感器的使用,实现震动灯
在STM32的外设应用中,继电器扮演着重要的角色。继电器作为一种电控制器件,其主要作用是通过小电流控制大电流的通断,实现电路的自动控制和保护。具体来说,继电器在STM32外设中的作用可以归纳为以下几点: 电路隔离与保…...
RS232(旧协议)与RS485(新协议)
RS232: RS485: RS485和RS232是两种常见的串行通信标准,它们在通信距离、速度、拓扑结构等方面存在显著差异。以下是它们的主要区别: 1. 物理层接口 RS232: 使用单端信号传输,即信号通过一根信号线和一根公共地线(GND)…...
android13顶部状态栏里面调节背光,不隐藏状态栏面板
总纲 android13 rom 开发总纲说明 目录 1.前言 2.代码分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 android13顶部状态栏里面调节背光,这个时候状态栏面板会被隐藏掉,有些需求就需要不隐藏这个面板。 2.代码分析 查找亮度条属性 id/brightness_slider ./frameworks/b…...
Webrtc之SDP协议
SDP简介 SDP 最常用于 RTC 实时通话的协商过程,在 WebRTC 中,通信双方在连接阶段使用 SDP 来协商后续传输过程中使用的音视频编解码器(codec)、主机候选地址、网络传输协议等。 在实际的应用过程中,通信双方可以使用 HTTP、WebSocket、Data…...
mfc140u.dll丢失错误解决方法的基本思路——四种修复mfc140u.dll的方法
当遇到mfc140u.dll丢失的错误时,意味着你的系统中缺失了一个重要的动态链接库文件,该文件是微软 Visual C Redistributable for Visual Studio 2015 的一部分,对于运行那些用 Visual C 开发的程序是必需的。今天就教你mfc140u.dll丢失错误解决…...
Python Django 后端架构开发: 中间件架构设计
🌟 Python Django 后端架构开发: 中间件架构设计 🔹 中间件项目测试:自定义中间件的 process_response 与 process_view 方法 在 Django 中,中间件是一种用于处理请求和响应的钩子,可以在视图处理前后对请…...
HTTP的认证方式
0.HTTP认证相关的一些基本概念 0.1 HTTP保护空间(HTTP Protection Space) 也称为认证领域(Authentication Realm),是指在HTTP认证中用来定义一组受保护资源的范围。保护空间通常由一个realm标识符来表示,它定义了用户需要提供凭据(如用户名和密码)才能访问的资源集合…...
10分钟学会LVM逻辑卷
华子目录 前言认识LVMLVM基本概念LVM整体流程LVM管理命令pvs,vgs,lvs命令pvs基本用法选项示例 vgs基本用法选项示例 lvs基本用法 pvcreate,vgcreate,lvcreate命令pvcreate示例 vgcreate基本用法示例选项 lvcreate基本用法示例 pvr…...
【gitlab】gitlab-ce:17.3.0-ce.0 之2:配置
参考阿里云的教程docker的重启 sudo systemctl daemon-reload sudo systemctl restart docker配置 –publish 8443:443 --publish 8084:80 --publish 22:22 sudo docker ps -a 當容器狀態為healthy時,說明GitLab容器已經正常啟動。 root@k8s-master-pfsrv:~...
第七十四:前端实现点击页面某个菜单跳转到对应的锚点功能
1.用js来实现 scrollIntoView方法 先定义个id或者class随意,因为我是循环好几个小模块所以用动态的来实现 点击的时候传对应的类名进行滑动 document.getElementById(item.variableCode).scrollIntoView({behavior:“smooth”}); 加上behavior:“smooth” 进行平…...
PyTorch分布式训练全攻略:DistributedDataParallel精解与实战
标题:PyTorch分布式训练全攻略:DistributedDataParallel精解与实战 在深度学习飞速发展的今天,模型的规模和数据集的体量不断增长,单机单卡的训练方式已难以满足需求。分布式训练以其卓越的扩展性和效率,成为解决这一…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
