蚁群算法求包含34个国内城市的TSP,和最优解相差没那么大

文章目录

  • 引言
  • 蚁群觅食
  • 算法原理
  • 代码实现
    • ACO求解TSP
    • 整数规划求解TSP
  • 相关阅读

引言

上一篇介绍的差分进化算法,很适合求解连续变量的优化问题;但针对组合优化问题,就不是很适用了。

至于哪一种智能优化算法更适合求解组合优化问题,我查阅了很多资料。不幸的是,虽然有很多公开测试数据集,但并没有令人信服的证据能表明某个智能优化算法是其中最好的。

即使如此,还是想找一个适合的智能优化算法来求解组合优化问题。一番权衡后,本文选择了蚁群算法,其中的原因包括以下两点:

  1. 蚁群算法的最初设计就是解决其中一大类组合优化问题,后续的应用几乎也都是组合优化问题,所以从天性上来说,两者是契合的;
  2. 蚁群算法最早是在1991年被提出的,而且持续有人在使用和研究,是一种经典的智能优化算法,所以具有学习的价值。

正文见下。

蚁群觅食

蚁群算法的设计借鉴了蚁群觅食的过程,因此为了能深刻地理解算法,有必要先了解清楚蚁群是如何觅食的。

研究发现,蚂蚁的食物搜索行为具有协作性。当蚂蚁在蚁穴和食物之间行走时,会释放一种被称为信息素的物质,这些物质形成一条指示轨迹。其他蚂蚁可以感知到环境中这种物质的存在和强度,在移动过程中,倾向于选择信息素强度高的轨迹。

以下图为例。 t = 0 t=0 t=0时刻,有20只蚂蚁位于A(蚁穴)处,要去往E(食物)处,另有20只蚂蚁位于E处,要返回A处。

t = 1 t=1 t=1时刻,20只蚂蚁从A到达B处的岔路口,因为此时没有信息素,所以10只蚂蚁走BCD路线,10只走BD路线,并分别在各自的路线上留下信息素;同理,从E出发的20只蚂蚁在D处也分成2个等数量的小组分别走DB和DCB路线,并留下信息素;另外,还有15只蚂蚁从A处开始出发。

到了 t = 2 t=2 t=2时,从E出发沿着DB路线的10只蚂蚁到达B处,而沿DCB行走的蚂蚁仅达到C处,因此此时BD路线上的信息素强度高于BCD路线;当另外15只从A出发的蚂蚁到达B处后,多数的蚂蚁(10只)会选择走BD路线,少量的蚂蚁(5只)选择走BCD路线。


这一正反馈机制会导致,BD路线上的信息素量相比BCD路线会越来越多,最终所有蚂蚁都找到BD这条最短路径。

算法原理

蚁群算法源于蚁群觅食,所以保留了一些类似的特征,比如个体间相互合作,通过信息素进行间接通信和正反馈机制等;但又高于蚁群觅食,主要体现在具有记忆能力,信息素的释放时机可以根据具体问题设定,允许局部优化、回退甚至预测能力等。

以下借助TSP问题(旅行商问题)实例,来详细描述蚁群算法的原理和和实现步骤。TSP问题指的是:旅行家要旅行n个城市,要求各个城市经历且仅经历一次,然后回到出发城市,并要求所走的路程最短。

(1)在蚁群算法的每一代循环中,每只蚂蚁都会独立地完成自己的TSP。蚂蚁完成TSP的过程中,不会选择已经访问过的城市,并且依赖状态转移概率选择下一个城市 j j j。状态转移概率的定义为:设第 k k k只蚂蚁当前所在的城市为 i i i,则从该城市移动到 j j j城市的状态转移概率为

其中, τ ( i , j ) \tau (i,j) τ(i,j)是城市对 ( i , j ) (i,j) (i,j)上的信息素,下一段再细说; η ( i , j ) \eta (i,j) η(i,j)是城市对 ( i , j ) (i,j) (i,j)上的启发信息,在TSP问题中, η ( i , j ) \eta (i,j) η(i,j)一般选取为城市间距离的倒数。 N k i N_k^i Nki是所有未经过的城市组成的集合, α , β \alpha,\beta α,β分别表示信息素和启发信息相对权重参数,它们控制 τ ( i , j ) \tau (i,j) τ(i,j) η ( i , j ) \eta (i,j) η(i,j)在决策中所占的比重。显然,信息素越多,距离越短,被选择的概率就越大。

(2)初始的信息素设置成所有城市对均相同即可。当所有蚂蚁完成了自己的TSP后,会根据自己选择的路径和路径总长度留下不同强度的信息素 τ ( i , j ) \tau (i,j) τ(i,j)。用 Δ τ i , j k \Delta\tau_{i,j}^k Δτi,jk表示第 k k k只蚂蚁在城市对 ( i , j ) (i,j) (i,j)上释放的量。在Ant Cycle System中,其值为

其中,$Q$是常数,$L_k$表示第$k$只蚂蚁在本次循环中所走路径的长度。显然,解的质量越好,在所经过的路径上留下的信息素$\Delta\tau_{i,j}^k$就越大。

所以,针对城市对 ( i , j ) (i,j) (i,j)上,信息素的总改变量为
Δ τ i , j = ∑ k = 1 m Δ τ i , j k \Delta\tau_{i,j}=\sum_{k=1}^m \Delta\tau_{i,j}^k Δτi,j=k=1mΔτi,jk
其中, m m m为蚂蚁数。

此外,算法中还引入了信息素会发机制。设信息素的保持系数为 ρ \rho ρ,则在完成一次完整循环后,信息素的值变为
τ i , j = ρ τ i , j + Δ τ i , j \tau_{i,j} = \rho\tau_{i,j} + \Delta\tau_{i,j} τi,j=ρτi,j+Δτi,j

(3)判断是否达到退出条件,如果满足,则退出,否则便进入下一代循环。

代码实现

ACO求解TSP

求解随机生成的TSP实例,感觉有些太普通。所以决定加点难度,试着沿国内34个主要城市跑一圈,并把优化后的最短TSP可视化出来。

以下是Python代码。感恩网上大量的开源代码,让我完成可以少花很多时间来完成这些代码,同时保证TSP可视化后的颜值。

import math
import time

import numpy as np
import pandas as pd

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.datasets import register_url
from pyecharts.globals import ChartType, SymbolType


def tsp_by_aco(D):
    # 城市数量
    city_cnt = D.shape[0]
    # 蚂蚁数量
    ant_cnt = 100
    # 迭代次数
    max_iter = 200
    # 信息素权重系数
    alpha = 1
    # 启发信息权重系数
    beta = 2
    # 信息素挥发速度
    rho = 0.1
    # 城市间球面距离
    distance = np.zeros((city_cnt, city_cnt))
    for i in range(city_cnt):
        for j in range(city_cnt):
            if i == j:
                # 相同城市不允许访问
                distance[i][j] = 1000000
            else:
                # 单位:km
                distance[i][j] = 6378.14 * math.acos(
                    math.cos(D[i][1]) * math.cos(D[j][1]) * math.cos(D[i][0] - D[j][0]) +
                    math.sin(D[i][1]) * math.sin(D[j][1]))
    # 启发信息,距离倒数
    eta = 1 / distance
    # 信息素矩阵
    tau = np.ones((city_cnt, city_cnt))
    # 每一代最优解
    generation_best_y = []
    generation_best_x = []
    # 种群
    population = np.zeros((ant_cnt, city_cnt)).astype(int)

    # 循环迭代
    for i in range(max_iter):
        # 城市转移概率
        prob_matrix = (tau ** alpha) * (eta ** beta)

        # TSP距离
        y = np.zeros((ant_cnt, 1))

        # 依次遍历每只蚂蚁
        for j in range(ant_cnt):
            # 设置TSP初始点为0
            population[j, 0] = 0

            # 选择后续城市
            for k in range(city_cnt - 1):
                # 已访问城市
                visit = set(population[j, :k + 1])
                # 未访问城市
                un_visit = list(set(range(city_cnt)) - visit)
                # 未访问城市转移概率归一化
                prob = prob_matrix[population[j, k], un_visit]
                prob = prob / prob.sum()
                # 轮盘赌策略选择下个城市
                next_point = np.random.choice(un_visit, size=1, p=prob)[0]
                # 添加被选择的城市
                population[j, k + 1] = next_point
                # 更新TSP距离
                y[j] += distance[population[j, k], population[j, k + 1]]
            # 更新TSP距离:最后一个城市->第0个城市
            y[j] += distance[population[j, -1], 0]

        # 保存当前代最优解
        best_index = y.argmin()
        generation_best_x.append(population[best_index, :])
        generation_best_y.append(y[best_index, :])

        # 计算信息素改变量,ACS模型,Q=1
        delta_tau = np.zeros((city_cnt, city_cnt))
        for j in range(ant_cnt):
            for k in range(city_cnt - 1):
                delta_tau[population[j, k], population[j, k + 1]] += 1 / y[j]
            delta_tau[population[j, city_cnt - 1], population[j, 0]] += 1 / y[j]

        # 信息素更新
        tau = (1 - rho) * tau + delta_tau

        print('iter: {}, best_f: {}'.format(i, generation_best_y[-1]))

    # 最优解位置
    best_generation_index = np.array(generation_best_y).argmin()

    return generation_best_x[best_generation_index], generation_best_y[best_generation_index]


def plot_tsp(cities):
    try:
        register_url("https://echarts-maps.github.io/echarts-countries-js/")
    except Exception:
        import ssl

        ssl._create_default_https_context = ssl._create_unverified_context
        register_url("https://echarts-maps.github.io/echarts-countries-js/")
    '''
    https://echarts-maps.github.io/echarts-countries-js/preview.html
    这个网站上显示的各个国家中文名称, 可以写在下面的maptype里面
    '''
    title1 = "中国主要城市TSP_by_ACO"

    c = (
        Geo().add_schema(
            maptype='china',  # 可以输入国家名字,比如"瑞士"
            itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#111'), )  # 设置地图颜色和边框色
    )

    for i in range(len(cities)):
        c.add(
            "城市",  # 第一个add数据的标题
            [(cities['城市'].iloc[i], i)],
            type_=ChartType.EFFECT_SCATTER,  # 使用点的样式,并设置点的颜色,点的大小都是一样的!
            symbol_size=6,  # 设置点的大小
            color='red', )  # 点的颜色

    for i in range(len(cities) - 1):
        c.add(
            "tsp路线",
            [(cities['城市'].iloc[i], cities['城市'].iloc[i + 1])],  # 城市顺序
            type_=ChartType.LINES,
            effect_opts=opts.EffectOpts(
                symbol=SymbolType.ARROW, symbol_size=6, color='yellow'),  # 线上的小箭头的颜色
            linestyle_opts=opts.LineStyleOpts(curve=0.2))  # 设置两点间线缆的弯曲度
        c.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        c.set_global_opts(title_opts=opts.TitleOpts(title=title1),
                          toolbox_opts=opts.ToolboxOpts())

    c.render('tsp_solution_by_aco.html')


if __name__ == '__main__':
    # 城市及其经纬度
    original_cities = [['西宁', 101.74, 36.56],
                       ['兰州', 103.73, 36.03],
                       ['银川', 106.27, 38.47],
                       ['西安', 108.95, 34.27],
                       ['郑州', 113.65, 34.76],
                       ['济南', 117, 36.65],
                       ['石家庄', 114.48, 38.03],
                       ['太原', 112.53, 37.87],
                       ['呼和浩特', 111.65, 40.82],
                       ['北京', 116.407526, 39.90403],
                       ['天津', 117.200983, 39.084158],
                       ['沈阳', 123.38, 41.8],
                       ['长春', 125.35, 43.88],
                       ['哈尔滨', 126.63, 45.75],
                       ['上海', 121.473701, 31.230416],
                       ['杭州', 120.19, 30.26],
                       ['南京', 118.78, 32.04],
                       ['合肥', 117.27, 31.86],
                       ['武汉', 114.31, 30.52],
                       ['长沙', 113, 28.21],
                       ['南昌', 115.89, 28.68],
                       ['福州', 119.3, 26.08],
                       ['台北', 121.3, 25.03],
                       ['香港', 114.173355, 22.320048],
                       ['澳门', 113.54909, 22.198951],
                       ['广州', 113.23, 23.16],
                       ['海口', 110.35, 20.02],
                       ['南宁', 108.33, 22.84],
                       ['贵阳', 106.71, 26.57],
                       ['重庆', 106.551556, 29.563009],
                       ['成都', 104.06, 30.67],
                       ['昆明', 102.73, 25.04],
                       ['拉萨', 91.11, 29.97],
                       ['乌鲁木齐', 87.68, 43.77]]
    original_cities = pd.DataFrame(original_cities, columns=['城市', '经度', '纬度'])
    # 使用ACO算法求解TSP
    time0 = time.time()
    best_x, best_y = tsp_by_aco(original_cities[['经度', '纬度']].values * math.pi / 180)
    print('使用ACO求解TSP,耗时: {} s'.format(time.time() - time0))
    # 按最优解顺序,生成访问城市次序
    original_cities['seq'] = best_x
    sort_cities = original_cities.sort_values(by='seq')
    sort_cities.loc[len(sort_cities)] = sort_cities.loc[0]
    # 绘制TSP路径
    plot_tsp(sort_cities)

运行代码后,能够得到一个网页版的动图,可以表示运行的轨迹,这里截取了一帧如下。算法输出的最短路径是15944.43815449,从图里其实也能看出来,这个解应该不是全局最优解。需要说明的是,每次运行的结果大概率是不一样的,所以如果大家复跑了这段代码,最优解的值和图的形状不一样是正常的。

整数规划求解TSP

之前的文章里介绍过整数规划可以求解全局最优解,所以本节再用这个方法解一遍TSP,然后把全局最优解拿来和ACO算法的结果做一下对比。TSP问题的整数规划建模不是本文重点,这里就不多描述了,有兴趣的可以参考:优化│TSP中两种不同消除子环路的方法及callback实现(Python调用Gurobi求解)。这里直接给出使用ortools求解模型的代码。

import pandas as pd
import math
import numpy as np
import time
from ortools.linear_solver import pywraplp

from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.datasets import register_url
from pyecharts.globals import ChartType, SymbolType


def calc_by_ortools(data):
    # 生成ortools求解器,使用SCIP算法
    solver = pywraplp.Solver.CreateSolver('SCIP')

    # 优化变量
    x = {}
    u = {}
    for i in range(len(data)):
        u[i] = solver.NumVar(0, solver.infinity(), 'u[%i]' % i)
        for j in range(len(data)):
            x[i, j] = solver.IntVar(0, 1, 'x[%i,%i]' % (i, j))

    # 目标函数:
    obj_expr = [data[i][j] * x[i, j] for i in range(len(data)) for j in range(len(data))]
    solver.Minimize(solver.Sum(obj_expr))

    # 约束条件一: 出度为1
    for i in range(len(data)):
        constraint_expr = [x[i, j] for j in range(len(data))]
        solver.Add(solver.Sum(constraint_expr) == 1)
    # 约束条件二: 入度为1
    for j in range(len(data)):
        constraint_expr = [x[i, j] for i in range(len(data))]
        solver.Add(solver.Sum(constraint_expr) == 1)
    # 约束条件三: 消除子环
    for i in range(1, len(data)):
        for j in range(1, len(data)):
            if i != j:
                solver.Add(u[i] - u[j] + len(data) * x[i, j] <= len(data) - 1)

    # 模型求解
    status = solver.Solve()

    # 模型求解成功, 打印结果
    if status == pywraplp.Solver.OPTIMAL:

        # 最优目标函数值
        print('best_f =', solver.Objective().Value())

        # 最优次序
        cnt = 0
        print(0, end=' ')
        k = 0
        best_x = [0]
        while cnt < len(data):
            for j in range(len(data)):
                if x[k, j].solution_value() == 0:
                    continue
                print('->', j, end=' ')
                k = j
                cnt += 1
                best_x.append(j)
                break
        print('\n')
        return best_x

    else:
        print('not converge.')
        return []


def plot_optimal_routes(cities):
    try:
        register_url("https://echarts-maps.github.io/echarts-countries-js/")
    except Exception:
        import ssl

        ssl._create_default_https_context = ssl._create_unverified_context
        register_url("https://echarts-maps.github.io/echarts-countries-js/")
    '''
    https://echarts-maps.github.io/echarts-countries-js/preview.html
    这个网站上显示的各个国家中文名称, 可以写在下面的maptype里面
    '''
    title1 = "中国主要城市TSP_by_ortools"

    c = (
        Geo()
            .add_schema(
            maptype='china',  # 可以输入国家名字,比如"瑞士"
            itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='#111'), )  # 设置地图颜色和边框色
    )

    for i in range(len(cities)):
        c.add(
            "城市",  # 第一个add数据的标题
            [(cities['城市'].iloc[i], i)],
            type_=ChartType.EFFECT_SCATTER,  # 使用点的样式,并设置点的颜色,点的大小都是一样的!
            symbol_size=6,  # 设置点的大小
            color='red', )  # 点的颜色

    for i in range(len(cities) - 1):
        c.add(
            "tsp路线",
            [(cities['城市'].iloc[i], cities['城市'].iloc[i + 1])],  # 城市顺序
            type_=ChartType.LINES,
            effect_opts=opts.EffectOpts(
                symbol=SymbolType.ARROW, symbol_size=6, color='yellow'),  # 线上的小箭头的颜色
            linestyle_opts=opts.LineStyleOpts(curve=0.2))  # 设置两点间线缆的弯曲度
        c.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        c.set_global_opts(title_opts=opts.TitleOpts(title=title1),
                          toolbox_opts=opts.ToolboxOpts())

    c.render('tsp_solution_by_ortools.html')


if __name__ == '__main__':
    # 城市及其经纬度
    original_cities = [['西宁', 101.74, 36.56],
                       ['兰州', 103.73, 36.03],
                       ['银川', 106.27, 38.47],
                       ['西安', 108.95, 34.27],
                       ['郑州', 113.65, 34.76],
                       ['济南', 117, 36.65],
                       ['石家庄', 114.48, 38.03],
                       ['太原', 112.53, 37.87],
                       ['呼和浩特', 111.65, 40.82],
                       ['北京', 116.407526, 39.90403],
                       ['天津', 117.200983, 39.084158],
                       ['沈阳', 123.38, 41.8],
                       ['长春', 125.35, 43.88],
                       ['哈尔滨', 126.63, 45.75],
                       ['上海', 121.473701, 31.230416],
                       ['杭州', 120.19, 30.26],
                       ['南京', 118.78, 32.04],
                       ['合肥', 117.27, 31.86],
                       ['武汉', 114.31, 30.52],
                       ['长沙', 113, 28.21],
                       ['南昌', 115.89, 28.68],
                       ['福州', 119.3, 26.08],
                       ['台北', 121.3, 25.03],
                       ['香港', 114.173355, 22.320048],
                       ['澳门', 113.54909, 22.198951],
                       ['广州', 113.23, 23.16],
                       ['海口', 110.35, 20.02],
                       ['南宁', 108.33, 22.84],
                       ['贵阳', 106.71, 26.57],
                       ['重庆', 106.551556, 29.563009],
                       ['成都', 104.06, 30.67],
                       ['昆明', 102.73, 25.04],
                       ['拉萨', 91.11, 29.97],
                       ['乌鲁木齐', 87.68, 43.77]]
    original_cities = pd.DataFrame(original_cities, columns=['城市', '经度', '纬度'])
    D = original_cities[['经度', '纬度']].values * math.pi / 180

    # 城市间球面距离
    city_distance = np.zeros((len(original_cities), len(original_cities)))
    for i in range(len(original_cities)):
        for j in range(len(original_cities)):
            if i == j:
                city_distance[i][j] = 100000
            else:
                city_distance[i][j] = 6378.14 * math.acos(
                    math.cos(D[i][1]) * math.cos(D[j][1]) * math.cos(D[i][0] - D[j][0]) +
                    math.sin(D[i][1]) * math.sin(D[j][1]))

    # 使用整数规划求解TSP
    time0 = time.time()
    best_x = calc_by_ortools(city_distance)
    print('使用ortools求解TSP,耗时: {} s'.format(time.time() - time0))

    # 绘制TSP路径
    if len(best_x) > 0:
        best_routes = []
        for i in range(len(best_x)):
            best_routes.append(original_cities['城市'].iloc[best_x[i]])
        best_routes = pd.DataFrame(best_routes, columns=['城市'])
        plot_optimal_routes(best_routes)

运行程序后,得到最优解为15614.849985682848,可视化路径如下图所示,这个图里的路径看上去更符合我们对全局最优解的认知。相比之下,蚁群算法的结果距离最优解的GAP差不多是2%,看起来也没差那么多。

best_f = 15614.849985682848
0 -> 1 -> 2 -> 3 -> 4 -> 6 -> 7 -> 8 -> 13 -> 12 -> 11 -> 9 -> 10 -> 5 -> 17 -> 16 -> 14 -> 15 -> 22 -> 21 -> 20 -> 18 -> 19 -> 25 -> 23 -> 24 -> 26 -> 27 -> 31 -> 28 -> 29 -> 30 -> 32 -> 33 -> 0 
使用ortools求解TSP,耗时: 88.28608894348145 s

相关阅读

ACO实现代码1: https://github.com/guofei9987/scikit-opt/blob/master/sko/ACA.py

ACO实现代码2: https://blog.csdn.net/weixin_48241292/article/details/109312812

pyecharts绘图: https://blog.csdn.net/ycyrym/article/details/106736998#:~:text=pyecharts-%20geo%20%E5%9C%A8%E5%9C%B0%E5%9B%BE%E4%B8%8A%E7%94%BB%E7%82%B9%E5%92%8C%E4%B8%A4%E5%9C%B0%E9%97%B4%E7%9A%84%E8%BF%9E%E7%BA%BF,ChartType.EFFECT_SCATTER%20%26%20ChartType.LINES

整数规划求解TSP实例1:https://blog.csdn.net/baidu/article/details/124844167

整数规划求解TSP实例2:https://blog.csdn.net/qq_39559641/article/details/101209534

TSP问题的整数规划模型:https://zhuanlan.zhihu.com/p/261137981

蚁群智能优化方法及其应用:https://weread.qq.com/web/reader/a50328c0719b20d8a5094bek65132ca01b6512bd43d90e3

差分进化算法:https://zhuanlan.zhihu.com/p/661450130

整数规划:https://zhuanlan.zhihu.com/p/649791641

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vim使用

概述 vi&#xff08;visual editor&#xff09;是Unix/Linux编辑器的一种。类似于win中notepad。vim&#xff08;vi improved&#xff09;加强版 安装vim&#xff1a; $ yum install vim -y四种模式 命令模式&#xff1a;快速进行复制、粘贴、删除等操作&#xff0c;还可以…

【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

请看vcr&#xff1a;https://transformers.run/back/transformer/

项目管理49个过程定义与作用、五大过程组

五大过程组&#xff1a; 49个过程的定义与作用&#xff1a; 1.整合管理&#xff1a; (1)制定项目章程&#xff1a;制定项目章程是编写一份正式批准项目并授予项目经理权力的文件的过程&#xff0c;其作用是①确立组织与项目的关系&#xff1b;②展示组织对项目的承诺&#xff…

超全整理,服务端性能测试-docker部署tomcat/redis(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、docker部署tom…

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…

并发编程

什么是并发编程&#xff1f; 并行&#xff1a;在同一个时间节点上&#xff0c;多个线程同时执行(是真正意义上的同时执行) 并发&#xff1a;一个时间段内&#xff0c;多个线程依次执行。 并发编程&#xff1a;在例如买票、抢购、秒杀等等场景下&#xff0c;有大量的请求访问…

git 推送到github远程仓库细节处理(全网最良心)

我查看了很多网上的教程都不是很好 我们先在github创建一个仓库&#xff0c;且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…

激活函数作用以及 sigmoid和softmax

激活函数 激活函数在神经网络中起着非常重要的作用&#xff0c;它的主要功能是引入非线性性质&#xff0c;使得神经网络可以学习和表示更加复杂的模式和关系。下面是激活函数的几个主要作用&#xff1a; 引入非线性&#xff1a;激活函数通过引入非线性变换&#xff0c;打破了…

Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)

在看这一篇之前&#xff0c;如果不了解 Ingress 在 K8s 当中的职责&#xff0c;建议看之前的一篇针对旧版本 Ingress 的部署搭建&#xff0c;在开头会提到它的一些简介Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客 开始表演 1、kubeasz 一键安装…

M1安装OpenPLC Editor

下载OpenPLC Editor for macOS.zip文件后&#xff0c;使用tar -zvxf命令解压&#xff0c;然后将"OpenPLC Editor"拖入到"应用程序"文件夹 右键点击"OpenPLC Editor"&#xff0c;打开这个""文件&#xff0c;替换为以下内容 #!/bin/bash…

C++设计模式_15_Proxy 代理模式

Proxy 代理模式也是属于“接口隔离”模式&#xff0c;通过增加一层间接层来解决问题的模式。 文章目录 1. 动机( Motivation)2. 模式定义3. 结构( Structure )4. 代码演示Proxy 代理模式4.1 常规方法4.2 Proxy 代理模式 5. 要点总结6. 其他参考 1. 动机( Motivation) 在面向对…

How to install the console system of i-search rpa on Centos 7

How to install the console system of i-search rpa on Centos 7 1、 准备1.1 、查看磁盘分区状态1.2、上传文件1.2.1、添加上传目录1.2.2、上传安装包1.2.3、解压安装包1.2.4、查看安装包结构 1.3、安装依赖包1.3.1、基础依赖包1.3.2 相关依赖 1.4、关闭防火墙1.5、解除SeLin…

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能&#xff0c;由于别的数据库有值&#xff0c;需要这边的不同入口的进来查询&#xff0c;所以需要同步过来&#xff0c;如果再继续一个一个生成列对应处理感觉不方便&#xff0c;如果没有别的操作&#xff0c;只是存储和查询&#xff0c;那就可以用MySql支持的jso…

2022年上半年上午易错题(软件设计师考试)

1.以下关于冯诺依曼计算机的叙述中&#xff0c;不正确的是( )。 A.程序指令和数据都采用二进制表示 B.程序指令总是存储在主存中&#xff0c;而数据则存储在高速缓存中 C.程序的功能都由中央处理器(CPU)执行指令来实现 D.程序的执行过程由指令进行自动控制 程序指令和数据…

【Android】MQTT入门——服务器部署与客户端搭建

目录 MQTT 协议简介应用场景优点缺点 部署服务端下载安装包启动服务器 搭建客户端下载SDK添加依赖配置MQTT服务和权限建立连接订阅主题发布消息取消订阅断开连接 MQTT客户端工具最终效果实现传感器数据采集与监测功能思路 MQTT 协议 简介 MQTT&#xff08;Message Queuing Te…

Mac 安装使用NPM及常用命令

环境&#xff1a; Mac 工具&#xff1a; NPM 可通过官网查询一些模块相关 NPM Doc 通过官网文档了解更多的关于NPM的使用 安装 NPM是Node.js的包管理工具&#xff0c;可用于解决 Node.js在代码部署上的问题。 新版本的Node.js已经集成了NPM&#xff0c; 因此可通过下载 Nod…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址&#xff1a;https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由…

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…