遗传算法解决函数优化问题

news2024/11/15 20:10:53

遗传算法解决函数优化问题

  • 作者: Cukor丘克
  • 环境: MatlabR2020a + vscode

为什么要学习遗传算法

为什么要学习遗传算法,或者说遗传算法有什么厉害的地方。例如求解以下函数优化问题: m i n f ( x 1 , x 2 ) = x 1 2 + x 1 2 + 25 ∗ ( s i n 2 x 1 + s i n 2 x 2 ) , − 10 ≤ x 1 ≤ 10 , − 10 ≤ x 2 ≤ 10. min f(x_1, x_2)=x^2_1+x^2_1+25*(sin^2x_1+sin^2x_2), -10 \le x_1 \le 10, -10 \le x_2 \le 10 . minf(x1,x2)=x12+x12+25(sin2x1+sin2x2),10x110,10x210.

方法一:

这个时候你可能想从设一个变量 i i i从-10到10,一个变量 j j j从-10到10,每个涉及到的点都遍历,然后比较前后数值取最大的那个,当遍历完成了就确定了最大值。

方法二:

对函数求导,然后令导为零,取最小值。

两种方法在一般理论上都可行。但是有各自的缺点。

方法一的缺点:

每次都从头开始遍历,直到把所有的都遍历完才能确定最值,太耗时间,而且大多数做的都是没有意义的比较。而且计算机对浮点数的比较有精度的要求,有时候两个数只差一点点,计算机就会将它们当作是相等的。

方法二的缺点:

不是所有函数的导函数都是容易求解的,而且当出现很多个峰值或谷值的时候也是比较麻烦,就展现不出求导的优势了。

这个时候就需要像遗传算法这样的智能优化算法来求解。

目标函数的图像

在这里插入图片描述

遗传算法的基本认识

演化计算

生物进化是指一个种群经过漫长的时间所发生的累积变化,这些变化是由于生物体的基因变异或在繁殖期间以不同方式重组基因所产生的,而且这些变化可以被遗传到生物体的后代。

生物的进化可以看成是一个优化过程,而优化的结果是产生能够很好地适应环境的生物体。现在地球上的种类繁多‘结构复杂的生物都是通过漫长的由简单到复杂、由低级到高级的进化过程而得到的优化结果。生物的进化过程也可以看成是在众多可能性中搜索“解”的一种方法

演化算法

演化计算所涉及的算法称为演化算法。所有的演化算法都有一个共同点:求解问题的过程也就是模拟大自然生物进化的过程

演化算法模仿自然进化过程,在求解问题的过程中,保持一个个体的种群,每个个体表示问题的一个可能解。个体适应环境的程度用一个适应函数判断,每个个体安装适应函数来度量该个体作为问题解的好坏程度。

遗传算法是应用最为广泛的一种演化算法。遗传算法是美国密歇根大学的J.H.Holland教授在研究自然界自适应现象的过程中提出来的。

算法流程图

在这里插入图片描述

参数初始化

主要影响遗传算法的四个参数

  1. 种群大小(20~200)
  2. 交叉概率(0.7~0.9)
  3. 变异概率(0.02~0.2)
  4. 迭代次数(20~500)

次要的参数

  1. 下限
  2. 上限
  3. 保留小数点后t位
  4. 编码长度数组
  5. 个体编码长度

个体编码

设计演化算法的第一步是对问题的可能解进行编码,其目的是为了能够有效地执行遗传操作。

演化算法不是直接作用在问题的解空间上的,而是交替地作用在编码空间和解空间上。

编码是一个从问题的解空间到编码空间的映射

编码可以是二进制编码也可以是Gray码编码,一般就使用二进制编码。

一个编码就对应着一个实数解,一个实数解对应一个编码。这就需要编码的长度一定要足够大,这样才能把所有的可能解都使用编码表示 。

实例:

a j ≤ x j ≤ b j a_j \le x_j \le b_j ajxjbj所要求的精度为小数点后t位,这要求将区间 [ a j , b j ] [a_j, b_j] [aj,bj]划分为至少 ( b j − a j ) 1 0 t (b_j-a_j)10^t (bjaj)10t份。假设表示变量 x j x_j xj的位串长度用 l j l_j lj表示,则 l j l_j lj可取为满足下列不等式的最小正整数 m m m: ( b j − a j ) 1 0 t ≤ 2 m − 1 , (b_j-a_j)10^t \le 2^m-1, (bjaj)10t2m1,

x j x_j xj的二进制表示转换为十进制表示可按下式计算: x j = a j + d e c i m a l ( s u b s t r i n g j ) ∗ ( b j − a j ) / ( 2 k − 1 ) , k = l j , x_j=a_j+decimal(substring_j)*(b_j-a_j)/(2^k-1), k=l_j, xj=aj+decimal(substringj)(bjaj)/(2k1),k=lj,

编码

现有 − 3.0 ≤ x 1 ≤ 12.1 -3.0 \le x_1 \le 12.1 3.0x112.1,精度为小数点后t位, t = 4 t=4 t=4,则带入上述公式 ( 12.1 − ( − 3.0 ) ) ∗ 1 0 4 = 151000 , (12.1-(-3.0))*10^4=151000, (12.1(3.0))104=151000,

2 n − 1 < 151000 ≤ 2 m − 1 , n = 17 , m = 18 , 2^n-1<151000 \le 2^m-1,n=17,m=18, 2n1<1510002m1n=17,m=18,

所以表示 x j x_j xj的二进制位串的长度为 l 1 = 18 , l_1=18, l1=18,

同理 4.1 ≤ x 2 ≤ 5.8 4.1 \le x_2 \le 5.8 4.1x25.8可以使用 l 2 = 15 l_2=15 l2=15的二进制位串来表示。

而一个个体是由 x 1 、 x 2 x_1、x_2 x1x2共同表示的,所以种群中的每个个体应该使用 l 1 + l 2 = 33 l_1+l_2=33 l1+l2=33的二进制位串表示。

解码

给定下列33位二进制位串: 011011100110001010110011011001101 , 011011100110001010110011011001101, 011011100110001010110011011001101,

那么表示前18位所表示的变量 x 1 x_1 x1的值为 x 1 = − 3.0 + d e c i m a l ( 011011100110001010 ) ∗ ( 12.1 − ( − 3.0 ) ) / ( 2 k − 1 ) , k = 18 , x_1=-3.0+decimal(011011100110001010)*(12.1-(-3.0))/(2^k-1), k=18, x1=3.0+decimal(011011100110001010)(12.1(3.0))/(2k1),k=18,

求得 x 1 = − 3.0 + 113034 ∗ 15.1 / 262143 = 3.5110 x_1=-3.0+113034*15.1/262143=3.5110 x1=3.0+11303415.1/262143=3.5110

x 2 x_2 x2解码同理。

计算个体的编码长度的Matlab代码如下:

% 主函数中如下调用
L = getcodelen(a, b, t);    % 编码长度数组
len = sum(L);               % 编码长度
% 返回的是一个编码长度数组,后续代码需要用到它,所以把它和个体的编码长度分开
function L = getcodelen(a, b, t)
%getcodelen - 计算a到b的十进制数的最大二进制编码长度
%
% Syntax: L = getcodelen(a, b, t)
%
% Long description
    n = length(a);
    L = zeros(n, 1);
    for i = 1:n
       while ((b(i) - a(i))*10.^t) > ((2^L(i)) - 1)
          L(i) = L(i) + 1;
       end
    end
end

初始化种群

因为使用的是二进制编码,所以只需要确定种群的大小和编码的长度即可初始化一个种群。然后不断迭代产生最优的个体。

初始化种群的Matlab代码如下:

function pop = initpop(popsize, len)
    pop = round(rand(popsize, len));
end

疑问环节:

问:因为种群是随机生成的,有没有一种可能,初始化的个体编码不能和变量的定义域对应。

答:没有这种可能。因为在设计编码的时候就是按照定义域a到b的范围设定的,所以不管怎么随机得到的二进制位串,解码之后都是在a到b的区间内。并且在解码的公式中可以看出不会将二进制位串解码到a到b的区间之外。x=a+…就表示了最小值一定是a,如果 d e c i m a l ( s u b s t r i n g ) / ( 2 l − 1 ) = 1 decimal(substring)/(2^l-1)=1 decimal(substring)/(2l1)=1,那么整个式子就剩下 x = a + b − a = b x=a+b-a=b x=a+ba=b,所以最大也就只能到b.

计算适应值

适应函数是区分种群个体好坏的唯一方式,是进行选择的基础。

在设计适应函数时,应遵守以下原则:

  1. 最优解与具有最大适应值的个体相对应
  2. 适应值能够反映个体质量的差异
  3. 计算量应尽可能小

此外,有些选择策略,如轮盘赌选择,还要求适应值非负。

常见的适应函数

  • 原始适应函数。原始适应函数是直接由目标函数变化而来。当优化问题为 m a x f ( x ) max f(x) maxf(x)时,适应函数为 f ( x ) f(x) f(x),当优化问题为 m i n f ( x ) min f(x) minf(x)时,适应函数为 − f ( x ) -f(x) f(x).
  • 简单适应函数。为了防止适应值为负的情形,常常需要对目标函数作简单变换。对于优化问题 m a x f ( x ) max f(x) maxf(x),适应函数可以定义为 1 / ( c m a x − f ( x ) ) , 1/(cmax-f(x)), 1/(cmaxf(x)),

其中, c m a x > f ( x ) cmax>f(x) cmax>f(x).对应优化问题 m i n f ( x ) min f(x) minf(x),适应函数可以定义为 1 / ( f ( x ) − c m i n ) , 1/(f(x)-cmin), 1/(f(x)cmin),

其中, f ( x ) > c m i n f(x)>cmin f(x)>cmin.

function fitvalue = fitness(pop, f, a, b, L, cmin)
%fitness - 计算适应值
%
% Syntax: fitvalue = fitness(pop, f, a, b, L, cmin)
%
% Long description
    [px, ~] = size(pop);
    fitvalue = zeros(px, 1);
    x = zeros(px, length(L));
    for i = 1:px
        x(i, :)  = decode(pop(i, :), a, b, L);
        fitvalue(i) = 1./(f(x(i, 1), x(i, 2)) - cmin);
    end
end

父体选择

选择或复制操作是决定哪些个体可以进入下一代。选择哪些适应值比较高的个体。我们采用选择策略是轮盘赌选择,因为这个方法比较简单,也比较直观。

轮盘的设计

  1. 累加适应值,得到一个常数F
  2. 每个适应值除以F,得到了每个个体的适应值所占整体的份数 p i p_i pi
  3. 累加每个 p i p_i pi,实现摆盘操作

转动轮盘

随机地产生一些随机数,相当于转动了轮盘。可以使用rand函数来实现。

function newpop = parent_select(pop, fitvalue)
%parent_select - 父体选择
%
% Syntax: newpop = parent_select(pop, fitvalue)
%
% Long description
    [px, py] = size(pop);
    newpop = zeros(px, py);
    %% 轮盘的设计
    p = cumsum(fitvalue./sum(fitvalue));
    %% 转动轮盘
    r = sort(rand(px, 1));  % 排序是为了减少频繁变动轮盘的指针
    j = 1;
    for i = 1:px
        while r(i) > p(j)
            j = j + 1;
        end
        % r(i) <= p(j)
        newpop(i, :) = pop(j, :);
    end
end

交叉

遗传算子的设计是与编码密切相关的。因为之前采用的编码是二进制编码,所以后面提到的遗传算子的交叉、变异都是基于二进制位串的。

  1. 点式杂交。
    1. 单点杂交
    2. 多点杂交

本次案例采用的杂交方式是单点杂交。

单点杂交算法过程:

设二进制位串的长度是 L L L,首先随机地产生一个整数 p o s pos pos作为杂交点的位置, 1 ≤ p o s ≤ L 1 \le pos \le L 1posL,然后将两个父体在该杂交点右边的子串进行交换,产生两个后代个体。

例如:给定两个父体如下:

v 1 = ( 100111000101   ∣   01011001110 ) , v_1=(100111000101\ |\ 01011001110), v1=(100111000101  01011001110)
v 2 = ( 100010111100   ∣   11001100101 ) . v_2=(100010111100\ |\ 11001100101). v2=(100010111100  11001100101).

假设杂交点的位置是13,也就是上面画 |之后的二进制位串进行交叉。结果如下:
v 1 ′ = ( 100111000101   ∣   11001100101 ) , v' _1 =(100111000101\ |\ 11001100101), v1=(100111000101  11001100101)

v 2 ′ = ( 100010111100   ∣   01011001110 ) , v' _2 =(100010111100\ |\ 01011001110), v2=(100010111100  01011001110)

多点杂交算法过程:

设二进制位串的长度是 L L L,多点杂交在$1~ ~\ ~L-1 $之间随机地选择多个杂交点,然后再保持第一个杂交点左边的对应字串不交换的情形下,间隔地交换两个父体在杂交点之间的对应字串,生成两个后代 。

例如,给定两个父体如下:

f 1 = ( 1000111110   ∣   10101110101   ∣   001001 ) , f_1=(1000111110~|~10101110101~|~001001), f1=(1000111110  10101110101  001001),

f 2 = ( 1011011101   ∣   00100110100   ∣   110101 ) . f_2=(1011011101~|~00100110100~|~110101). f2=(1011011101  00100110100  110101).

假设所选择的两个杂交点分别为11和22,那么经两点杂交后,所得到的两个后代个体如下:

s 1 = ( 1000111110   ∣   00100110100   ∣   001001 ) , s_1=(1000111110~|~00100110100~|~001001), s1=(1000111110  00100110100  001001),

s 2 = ( 1011011101   ∣   10101110101   ∣   110101 ) . s_2=(1011011101~|~10101110101~|~110101). s2=(1011011101  10101110101  110101).

在多点杂交中,有三段杂交的也是类似的操作。

  1. 均匀杂交。

均匀杂交是依概率交换两个父体位串的每一位,其过程如下:

先随机地产生一个与父体等长的二进制位串,其中,0表示不交换,1表示交换,这个二进制位串称为杂交模板,然后根据所产生的杂交模板对两个父体进行杂交。

例如,给定两个父体如下:

f 1 = ( 01001 ) , f_1=(01001), f1=(01001),

f 2 = ( 10101 ) . f_2=(10101). f2=(10101).

假设所产生的杂交模板为:

( 00101 ) (00101) 00101

所得到的两个后代如下:

s 1 = ( 01101 ) , s_1=(01101), s1=(01101),

s 2 = ( 10001 ) . s_2=(10001). s2=(10001).

下面给出单点杂交的Matlab代码,其他的两种杂交算法由你自己实现,也很好实现的。

function newpop = crossover(pop, L, pc)
%crossover - 交叉
%
% Syntax: newpop = crossover(pop, L, pc)
%
% Long description
    [px, ~] = size(pop);
    newpop = pop;
    start = 3;  % 奇数的情况,从第3个个体开始
    if mod(px, 2) == 0
        start = 2;
    end
    n = length(L);
    for i = start:2:px
        if rand <= pc
        rear = 0;
            for j = 1:n
                front = rear + 1;
                rear = front + L(j) - 1;
                [newpop(i, front:rear), newpop(i-1, front:rear)] ...
                  = sub_crossover(pop(i, front:rear), pop(i-1, front:rear));
            end
        end
    end
end

function [newcode1, newcode2] = sub_crossover(code1, code2)
%sub_crossover - 子交叉函数
%
% Syntax: [newcode1, newcode2] = sub_crossover(code1, code2)
%
% Long description
    n = length(code1);
    pos = -1;           % 交叉点
    while pos < 1
        pos = ceil(rand * n);
    end
    newcode1 = code1;
    newcode2 = code2;
    newcode1(pos:n) = code2(pos:n);
    newcode2(pos:n) = code1(pos:n);
end

变异

二进制编码时的变异算子非常简单,只是依一定概率 p m p_m pm(变异概率)将所选个体的位串取反,即若是1则取0;若是0,则取1.

变异的Matlab代码

function newpop = mutation(pop, pm)
%mutation - 变异
%
% Syntax: newpop = mutation(pop, pm)
%
% Long description
    [px, py] = size(pop);
    newpop = pop;
    cnt = ceil(rand*py/2);      % 确定变异点的个数
    pos = mod(ceil(rand(px,cnt) * py), py) + 1;  % 变异点的位置
    for i = 1:px
        if rand <= pm
            for j = 1:cnt
                newpop(i, pos(i, j)) = ~newpop(i, pos(i, j));
            end
        end
    end
end

到此为止,已经将遗传算法的主体部分介绍完毕,接下来就是回到实际问题中,使用遗传算法解决它,即绘图分析、结果分析之类的。

回到问题

原问题是求解以下函数优化问题: m i n f ( x 1 , x 2 ) = x 1 2 + x 1 2 + 25 ∗ ( s i n 2 x 1 + s i n 2 x 2 ) , − 10 ≤ x 1 ≤ 10 , − 10 ≤ x 2 ≤ 10. min f(x_1, x_2)=x^2_1+x^2_1+25*(sin^2x_1+sin^2x_2), -10 \le x_1 \le 10, -10 \le x_2 \le 10 . minf(x1,x2)=x12+x12+25(sin2x1+sin2x2),10x110,10x210.

那就把图画出来,用遗传算法把每一代的最优个体所对应图像上的点绘制出来,最后在历代最优个体中选出适应值最高的个体,这个个体(可能解)就当作是函数 f ( x 1 , x 2 ) f(x_1,x_2) f(x1,x2)的全局最优解。

下面给出本次案例的主函数的matlab代码。所涉及到的其他调用子函数已经在上面实现,在自己编写的时候记得自己另创建一个对应的*.m文件。

%% 遗传算法解决优化问题
%% 清屏
clear; clc;
%% 目标函数
f = @(x1, x2)(x1.^2 + x2.^2 + 25*(sin(x1).^2 + sin(x2).^2));
%% 参数初始化
% 主要影响遗传算法的四个参数
popsize = 100;   % 种群大小
pc = 0.8;        % 交叉概率
pm = 0.05;       % 变异概率
gen = 200;       % 迭代次数
% 次要的参数
a = [-10.0 -10.0];  % 下限
b = [10.0 10.0];    % 上限
t = 4;              % 保留小数点后t位
L = getcodelen(a, b, t);    % 编码长度数组
len = sum(L);               % 个体编码长度
cmin = -100;
% 与画图有关的变量
x = zeros(gen, length(L));  % 每一代的最优解的x分量
z = zeros(gen, 1);  % 每一代的最优解的适应值
%% 初始化种群
pop = initpop(popsize, len);
%% 开始迭代
for it = 1:gen
    fitvalue = fitness(pop, f, a, b, L, cmin);      % 计算适应值
    [z(it), best_index] = max(fitvalue);            % 记录每一代的最优个体(最高适应值、下标)
    x(it, :) = decode(pop(best_index, :), a, b, L);
    newpop = parent_select(pop, fitvalue);          % 父体选择
    newpop = crossover(newpop, L, pc);              % 交叉
    newpop = mutation(newpop, pm);                  % 变异
    pop = newpop;
end
%% 打印最优解
[best_fitvalue, best_index] = max(z);
best_solution = x(best_index, :);
best_value = f(best_solution(1), best_solution(2));
disp(['最优解为: ' num2str(best_solution)]);
disp(['最优适应值为:' num2str(best_fitvalue)]);
disp(['最小值为:' num2str(best_value)]);
%% 画图
figure(1)
[X, Y] = meshgrid(a(1):0.05:b(1), a(2):0.05:b(2));
Z = f(X, Y);
mesh(X, Y, Z);
text(x(:, 1), x(:, 2),f(x(:,1), x(:, 2)), 'o', 'Color','blue', 'Fontsize', 8);
text(best_solution(1), best_solution(2), best_value, 'O', 'Color', 'red', 'FontSize', 15)
hold on;
best = z;
for i = 2:gen
    best(i) = max(best(i), best(i-1));
end
figure(2)
plot(z);
figure(3);
plot(best);

结果图


在这里插入图片描述

                            图1 原函数图像及各代最优个体散点

在这里插入图片描述

                                    图2 适应值变化曲线

在这里插入图片描述

                          图3 历代适应值最大的适应值变化曲线

从图1可以看出,通过遗传算法计算出的最优解基本贴近原函数的的最小值的位置,说明这个最优解可行。从图2和图3可以看到遗传算法是可以收敛到最优解的。本次运行程序大概在第145代左右确定全局最优解,虽然不是标准最优解 ( 0 , 0 ) (0,0) (0,0),但是这个最优解已经贴近标准最优解了。

同时本文章也有配套的视频讲解,下面是笔者在bilibli发布的遗传算法的讲解视频链接:

Cukor丘克-《通过例子学习遗传算法(遗传算法解决函数优化问题)》


参考文献

[1] 黄竞伟, 朱福喜, 康立山. 《计算智能》. 科学出版社,2010.6.

[2] 温正. 《智能优化算法》.

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

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

相关文章

【ACWING】【图的深度优先遍历】【846树的重心】

给定一颗树&#xff0c;树中包含 n个结点&#xff08;编号 1∼n&#xff09;和 n−1条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff0c;如果将这个点删除后&…

js复习之正则表达式正向肯定与否定预查询

正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 正则表达式_百度百科 除开常用基本匹配模式&#xff0c;偶尔也会用到…

回顾艰难且不失温度的 2022 年 | 文中附「双12免单王」获奖名单

今天是 2022 年最后一天&#xff0c;回忆往昔&#xff0c;这一年经历了太多的不可思议和无可奈何之事。在年末的短短几周&#xff0c;寒气长驱直下以惊人的速度传给每一个人。我们真诚地希望大家都可以平安渡过这一难关。 即使步步难行&#xff0c;亦要踱步前行&#xff01;无…

力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《190. 颠倒二进制位、191. 位1的个数、202. 快乐数》。 目…

Gradle学习笔记之依赖

文章目录依赖的方式直接依赖项目依赖本地jar包依赖依赖的类型api和implementation的区别依赖冲突及解决方案移除某个依赖不允许依赖传递强制使用某个版本依赖冲突时立刻构建失败依赖的方式 Gradle中的依赖方式有直接依赖、项目依赖和本地jar包依赖三种&#xff1a; dependenc…

【一起从0开始学习人工智能0x02】字典特征抽取、文本特征抽取、中文文本特征抽取

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录什么是特征工程&#xff1f;用什么做&#xff1f;1.特征提取特征值化&#xff1a;特征提取API字典特征提取---向量化---类别--》one-hot编码哑变量one-hot-------直接1234会产生歧义&#xff0c;不公平应用场…

Python 10k+ 面试试题,看看你是否掌握

前言 大家早好、午好、晚好吖 ❤ ~ 面试实战题&#xff1a;采集世界最大旅游平台Tripadvisor 另我给大家准备了一些资料&#xff0c;包括: 2022最新Python视频教程、Python电子书10个G &#xff08;涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题&#xff…

Python GUI编程:音乐播放器(多线程、爬虫、进度条、文件)

文章目录1. 程序运行结果2.程序实现原理3. GUI布局4. 功能介绍5. 代码实现1. 程序运行结果 Python实现音乐播放器(爬虫、多线程、进度条、文件)2.程序实现原理 本音乐播放器GUI方面运用Python的tkinter实现&#xff0c;播放的音乐来自网络爬虫和本电脑已经有的。为了使整个程序…

Android studio设置全屏显示的两种方式

两种在Androidstudio中设置全屏的方式&#xff0c;推荐第二种 第一种&#xff08;Java文件中设置&#xff09; 直接在onCreate()函数中设置 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);package com.exa…

MARKETS AND MARKET LOGIC——The Market‘s Principles (6)_3

市场的组成——对行为观察的反思 制定市场理解 理解市场逻辑将有助于每个参与者提高其在市场上成功的可能性&#xff0c;因为他将能够阅读市场活动并接收市场生成的信息&#xff0c;这些信息很少有参与者承认或理解。这一信息特别涉及市场如何接受或拒绝随着时间的推移而升高或…

Linux用户标识符UID与GID和用户账号

1.用户标识符UID和GID UID 表示的是用户的标识&#xff08;User Identification&#xff09; GID 表示的是用户组的标识&#xff08;Group Identification&#xff09; 显示用户ID信息。 命令&#xff1a;id username 2.用户账号 用户和用户组的信息都存放在…

RabbitMQ(一)Windows下载安装

目录一、下载安装包二、安装erlang三、安装RabbitMQ四、配置RabbitMQ管理界面官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 一、下载安装包 RabbitMQ Windows下载地址&#xff1a;https://www.rabbitmq.com/in…

001. Nginx场景,优点,组成部分和编译

目录一&#xff1a; Nginx三个重要的使用场景二&#xff1a; Nginx的优点三&#xff1a;Nginx文件的组成部分四&#xff1a;编译Nginx一&#xff1a; Nginx三个重要的使用场景 静态资源服务 疑问&#xff1a;为什么需要静态资源服务&#xff1f;答&#xff1a; 在整个的web请求…

string_string数据类型概括

目录string数据类型创建字符串的三种方式检查字符串的方法常用的字符串方法字符串遍历切割字符串为数组​截取子串判断某个字符串是否出现在当前字符串中文本匹配-match、(es6)matchAll文本替换-replace、(es6)replaceAll(es6)获取某个位置的字符串有关ASCII码的方法获取某字符…

Good Bye 2022: 2023 is NEAR C Koxia and Number Theory

Problem - C - Codeforces 题意&#xff1a; 给定一个数列a&#xff0c;问你是否存在一个数 x 使得所有数加上x之后两两互质 思路&#xff1a; 一、 我们知道一个结论&#xff0c;一些数两两之间互质&#xff0c;就说明所有数之间的质因子都不重合 如果要我们去判断一堆数…

回顾与展望Zebec举办的“Web3.0 TechHive Summit 2022 大会”

随着流支付生态 Zebec 不断的实现商业进展&#xff0c;我们看到&#xff0c;其生态从Solana陆续的迁移到以BNB Chain为代表的EVM链上&#xff0c;并推出了以ZK-Rollup为主要技术手段的公链Zebec Chain&#xff0c;以在未来服务且满足于Web2、Web3世界的发展需求。 Zebec正在成…

若依框架:前端项目结构与初始页面渲染流程

目录 main.js入口文件 前端页面初始化 package.json配置文件 vue-cli&#xff1a;.env模式和环境变量配置 vue-cli三大核心构件 CLI 服务与npm scripts vue-cli-service命令与.env模式配置文件 .env模式和环境变量配置 vue.config.js&#xff1a;项目启动-自动打开默认…

pycharm如何设置python文件模板

pycharm如何设置python文件模板设置文件模板预定义变量设置自定义模板变量设置文件模板 打开设置界面 进入编辑器->文件和代码模板 此处我只写了文件头注释模板&#xff0c;也可以加一些默认代码&#xff0c;比如&#xff1a; python if __name__ "__main__":…

NC65在单据添加按钮跳转到固定单据,且进行数据初始化

实现功能 下面两个是按钮 下面红框里面的内容是上面单据带过来的 上面就是本地代码实现的功能 具体实现代码 提前约定 为了方便称呼&#xff0c;这里把第一张图称为上游单据&#xff0c;第二张图为下游单据 所有代码AggVo都要替换成你自己的 配置文件 上游单据拓展配置文…

2023年天津美术学院专升本专业课线上考试安排准备及设备操作说明

天津美术学院2023年高职升本招生专业考试考生须知及操作说明一、考试时间安排二、考前准备 (一)纸张及其他材料(二)考试设备及网络 1.考生须提前准备好至少两部智能手机&#xff0c;为确保网络考试顺利进行&#xff0c;建议考生使用最近3年上市的主流品牌手机&#xff08;如iPh…