基于模拟退火算法的TSP问题建模求解(Python)

基于模拟退火算法的TSP问题建模求解(Python)

  • 一、模拟退火算法(Simulated Annealing Algorithm,SAA)工程背景
    • 模拟退火算法用于优化问题求解原理
  • 二、旅行商问题(Travelling salesman problem,TSP)
    • TSP问题数学模型
  • 三、基于模拟退火算法的TSP问题建模求解
    • 3.1实例分析
      • 3.1.1导入库
      • 3.1.2数据
      • 3.1.3生成初始解
      • 3.1.4扰动生成新解
      • 3.1.5评价函数
      • 3.1.6Metropolis接受准则
      • 3.1.7模拟退火算法
    • 3.2完整代码
    • 3.3求解结果

一、模拟退火算法(Simulated Annealing Algorithm,SAA)工程背景

模拟退火算法(Simulated Annealing Algorithm)来源于固体退火原理,是一种基于概率的算法。将固体加温至充分高的温度,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,分子和原子越不稳定。而徐徐冷却时粒子渐趋有序,能量减少,原子越稳定。在冷却(降温)过程中,固体在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。

模拟退火算法用于优化问题求解原理

模拟退火算法包含两个部分即Metropolis算法和退火过程,分别对应内循环和外循环。外循环就是退火过程,将固体达到较高的温度(初始温度 T 0 T_0 T0),然后按照降温系数 α \alpha α使温度按照一定的比例下降,当达到终止温度 T f T_f Tf时,冷却结束,即退火过程结束;Metropolis算法是内循环,即在每次温度下,迭代L次,寻找在该温度下能量的最小值(即最优解)。下图中所示即为在一次温度下,跌代L次,固体能量发生的变化。

在该温度下,整个迭代过程中温度不发生变化,能量发生变化,当前一个状态x(n)的能量大于后一个状态x(n+1)的能量时,状态x(n)的解没有状态x(n+1)的解好,所以接受状态x(n+1),以 P = 1 P=1 P=1的概率接受。但是如果下一状态的能量比前一个状态的能量高时,则接受下一状态的概率为 P = e E ( n + 1 ) − E ( n ) T P=\text{e}^{\frac{E(n+1)-E(n)}{T}} P=eTE(n+1)E(n)

P = { 1 E ( n + 1 ) < E ( n ) e E ( n + 1 ) − E ( n ) T E ( n + 1 ) ≥ E ( n ) P=\begin{cases} 1 & E(n+1) < E(n) \\ \text{e}^{\frac{E(n+1)-E(n)}{T}} & E(n+1) \geq E(n) \\ \end{cases} P={1eTE(n+1)E(n)E(n+1)<E(n)E(n+1)E(n)

  • E(n):状态为x(n)时系统的能量,即TSP问题中目标函数值
  • T:当前温度,控制退火速率,即温度下降,最简单的下降方式是指数式下降:T(n) = α \alpha α T(n) ,n =1,2,3,…其中 α \alpha α是小于1的正数,一般取值为0.8到0.99之间。使的对每一温度,有足够的转移尝试,指数式下降的收敛速度比较慢。

用固体退火模拟组合优化问题,状态x(n)映射为问题的解,将内能E模拟为目标函数值f,温度T演化成控制迭代过程参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件Tf。而温度的作用就是来计算转移概率P的。当温度每次下降后,转移概率也发生变化,因此在所有温度下迭代L次的结果也都是不相同的。在每个温度下迭代L次来寻找当前温度下的最优解,然后降低温度继续寻找,直到到达终止温度,即转移概率P接近于0
在这里插入图片描述

对应于优化问题(min问题),如果当前解的目标函数值<新解的目标函数值,则无条件接受;如果当前解的目标函数值>=新解的目标函数值,以一定的概率接受新解作为当前解。

Metropolis算法就是如何在局部最优解的情况下让其跳出来(如图中B、C、E为局部最优),是退火的基础。1953年Metropolis提出重要性采样方法,即以概率来接受新状态,而不是使用完全确定的规则,称为Metropolis准则,计算量较低。

假设初始解为A,多次迭代之后更新到B的局部最优解,这时发现更新到解B时,目标函数值比A要低,则说明接近最优解了,因此百分百转移,到达解B后,发现下一步目标函数值上升了,如果是梯度下降则是不允许继续向前的,而这里会以一定的概率跳出这个坑,这各概率和当前的状态、能量等都有关系。在一开始需要T值较大,这样根据函数的单调性,可以看出接受差解的P是较大的,便于对全局进行搜索,而在后期温度下降,T值变小,当温度趋于零时,只能接受目标函数下降的,这有利于尽快收敛,完成迭代。

二、旅行商问题(Travelling salesman problem,TSP)

TSP问题数学模型

刘兴禄 -《运筹优化常用模型、算法及案例实战:Python+Java实现》总结了TSP问题共有3种数学模型:

  1. Dantzig-Fulkerson-Johnson model,DFJ模型(本文采用)
  2. Miller-Tucker-Zemlin model,MTZ模型
  3. 1-tree模型

DFJ模型,也是最常见的模型如下:

min ⁡ ∑ i ∈ V ∑ j ∈ V d i j x i j subject to ∑ j ∈ V x i j = 1 , ∀ i ∈ V , i ≠ j ∑ i ∈ V x i j = 1 , ∀ j ∈ V , i ≠ j ∑ i , j ∈ S x i j ≤ ∣ S ∣ − 1 , 2 ≤ ∣ S ∣ ≤ N − 1 , S ⊂ V x i j ∈ { 0 , 1 } , ∀ i , j ∈ V \begin{align} \min \quad & \sum_{i \in V}{}\sum_{j \in V} d_{ij}x_{ij}\\ \text{subject to} \quad &\sum_{j \in V} x_{ij} = 1, \quad \forall i \in V,i \neq j \\ &\sum_{i \in V}{x_{ij}} =1,\quad \forall j \in V ,i \neq j\\ & {\sum_{i,j \in S}{x_{ij}} \leq |S|-1,\quad 2\leq |S| \leq N-1, S \subset V}\\ &x_{ij} \in \{0,1\}, \quad \forall i,j \in V \end{align} minsubject toiVjVdijxijjVxij=1,iV,i=jiVxij=1,jV,i=ji,jSxijS1,2SN1,SVxij{0,1},i,jV

三、基于模拟退火算法的TSP问题建模求解

3.1实例分析

3.1.1导入库

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt

3.1.2数据

# 数据:城市以及坐标
city_coordinates = {0: (60, 200),1: (180, 200),2: (80, 180),3: (140, 180),4: (20, 160),5: (100, 160),6: (200, 160),7: (140, 140),8: (40, 120),9: (100, 120),10: (180, 100),11: (60, 80),12: (120, 80),13: (180, 60),14: (20, 40),15: (100, 40),16: (200, 40),17: (20, 20),18: (60, 20),19: (160, 20),}
num_city = len(city_coordinates)
f'城市数量: {num_city}'
'城市数量: 20'
# 距离矩阵
distance_matrix = np.empty(shape=(num_city, num_city), dtype=np.float_)
for i in range(num_city):xi, yi = city_coordinates[i]for j in range(num_city):xj, yj = city_coordinates[j]distance_matrix[i][j] = np.sqrt(np.power(xi - xj, 2) + np.power(yi - yj, 2))

3.1.3生成初始解

x = np.random.permutation(num_city)  # 初始解,编码采用常规的整数编码,如果城市数目为N,那么解就可以表达为1~N的随机排列,
x
array([ 4, 16, 17,  7,  5, 18, 15,  3,  0, 10,  8,  9, 14,  1, 12, 13,  6,11,  2, 19])

3.1.4扰动生成新解

def two_opt(x: np.ndarray):"""2-opt swap,扰动生成新解:param x: 解:return: 新解"""x = x.copy()r1 = np.random.randint(low=0, high=num_city)r2 = np.random.randint(low=0, high=num_city)x[r1], x[r2] = x[r2], x[r1]return xx_ = two_opt(x)
x_
array([ 4, 16, 17,  9,  5, 18, 15,  3,  0, 10,  8,  7, 14,  1, 12, 13,  6,11,  2, 19])

3.1.5评价函数

def eval_func(x):"""评价函数:param x: 解:return: 解的目标函数值"""total_distance = 0for k in range(num_city - 1):total_distance += distance_matrix[x[k]][x[k + 1]]total_distance += distance_matrix[x[-1]][x[0]]return total_distanceobjective_value_x = eval_func(x),  # x的目标函数值
objective_value_x_ = eval_func(x_) # x_的目标函数值
objective_value_x, objective_value_x_
((2666.7841429791642,), 2705.4679394931945)

3.1.6Metropolis接受准则

P = { 1 E ( n + 1 ) < E ( n ) e E ( n + 1 ) − E ( n ) T E ( n + 1 ) ≥ E ( n ) P=\begin{cases} 1 & E(n+1) < E(n) \\ \text{e}^{\frac{E(n+1)-E(n)}{T}} & E(n+1) \geq E(n) \\ \end{cases} P={1eTE(n+1)E(n)E(n+1)<E(n)E(n+1)E(n)

  • E(n):状态为x(n)时系统的能量,即TSP问题中目标函数值
  • T:当前温度,T控制退火速率,即温度下降,最简单的下降方式是指数式下降:T(n) = α \alpha α T(n) ,n =1,2,3,…其中 α \alpha α是小于1的正数,一般取值为0.8到0.99之间。使的对每一温度,有足够的转移尝试,指数式下降的收敛速度比较慢。
temp_current = 1e6
delta_temp = objective_value_x_ - objective_value_x
if delta_temp > 0:# 若新解目标函数值更差,则一定概率接受if np.random.uniform(0, 1) < 1. / np.exp(delta_temp / temp_current):x = x_
else:# TSP为极小化问题,若新解目标函数值更小,则无条件接受新解作为当前解x = x_
x
array([ 4, 16, 17,  9,  5, 18, 15,  3,  0, 10,  8,  7, 14,  1, 12, 13,  6,11,  2, 19])

3.1.7模拟退火算法

def run_simulated_annealing(temp_initial=1e6, temp_final=.1, alpha=.98):""":param temp_initial: 初始温度T0:param temp_final: 终止温度T0:param alpha:降温系数:return: 每一代最优解, 及解的目标函数值"""temp_current = temp_initial  # 当前温度x = np.random.permutation(num_city)  # 初始解,编码采用常规的整数编码,如果城市数目为N,那么解就可以表达为1~N的随机排列,obj_value = eval_func(x)  # 初始解目标函数值global_best = x  # 全局最优解trace: List[Tuple[np.ndarray, float]] = [(x, obj_value)]  # 记录每一代最优解, 及解的目标函数值while temp_current > temp_final:  # 外循环:退火过程for i in range(1000):  # 内循环obj_value_old = eval_func(x)x_ = two_opt(x)obj_value_new = eval_func(x_)delta_temp = obj_value_new - obj_value_oldif delta_temp > 0:if np.random.uniform(0, 1) < 1. / np.exp(delta_temp / temp_current):x = x_else:x = x_global_best = xtrace.append((global_best, eval_func(global_best)))temp_current *= alphareturn trace

3.2完整代码

import logging
from typing import Dict, List, Tupleimport numpy as np
import matplotlib.pyplot as pltlogging.getLogger('matplotlib').setLevel(logging.WARNING)
# logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)def read_dataset(data=1):city_coordinates_ = {0: (60, 200),1: (180, 200),2: (80, 180),3: (140, 180),4: (20, 160),5: (100, 160),6: (200, 160),7: (140, 140),8: (40, 120),9: (100, 120),10: (180, 100),11: (60, 80),12: (120, 80),13: (180, 60),14: (20, 40),15: (100, 40),16: (200, 40),17: (20, 20),18: (60, 20),19: (160, 20),}  # 数据1:城市以及坐标city_coordinates_att48 = {0: (6734, 1453),1: (2233, 10),2: (5530, 1424),3: (401, 841),4: (3082, 1644),5: (7608, 4458),6: (7573, 3716),7: (7265, 1268),8: (6898, 1885),9: (1112, 2049),10: (5468, 2606),11: (5989, 2873),12: (4706, 2674),13: (4612, 2035),14: (6347, 2683),15: (6107, 669),16: (7611, 5184),17: (7462, 3590),18: (7732, 4723),19: (5900, 3561),20: (4483, 3369),21: (6101, 1110),22: (5199, 2182),23: (1633, 2809),24: (4307, 2322),25: (675, 1006),26: (7555, 4819),27: (7541, 3981),28: (3177, 756),29: (7352, 4506),30: (7545, 2801),31: (3245, 3305),32: (6426, 3173),33: (4608, 1198),34: (23, 2216),35: (7248, 3779),36: (7762, 4595),37: (7392, 2244),38: (3484, 2829),39: (6271, 2135),40: (4985, 140),41: (1916, 1569),42: (7280, 4899),43: (7509, 3239),44: (10, 2676),45: (6807, 2993),46: (5185, 3258),47: (3023, 1942),}  # 数据2:att48.txt 城市以及坐标 答案有4种可能,不向上取整,除根号10是10601;不向上取整,不除根号10是33523;向上取整,除根号10是10628;向上取整,不除根号10是33609return city_coordinates_att48 if data == 1 else city_coordinates_def get_distance_matrix(city_coordinates: Dict[int, Tuple[int, int]]) -> np.ndarray:distance_matrix = np.empty(shape=(num_city, num_city), dtype=np.float_)for i in range(num_city):xi, yi = city_coordinates[i]for j in range(num_city):xj, yj = city_coordinates[j]distance_matrix[i][j] = np.sqrt(np.power(xi - xj, 2) + np.power(yi - yj, 2))return distance_matrixdef eval_func(x):"""评价函数:param x: 解:return: 解的目标函数值"""total_distance = 0for k in range(num_city - 1):total_distance += distance_matrix[x[k]][x[k + 1]]total_distance += distance_matrix[x[-1]][x[0]]return total_distancedef two_opt(x: np.ndarray):"""2-opt swap,扰动生成新解:param x: 解:return: 新解"""x = x.copy()r1 = np.random.randint(low=0, high=num_city)r2 = np.random.randint(low=0, high=num_city)x[r1], x[r2] = x[r2], x[r1]return xdef run_simulated_annealing(temp_initial=1e6, temp_final=.1, alpha=.98) -> List:""":param temp_initial: 初始温度T0:param temp_final: 终止温度T0:param alpha:降温系数:return: 每一代最优解, 及解的目标函数值"""temp_current = temp_initial  # 当前温度x = np.random.permutation(num_city)  # 初始解,编码采用常规的整数编码,如果城市数目为N,那么解就可以表达为1~N的随机排列,obj_value = eval_func(x)  # 初始解目标函数值global_best = x  # 全局最优解trace: List[Tuple[np.ndarray, float]] = [(x, obj_value)]  # 记录每一代最优解, 及解的目标函数值while temp_current > temp_final:  # 外循环:退火过程for i in range(1000):  # 内循环obj_value_old = eval_func(x)x_ = two_opt(x)obj_value_new = eval_func(x_)delta_temp = obj_value_new - obj_value_oldif delta_temp > 0:if np.random.uniform(0, 1) < 1. / np.exp(delta_temp / temp_current):x = x_else:x = x_global_best = xtrace.append((global_best, eval_func(global_best)))temp_current *= alphareturn tracedef draw(trace: List) -> None:iteration = np.arange(len(trace))obj_value = [trace[i][1] for i in range(len(trace))]plt.plot(iteration, obj_value)plt.show()final_solution, final_obj_value = trace[-1]x = []y = []for city in final_solution:city_x, city_y = city_coordinates[city]x.append(city_x)y.append(city_y)city_x, city_y = city_coordinates[final_solution[0]]x.append(city_x)y.append(city_y)plt.plot(x, y, 'o-', alpha=1, linewidth=2)plt.show()def print_solution(trace: List[Tuple[int, int]]) -> None:logging.info(f'城市数量: {num_city}')initial_solution, initial_obj_value = trace[0]final_solution, final_obj_value = trace[-1]logging.info(f'initial solution: {initial_solution}, objective value: {initial_obj_value}')logging.info(f'final solution: {final_solution}, objective value: {final_obj_value}')if __name__ == "__main__":city_coordinates = read_dataset()num_city = len(city_coordinates)distance_matrix: np.ndarray = get_distance_matrix(city_coordinates)trace = run_simulated_annealing()print_solution(trace)draw(trace)

3.3求解结果

程序中有两个算例:
1、 city_coordinates_ ,城市数量为20,本文求解结果目标函数值为911.117353844847;其他文章基于禁忌搜索的TSP问题建模求解(Java)结果为886;基于自适应遗传算法的TSP问题建模求解(Java)为879.0。本文求解结果如下(左图):

INFO:root:城市数量: 20
INFO:root:initial solution: [16  2  9 15  7  3 17 14 19  8 11 12  5  0  4  1 13 10  6 18], objective value: 2040.8676784971715
INFO:root:final solution: [ 1  6 10 13 16 19 12  9 15 18 17 14 11  8  4  0  2  5  7  3], objective value: 911.117353844847

2、 city_coordinates_ att48(TSP问题标准测试函数,城市数量48,最优解为33523)本文求解结果为34974.67245297696(右图):

INFO:root:城市数量: 48
INFO:root:initial solution: [15 22 12 34 24 16 26  3 14  2 27 11 10  0 39  5  4 42 19 44 47 18 28 41  31 36 35 20 43 45 30 46  7 13 33 29  1 23 32 40 38  8 21  9  6 25 37 17], objective value: 162186.17660670803
INFO:root:final solution: [26 18 36  5 27  6 17 43 30 37  8  7  0 39  2 21 15 40 33 13 24 47  4 28 1 41  9 44 34  3 25 23 31 38 20 46 12 22 10 11 14 19 32 45 35 29 42 16], objective value: 34974.67245297696
```

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

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

相关文章

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层&#xff0c;目前已有三层投入使用&#xff0c;分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房&#xff0c;其 他各楼层均有一个小房间放置网络设备。 第一步 询…

【Hello Go】Go语言运算符

Go语言运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符运算符优先级 算术运算符 如果之前没有其他语言基础的小伙伴可以参考下我之前写的C语言运算符讲解 这里主要讲解下Go和C运算符的不同点 – 运算符 Go语言中只有后置 和后置– var a int 5a--fmt.P…

竞赛选题 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

【2021集创赛】Arm杯一等奖作品—基于 Cortex-M3 内核 SOC 的动目标检测与跟踪系统

本作品介绍参与极术社区的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~ 团队介绍 参赛单位&#xff1a;北京理工大学 队伍名称&#xff1a;飞虎队 指导老师&#xff1a;李彬 参赛杯赛&#xff1a;Arm杯 参赛人员&#xff1a;余裕鑫 胡涵谦 刘鹏昀 获奖情况&#xff1…

Python数据容器(字典)

字典 1.字典的定义2.字典数据的获取3.字典的嵌套4.嵌套字典的内容获取5.字典的常用操作6.常用操作总结7.遍历字典8.练习 1.字典的定义 同样使用{}&#xff0c;不过存储的元素是一个一个的&#xff1a;键值对&#xff0c;语法如下 # 定义字典字面量 {key:value,key:value,...,…

邮件钓鱼-邮件来源伪造-SPF绕过-setoolkitgohishswaks钓鱼

0x00 SPF简介 SPF即发送方策略框架&#xff0c;某种邮件服务器会有自己的SPF策略设定&#xff0c;可以设定SPF为只允许某些主机发送邮件等&#xff0c;当设定后第三方就无法伪造成邮件服务器的管理员对用户下发邮件。 是否存在SPF的验证&#xff1a; linux下&#xff1a;dig…

day17_多线程基础

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 一、复习 IO流的分类 方向: 输入,输出类型: 字节(XxxStream),字符(XxxReader,XxxWriter)字节输入流类名: FileInputStream字节输出流类名: FileOutputStream字符输入流类名: FileReader字符输出流类…

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds&#xff1a; ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…

RabbitMQ之消息应答和持久化

文章目录 前言一、消息应答1.概念2.自动应答3.消息应答方法4.Multiple 的解释5.消息自动重新入队6.消息手动应答代码7.手动应答效果演示 二、RabbitMQ持久化1.概念2.队列如何实现持久化3.消息实现持久化4.不公平分发5.预取值 总结 前言 在RabbitMQ中&#xff0c;我们的消费者在…

Django之模版层

文章目录 模版语法传值模版语法传值特性模版语法标签语法格式if模板标签for模板标签with起别名 模版语法过滤器常用过滤器 自定义过滤器、标签、inclusion_tag自定义过滤器自定义标签自定义inclusion_tag 模版导入模版继承 模版语法传值 模板层三种语法{{}}:主要与数据值相关{%…

【LLM】0x00 大模型简介

0x00 大模型简介 个人问题学习笔记大模型简介LLM 的能力&#xff1a;LLM 的特点&#xff1a; LangChain 简介LangChain 核心组件 小结参考资料 个人问题 1、大模型是什么&#xff1f; 2、ChatGPT 在大模型里是什么&#xff1f; 3、大模型怎么用&#xff1f; 带着问题去学习&a…

Linux Centos 根目录扩展分区(保级教程)

Centos 根目录扩展分区 1. 扩展背景2.列出磁盘信息3. 对磁盘进行分区4. 重启Linux5. 将PV加入卷组centos并分区6.查看分区结果 1. 扩展背景 虚拟机初始分配20G内存&#xff0c;扩容到80G。 2.列出磁盘信息 可以得知容量信息以及即将创建的PV路径&#xff08;通常为“/dev/s…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间&#xff1a;2024年3月26-28日 地点&#xff1a;上海跨国采购会展中心 随着科技的飞速发展&#xff0c;智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下&#xff0c;汽车不…

Qt 线程串口

文章目录 ui设置创建线程函数初始串口run函数接收发送数据读取数据处理读取的数据写入数据写入启动的命令 主线程 ui设置 创建线程函数 #include <QObject> #include <QThread> #include <QSerialPort> #include <QSerialPortInfo>class SerialPort :…

微信小程序广告banner、滚动屏怎么做?

使用滑块视图容器swiper和swiper-item可以制作滚动屏&#xff0c;代码如下&#xff1a; wxml: <swiper indicator-dots indicator-color"rgba(255,255,255,0.5)" indicator-active-color"white" autoplay interval"3000"><swiper-ite…

Unity Meta Quest 一体机开发(六):HandGrabInteractor 和 HandGrabInteractable 知识点

文章目录 &#x1f4d5;教程说明&#x1f4d5;HandGrabInteractor⭐HandGrabAPI⭐HandWristPoint⭐GripPoint⭐PinchPoint⭐PinchArea⭐HandGrabVisual⭐HandGrabGlow &#x1f4d5;HandGrabInteractable⭐Support Grab Type⭐Pinch Grab Rules 和 Palm Grab Rules⭐Unselect M…

【Java 进阶篇】JQuery 案例:全选全不选,为选择添彩

在前端的舞台上&#xff0c;用户交互是一场精彩的表演&#xff0c;而全选全不选的功能则是其中一段引人入胜的剧情。通过巧妙运用 JQuery&#xff0c;我们可以为用户提供便捷的全选和全不选操作&#xff0c;让页面更富交互性。本篇博客将深入探讨 JQuery 中全选全不选的实现原理…

pytorch tensor数据类型转换为python数据

一、item() input: x torch.tensor([1.0]) x.item()output: 1.0二、tolist() input: a torch.randn(2, 2) a.tolist() a[0,0].tolist()output: [[0.012766935862600803, 0.5415473580360413],[-0.08909505605697632, 0.7729271650314331]]0.012766935862600803

【论文阅读】(CTGAN)Modeling Tabular data using Conditional GAN

论文地址&#xff1a;[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务&#xff0c;有着许多挑战。本文设计了CTGAN&#xff0c;使用条件生成器解决挑战。为了帮助进行公…

IDEA如何打断点调试

目录 1. 设置断点2. 调试3. 调试的基本操作3.1 step over3.2 step into 跟 Force step into3.3 step out3.4 resume program3.5 mute breakpoints3.6 view breakpoints3.6 条件断点 编写代码的时候&#xff0c;有时候我们需要跟踪代码的运行情况&#xff0c;使用断点调试就是一…