【人工智能Ⅰ】实验3:蚁群算法

news2024/11/16 1:29:43

实验3  蚁群算法的应用

一、实验内容

TSP 问题的蚁群算法实现。

二、实验目的

1. 熟悉和掌握蚁群算法的基本概念和思想;

2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。

三、实验原理

1.算法来源

蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径。

2.原理

正反馈:

单个的蚂蚁为了避免自己迷路,它在爬行时,同时也会释放一种特殊的分泌物——信息素(Pheromone),而且它也能觉察到一定范围内的其它蚂蚁所分泌的信息素,并由此影响它自己的行为。当一条路上的信息素越来越多(当然,随着时间的推移会逐渐减弱),后来的蚂蚁选择这条路径的概率也就越来越大,从而进一步增加了该路径的信息素浓度。

多样性:

同时为了保证蚂蚁在觅食的时候不至走进死胡同而无限循环,蚂蚁在寻找路径的过程中,需要有一定的随机性,虽然在觅食的过程中会根据信息素的浓度去觅食,但是有时候也有判断不准,环境影响等其他很多种情况,还有最终要的一点就是当前信息素浓度大的路径并不一定是最短的路径,需要不断的去修正,多样性保证了系统的创新能力。

正是这两点的巧妙结合才使得蚁群的智能行为涌现出来。

3.具体实现需要解决的两个首要问题

(1)如何实现单个蚂蚁寻路的过程;

(2)如何实现信息素浓度的更新。

四、实验要求

1.在3个不同城市规模(如30个城市,50个城市,100个城市)的条件下,可多次运行,编程利用蚁群算法寻找TSP问题的最短路径。

为探究蚁群算法的基本结果,本实验【1】中的测试环境中的各类参数依次是: 迭代次数max_iter = 200、信息素影响因子alpha = 2、距离影响因子beta = 5、信息素挥发速率rho = 0.5、信息素强度q = 100。

代码中展现如下:

num_cities, distance_matrix, num_ants, max_iter=200, alpha=2, beta=5, rho=0.5, q=100

为更好地展示不同城市规模下的运行结果,本实验测试了共9次独立的运行结果(每种情况3次),并制作表1.a至表1.c,分别描述城市规模在30、50、100情况下的运行时间和适应度。汇总结果如表1所示,各类城市规模情况下的ACO解决TSP的可视化图像示例如图1至图3所示。


图1. 城市规模为30时,ACO解决TSP的可视化图像示例

 

图2. 城市规模为50时,ACO解决TSP的可视化图像示例

图3. 城市规模为100时,ACO解决TSP的可视化图像示例

 

表1. 蚁群算法求解不同规模的TSP问题的结果

城市规模

最好适应度

平均适应度

平均运行时间

30

483.71

484.61

14.67

50

609.19

615.07

58.80

100

806.80

828.73

506.89

表1.a. 当城市规模为30时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

489.61

15.03

2

483.71

14.40

3

485.50

14.58

平均结果

484.61

14.67

表1.b. 当城市规模为50时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

615.44

58.95

2

620.58

58.39

3

609.19

59.06

平均结果

615.07

58.80

表1.c. 当城市规模为100时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

806.80

505.75

2

831.36

511.10

3

848.04

503.83

平均结果

828.73

506.89

2.调试代码,列表比较蚁群算法设定不同参数时的计算结果。

为更好地展示不同参数(信息素因子、启发函数因子、信息素常数、信息素挥发因子、蚁群数量)下的运行结果,本实验确定城市规模为30且迭代次数为200,测试了共33次独立的运行结果(每种情况3次),并制作表2.a至表2.k,分别描述表2中各种情况下的最优解、运行时间和适应度。

表2. 不同参数的求解结果

蚁群数量

信息素因子α

启发函数因子β

信息素常数Q

信息素挥发因子ρ

最好适应度

平均适应度

45

2

5

100

0.5

483.71

484.61

45

1

5

100

0.5

479.21

482.21

45

4

5

100

0.5

483.71

494.72

45

2

3

100

0.5

483.71

484.30

45

2

10

100

0.5

483.71

488.59

45

2

5

10

0.5

486.90

490.61

45

2

5

1000

0.5

490.03

490.84

45

2

5

100

0.1

483.71

493.52

45

2

5

100

0.8

483.71

485.81

10

2

5

100

0.5

491.76

503.46

70

2

5

100

0.5

483.71

483.71

表2.a. 当蚁群数量为45、信息素因子为2、启发函数因子为5、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

489.61

15.03

2

483.71

14.40

3

485.50

14.58

平均结果

484.61

14.67

表2.b. 当蚁群数量为45、信息素因子为1、启发函数因子为5、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

479.21

14.57

2

483.71

15.29

3

483.71

15.15

平均结果

482.21

15.00

表2.c. 当蚁群数量为45、信息素因子为4、启发函数因子为5、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

485.50

14.61

2

514.95

14.25

3

483.71

14.20

平均结果

494.72

14.35

表2.d. 当蚁群数量为45、信息素因子为2、启发函数因子为3、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

483.71

14.71

2

483.71

14.95

3

485.50

14.69

平均结果

484.30

14.78

表2.e. 当蚁群数量为45、信息素因子为2、启发函数因子为10、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

492.47

14.23

2

489.61

14.14

3

483.71

13.96

平均结果

488.59

14.11

表2.f. 当蚁群数量为45、信息素因子为2、启发函数因子为5、信息素常数为10、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

492.47

14.14

2

492.47

14.35

3

486.90

14.42

平均结果

490.61

14.30

表2.g. 当蚁群数量为45、信息素因子为2、启发函数因子为5、信息素常数为1000、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

490.03

14.56

2

490.03

14.67

3

492.47

14.59

平均结果

490.84

14.60

表2.h. 当蚁群数量为45、信息素因子为2、启发函数因子为5、信息素常数为100、信息素挥发因子为0.1时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

498.50

14.34

2

483.71

13.86

3

498.37

14.04

平均结果

493.52

14.08

表2.i. 当蚁群数量为45、信息素因子为2、启发函数因子为5、信息素常数为100、信息素挥发因子为0.8时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

483.71

14.12

2

483.71

13.85

3

490.03

13.89

平均结果

485.81

13.95

表2.j. 当蚁群数量为10、信息素因子为2、启发函数因子为5、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

491.76

3.25

2

516.42

3.19

3

502.22

3.24

平均结果

503.46

3.22

表2.k. 当蚁群数量为70、信息素因子为2、启发函数因子为5、信息素常数为100、信息素挥发因子为0.5时,不同次运行情况下的结果

运行次数序号

输出的距离最优解

输出的运行时间/s

1

483.71

23.05

2

483.71

22.1

3

483.71

22.34

平均结果

483.71

22.49

3.比较与实验2中遗传算法的效果差异。

收敛速度:遗传算法通常在早期迭代中快速找到较好的解,而蚁群算法可能需要更多的迭代次数。

执行效率:遗传算法在每一代中进行种群评估、选择、交叉和变异,其执行效率取决于种群规模和所选操作的复杂性。而蚁群算法通常在执行过程中涉及较多的局部搜索和信息素更新,这可能使得每次迭代的计算更加密集。

解的质量:蚁群算法倾向于更加稳健地搜索解空间,而遗传算法可能更快地收敛到一个解,但可能是局部最优解。

参数敏感性:两种算法都对参数设置敏感,但遗传算法需要更细致的参数调整。

稳定性与一致性:遗传算法由于其随机性较高(特别是在交叉和变异过程中),在不同的运行中可能产生较大的结果差异。而蚁群算法在不同运行中的表现可能更加一致,由于其搜索机制倾向于逐渐积累解决方案。

问题规模适应性:遗传算法在小至中等规模的TSP问题上效果较好,但是需要重新初始化或通过其他机制引入新的遗传多样性;而蚁群算法在大规模问题上表现更优,对于动态变化的环境有很好的适应性,能够有效地调整已有路径的信息素浓度。

4.总结与讨论。

【1】关键参数的选取。

    根据上面的实验结果,我们可以得到以下参数及其选择情况可能导致的结果,并总结出一般情况下的参数选择范围。

参数名称

极端情况会导致的结果

一般情况的选择范围

蚂蚁数目m

过大:信息素变化趋于平均

过小:未搜索路径信息素提前减到0

m=1.5M,M是城市数量

信息素因子α

过大:选择走以前的路径概率大

过小:提前局部最优

α=[1,4]

启发函数因子β

过大:提前局部最优

过小:随机搜索

β=[3,4.5]

信息素挥发因子ρ

过大:信息素快速挥发,迭代搜索没有记忆,最后随机搜索

过小:信息素累积,提前局部最优

ρ=[0.2,0.5]

信息素常数Q

越大:已遍历路径的信息素积累越快,有利于收敛

Q=[10,1000]

最大迭代次数epoch

过大:资源浪费

过小:算法未收敛就结束

epoch=[100,500]

【2】蚁群算法的基本思想和流程图

流程图:

基本思想:

1:根据具体问题设置多只蚂蚁,分头并行搜索

2:每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比

3:蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大

4:每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表来控制

5:所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索

6:更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加

7:达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的解输出

【3】蚁群算法是一种本质上并行的算法。每只蚂蚁搜索的过程彼此独立,仅通过信息激素进行通信。蚁群算法在问题空间的多点同时开始进行独立的解搜索,不仅增加了算法的可靠性,也使得算法具有较强的全局搜索能力。但是也正是由于其并行性的本质,蚁群算法的搜索时间较长,在求解小规模的NP问题时耗费的计算资源相比其他启发式算法要多,因而显得效率很低下。

【4】蚁群算法的三个要素

1:蚁群活动

2:信息素挥发

3:信息素增加

【5】蚁群算法的主要体现

1:转移概率公式

2:信息素更新公式

五、遇到的问题及其解决方案

问题1:距离矩阵中,起初只是对从i点到i点的距离设置为0,这样会导致重复选择,失去了禁忌表的功能。

解决1:后续将matrix的主对角线的值更新为numpy中的inf值,即无穷大的值。

问题2:在设置rho = 0.9时,出现报错ValueError: probabilities contain NaN。

c:\Users\86158\Desktop\实验3\test.py:102: RuntimeWarning: invalid value encountered in divide

  probabilities = probabilities / np.sum(probabilities)

Traceback (most recent call last):

  File "c:\Users\86158\Desktop\实验3\test.py", line 149, in <module>

    best_route, best_distance = aco.solve()

  File "c:\Users\86158\Desktop\实验3\test.py", line 124, in solve

    next_city = self._choose_next_city(current_city, ant)

  File "c:\Users\86158\Desktop\实验3\test.py", line 104, in _choose_next_city

    return np.random.choice(range(self.num_cities), p=probabilities)

  File "mtrand.pyx", line 935, in numpy.random.mtrand.RandomState.choice

ValueError: probabilities contain NaN

解决2:这个警告出现在 probabilities = probabilities / np.sum(probabilities) 这一行。分析可知 np.sum(probabilities) 的结果是0,导致了一个除以0的操作。当概率之和为0时,除法会产生无效值(NaN)。这变相地说明了rho过大,会导致信息素挥发过快,导致算法的稳定性较差。

六、附件

蚁群算法源代码(含完整注释)

import random

import matplotlib.pyplot as plt

import numpy as np

import time

# 确定随机数生成的种子

random.seed(40)

# 城市数目

num = int(input("please input the number of cities: "))

# 开始计时

start = time.time()

# 固定生成点数目

points = []

for i in range(num):

    # 随机生成xy坐标

    x = random.randint(0,100)

    y = random.randint(0,100)

    # 将随机坐标pushpoints里面

    points.append((x,y))

print("检查初代点坐标:")

print(points)

# 计算初代点symmetric matrix的函数

def distance_matrix(points):

    # 初始化一个0 matrix

    matrix = np.zeros((num,num))

   

    # 开始计算各点之间的距离

    for i in range(num):

        for j in range(num):

            # 如果当前点=>当前点,则认为是infinite distance

            if i==j:

                matrix[i,j]=np.inf

            # 否则,计算两个点之间的欧式距离

            else:

                matrix[i,j]=np.sqrt((points[i][0]-points[j][0])**2 + (points[i][1]-points[j][1])**2)

   

    # 返回计算后的matrix

    return matrix

# 进行初代矩阵生成

original_matrix = distance_matrix(points)

# 检查初代矩阵

# print(original_matrix)

# 蚁群算法类

class ACO:

    # 初始化(包括城市数目、距离矩阵、蚂蚁数目、迭代次数、信息素因子、距离因子、挥发因子、信息素强度)

    def __init__(self, num_cities, distance_matrix, num_ants, max_iter=200, alpha=2, beta=5, rho=0.5, q=100):

        # 城市数目

        self.num_cities = num_cities

        # 距离矩阵

        self.distance_matrix = distance_matrix

        # 信息素矩阵,其中shape属性返回数组的维度

        self.pheromone = np.ones(self.distance_matrix.shape) / num_cities

        # 蚂蚁数目

        self.num_ants = num_ants

        # 迭代次数

        self.max_iter = max_iter

        # 信息素因子

        self.alpha = alpha

        # 距离因子

        self.beta = beta

        # 挥发因子

        self.rho = rho

        # 信息素强度

        self.q = q

    # 更新信息素(包括蚂蚁)

    def _update_pheromone(self, ants):

        # pheromone(t+1) = (1-rho)*pheromone(t) + ∑ delta[pheromone(t,t+1)]

        self.pheromone *= (1 - self.rho)

       

        # 对于每一个蚂蚁,更新其放在边(i,i+1)上的信息素强度

        for ant in ants:

            for i in range(self.num_cities-1):

                # delta[pheromone(t,t+1)] = Q / Li

                self.pheromone[ant[i]][ant[i+1]] += self.q / self.distance_matrix[ant[i]][ant[i+1]]

            # 更新最后一段路径的信息素

            self.pheromone[ant[-1]][ant[0]] += self.q / self.distance_matrix[ant[-1]][ant[0]]

    # 根据信息素因子和距离因子,选择下一个需要访问的城市(包括当前的城市、已经访问的城市)

    def _choose_next_city(self, current_city, visited):

        # 可能性数组

        probabilities = []

       

        # 遍历所有城市

        for i in range(self.num_cities):

            # 如果城市i没有被访问,则i可能是下一个选择的城市

            if i not in visited:

                probabilities.append(self.pheromone[current_city][i] ** self.alpha * ((1.0 / self.distance_matrix[current_city][i]) ** self.beta))

            # 如果城市i被访问

            else:

                probabilities.append(0)

       

        # 更新分母(需要除以sum

        probabilities = probabilities / np.sum(probabilities)

        # 按照概率,轮盘抽取一个可能的城市i,作为下一个城市

        return np.random.choice(range(self.num_cities), p=probabilities)

    # 解决TSP问题

    def solve(self):

        # 初始化最好路线和距离

        best_route = None

        best_distance = float('inf')

       

        # 进行每一次的迭代

        for _ in range(self.max_iter):

            # 初始化蚂蚁,令他们随机分配到一个城市

            ants = [[np.random.randint(self.num_cities)] for _ in range(self.num_ants)]

           

            # 遍历每一只蚂蚁

            for ant in ants:

                # 生成完整的路径

                for _ in range(self.num_cities-1):

                    # 当前路径中的最后一个城市

                    current_city = ant[-1]

                    # 调用函数,选择下一个访问的城市

                    next_city = self._choose_next_city(current_city, ant)

                    # push到蚂蚁的数组里面

                    ant.append(next_city)

           

            # 更新信息素

            self._update_pheromone(ants)

           

            # 遍历每一只蚂蚁

            for ant in ants:

                # 生成距离

                distance = sum([self.distance_matrix[ant[i]][ant[i + 1]] for i in range(-1, self.num_cities - 1)])

                # 更新最好距离

                if distance < best_distance:

                    best_distance = distance

                    best_route = ant

       

        # 返回最优解  

        return best_route, best_distance

# 蚂蚁的数量(城市数量的1.5倍)

num_ants = int(num * 1.5)

# 初始化aco

aco = ACO(num, original_matrix, num_ants)

# 利用类中的solve函数,进行TSP问题的求解

best_route, best_distance = aco.solve()

# 结束计时

end = time.time()

# 计算算法的耗时

during = end - start

print(f"Time consumption: {during}s")

# 输出最佳路线和距离

print(f"Best route: {best_route}")

print(f"Best distance: {best_distance}")

# 使用zip分离坐标

x, y =zip(*points)

# 初始化新的xy坐标的数组

newx = []

newy = []

# 根据best-route更新newxnewy

for i in range(num):

    # 当前点的idbest-route中的编号

    id = best_route[i]

    # 新增点的坐标信息

    newx.append(x[id])

    newy.append(y[id])

# 画出route

plt.figure()

plt.scatter(newx, newy, color='blue', s=2)

for i in range(num):

    # 下一个点需要对num进行取余

    next_i = (i + 1) % num

    plt.plot([newx[i], newx[next_i]], [newy[i], newy[next_i]], color='red')

# 增加标签和标题

plt.xlabel("X-axis")

plt.ylabel("Y-axis")

plt.title("ACO algorithm for TSP problems")

# 背景含网格

plt.grid(True)

# 展示图片

plt.show()

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

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

相关文章

P1025 [NOIP2001 提高组] 数的划分

暴搜 剪枝 枚举固定的位置 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e310; int n,k; int res; void dfs(int last,int sum,int cur){if(curk){if(sumn)res;return;}for(int ilast;isum<n;i)dfs(i,sumi,cur1); } int main() {c…

DDD落地:从携程订单系统重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

抑制过拟合——Dropout原理

抑制过拟合——Dropout原理 Dropout的工作原理 实验观察 在机器学习领域&#xff0c;尤其是当我们处理复杂的模型和有限的训练样本时&#xff0c;一个常见的问题是过拟合。简而言之&#xff0c;过拟合发生在模型对训练数据学得太好&#xff0c;以至于它捕捉到了数据中的噪声和…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

JDK 动态代理从入门到掌握

快速入门 本文介绍 JDK 实现的动态代理及其原理&#xff0c;通过 ProxyGenerator 生成的动态代理类字节码文件 环境要求 要求原因JDK 8 及以下在 JDK 9 之后无法使用直接调用 ProxyGenerator 中的方法&#xff0c;不便于将动态代理类对应的字节码文件输出lombok为了使用 Sne…

孩子都能学会的FPGA:第十七课——用FPGA实现定点数的乘法

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别&#xff0c;有时候需要查看 WARN 级别的日志&#xff0c;所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

什么是网络攻击?阿里云服务器可以避免被攻击吗?

网络攻击是指:损害网络系统安全属性的任何类型的进攻动作。进攻行为导致网络系统的机密性、完整性、可控性、真实性、抗抵赖性等受到不同程度的破坏。 网络攻击有很多种&#xff0c;网络上常见的攻击有DDOS攻击、CC攻击、SYN攻击、ARP攻击以及木马、病毒等等&#xff0c;所以再…

CTO对生活和工作一点感悟

陌生人&#xff0c;你好啊。 感谢CSDN平台让我们有了隔空认识&#xff0c;交流的机会。 我是谁&#xff1f; 我呢&#xff0c;毕业快11年&#xff0c;在网易做了几年云计算&#xff0c;后来追风赶上了大数据的浪潮&#xff0c;再到后来混迹在AI、智能推荐等领域。 因为有一颗…

SS8847T 双通道 H 桥驱动芯片 替代DRV8847

SS8847E是一款双桥电机驱动器&#xff0c;具有两个H桥驱动器&#xff0c;可以驱动两个直流有刷电机&#xff0c;一个双极步进电机&#xff0c;螺线管或其他感性负载。该器件的工作电压范围为 2.7V 至 15V&#xff0c;每通道可提供高达 1.0A 的负载电流。每个H桥的输出驱动器模块…

2023年安全员-A证证模拟考试题库及安全员-A证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年安全员-A证证模拟考试题库及安全员-A证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-A证证模拟考试题库是根据安全员-A证最新版教材&#xff0c;安全员-A证大纲整理而成&#xff08;含2023年…

navigator.clipboard is undefined in JavaScript issue [Fixed]

navigator.clipboard 在不安全的网站是无法访问的。 在本地开发使用localhost或127.0.0.1没有这个问题。因为它不是不安全网站。 在现实开发中&#xff0c;可能遇到测试环境为不安全网站。 遇到这个问题&#xff0c;就需要将不安全网站标记为非不安全网站即可。 外网提供了3…

python动态加载内容抓取问题的解决实例

问题背景 在网页抓取过程中&#xff0c;动态加载的内容通常无法通过传统的爬虫工具直接获取&#xff0c;这给爬虫程序的编写带来了一定的技术挑战。腾讯新闻&#xff08;https://news.qq.com/&#xff09;作为一个典型的动态网页&#xff0c;展现了这一挑战。 问题分析 动态…

【开源视频联动物联网平台】视频接入网关的用法

视频接入网关是一种功能强大的视频网关设备&#xff0c;能够解决各种视频接入、视频输出、视频转码和视频融合等问题。它可以在应急指挥、智慧融合等项目中发挥重要作用&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。 很多视频接入网关在接入协议…

Go 语言输出文本函数详解

Go语言拥有三个用于输出文本的函数&#xff1a; Print()Println()Printf() Print() 函数以其默认格式打印其参数。 示例 打印 i 和 j 的值&#xff1a; package mainimport "fmt"func main() {var i, j string "Hello", "World"fmt.Print(…

【力扣:526】优美的排列

状态压缩动态规划 原理如下&#xff1a; 遍历位图可以得到所有组合序列&#xff0c;将这些序列的每一位看作一个数&#xff0c;取序列中1总量的值作为每轮遍历的位&#xff0c;此时对每个这样的位都能和所有数进行匹配&#xff0c;因为一开始就取的是全排列&#xff0c;并且我们…

MySQL表的查询、更新、删除

查询 全列查询 指定列查询 查询字段并添加自定义表达式 自定义表达式重命名 查询指定列并去重 select distinct 列名 from 表名 where条件 查询列数据为null的 null与 (空串)是不同的&#xff01; 附&#xff1a;一般null不参与查询。 查询列数据不为null的 查询某列数据指定…

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行&#xff0c;了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…