当前位置: 首页 > news >正文

算法-TSP旅行商问题-03 - jack

目录
  • 问题的核心要素
  • 问题的复杂性
  • 常见的解法
  • 对于大规模问题:
  • 穷举
  • 动态规划实现 (Held-Karp)

旅行商问题 (Traveling Salesperson Problem, TSP)
旅行商问题是计算机科学和运筹学领域一个非常经典且著名的组合优化问题,
给定一系列城市和每对城市之间的距离,找到一条最短的哈密顿回路,使得旅行商从一个城市出发,经过所有其他城市恰好一次,最后返回到起点。

例如:你带着一批货物,沿着一条线路,经过一系列城市,售卖货物,最后回到家里。

问题的核心要素

城市(Cities): 问题的节点,你可以把它们看作图中的顶点。
路径/距离(Paths/Distances): 连接城市之间的边,每条边都有一个权重,通常代表距离、成本或时间。
哈密顿回路(Hamiltonian Cycle): 一条路径,它从一个城市出发,经过所有其他城市恰好一次,然后回到起点。
目标(Objective): 在所有可能的哈密顿回路中,找到总距离最短的那一条

问题的复杂性

当城市的数量增加时,问题的难度会呈指数级增长。
假设有 n 个城市。从一个城市出发,你可以在剩下的 n−1 个城市中选择一个,然后从剩下的 n−2 个城市中选择一个,以此类推。因此,总的可能路径数量是 (n−1)!。
当城市数量较大时,暴力枚举所有可能的路径是不可行的,因为计算量会大到无法接受。

常见的解法

由于TSP的复杂性,通常我们会根据问题的规模,选择不同的方法:
对于小规模问题:
暴力穷举法(Brute-force): 这是最直观的方法,通过生成所有可能的路径,然后计算每条路径的总距离,最后找出最短的那条。这种方法能保证找到最优解,但只适用于城市数量很少的情况(通常小于10)。

动态规划(Dynamic Programming): 动态规划是一种更高效的精确解法,其中最著名的是Held-Karp算法。它利用子问题的最优解来构建整个问题的最优解,可以求解城市数量在20个左右的问题。

对于大规模问题:

当城市数量超过20个时,精确解法变得不可行。这时,我们会转向近似算法(Approximation Algorithms)或启发式算法(Heuristic Algorithms)。这些算法不能保证找到最优解,但可以在合理的时间内找到一个足够好的近似解。
最近邻算法(Nearest Neighbor Algorithm): 从一个随机城市出发,每次都前往离当前城市最近的未访问城市,直到所有城市都被访问。这种方法简单快速,但结果可能不是最优的。
遗传算法(Genetic Algorithm): 一种基于生物进化原理的搜索算法。它通过模拟“基因突变”和“自然选择”来不断优化解,适用于大规模复杂问题。
模拟退火算法(Simulated Annealing): 借鉴了物理学中固体退火的过程,通过接受一些次优的解来跳出局部最优,从而寻找全局最优解。
蚁群优化算法(Ant Colony Optimization): 灵感来源于蚂蚁寻找食物的路径行为。蚂蚁通过留下信息素来引导同伴,最终找到最短路径。

穷举

import itertools
import math# 假设城市坐标
# A=(0,0), B=(1,2), C=(3,1), D=(2,-1)
cities = {'A': (0, 0),'B': (1, 2),'C': (3, 1),'D': (2, -1)
}# 计算两点之间的欧几里得距离
def distance(p1, p2):return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)# 暴力穷举法求解 TSP
def solve_tsp_brute_force(cities):# 城市名称列表,固定起点为第一个city_names = list(cities.keys())start_city = city_names[0]other_cities = city_names[1:]min_distance = float('inf')best_path = None# 生成除起点外的所有城市排列for permutation in itertools.permutations(other_cities):current_path = [start_city] + list(permutation) + [start_city]current_distance = 0# 计算当前路径的总距离for i in range(len(current_path) - 1):from_city = current_path[i]to_city = current_path[i+1]current_distance += distance(cities[from_city], cities[to_city])# 检查是否是更短的路径if current_distance < min_distance:min_distance = current_distancebest_path = current_pathreturn min_distance, best_path# 运行代码
min_dist, best_path = solve_tsp_brute_force(cities)
print(f"最短总距离: {min_dist}")
print(f"最优路径: {' -> '.join(best_path)}")

动态规划实现 (Held-Karp)

# 示例:4个城市的距离矩阵
# [0]  [1]  [2]  [3]
distances_matrix = [[0, 10, 15, 20],  # 城市 0 到其他城市[10, 0, 35, 25],  # 城市 1 到其他城市[15, 35, 0, 30],  # 城市 2 到其他城市[20, 25, 30, 0]   # 城市 3 到其他城市
]def solve_tsp_dp(distances):n = len(distances)# 使用字典作为备忘录# 键为 (visited_mask, current_city) 当前在哪里 去过哪里memo = {}# 城市编号	3	 2	 1	 0# 二进制位	b_3	b_2	b_1	b_0# visited_mask = 5 二进制表示[0101] 则代表0,2两个城市已经访问过def tsp_recursive(mask, pos):  # 子问题 在mask情况下 pos出发  访问剩余城市 回到起点 的最小总距离# 递归终止条件:所有城市都被访问if mask == (1 << n) - 1:  # 1111return distances[pos][0]  # pos返回到起点0 的距离# 检查备忘录if (mask, pos) in memo:return memo[(mask, pos)]min_cost = float('inf')# 遍历所有未访问的城市for next_city in range(n):# 检查 next_city 是否未被访问if not (mask & (1 << next_city)):  # 查看mask中next_city位置是否为1# 如果没有访问过,则继续递归new_mask = mask | (1 << next_city)  # mask中next_city位置标记为1new_cost = distances[pos][next_city] + tsp_recursive(new_mask, next_city)min_cost = min(min_cost, new_cost)# 将结果存入备忘录memo[(mask, pos)] = min_costreturn min_costreturn tsp_recursive(1, 0)# 运行代码
min_dist_dp = solve_tsp_dp(distances_matrix)
print(f"动态规划求解的最短总距离: {min_dist_dp}")
import mathdef solve_tsp_dp_with_path(distances):n = len(distances)# 备忘录:存储最小成本memo_cost = {}# 备忘录:存储下一个最佳城市memo_path = {}def tsp_recursive(mask, pos):# 递归终止条件:所有城市都被访问if mask == (1 << n) - 1:return distances[pos][0]# 检查成本备忘录if (mask, pos) in memo_cost:return memo_cost[(mask, pos)]min_cost = float('inf')best_next_city = -1# 遍历所有未访问的城市for next_city in range(n):if not (mask & (1 << next_city)):new_mask = mask | (1 << next_city)current_cost = distances[pos][next_city] + tsp_recursive(new_mask, next_city)if current_cost < min_cost:min_cost = current_costbest_next_city = next_city# 将结果存入两个备忘录memo_cost[(mask, pos)] = min_costmemo_path[(mask, pos)] = best_next_cityreturn min_cost# 1. 计算最小距离min_dist = tsp_recursive(1, 0)# 2. 回溯并构建路径path = [0]  # 从城市 0 开始current_mask = 1  # 初始掩码为 1 (1 << 0)current_pos = 0  # 当前位置为 0while len(path) < n:# 从路径备忘录中获取下一个最佳城市next_city = memo_path[(current_mask, current_pos)]path.append(next_city)# 更新掩码和当前位置,以便下一次循环current_mask |= (1 << next_city)current_pos = next_citypath.append(0)  # 添加起点作为终点,形成闭环return min_dist, path# 示例:4个城市的距离矩阵
distances_matrix = [[0, 10, 15, 20],  # 城市 0 到其他城市[10, 0, 35, 25],  # 城市 1 到其他城市[15, 35, 0, 30],  # 城市 2 到其他城市[20, 25, 30, 0]  # 城市 3 到其他城市
]# 运行代码
min_dist, best_path = solve_tsp_dp_with_path(distances_matrix)
print(f"动态规划求解的最短总距离: {min_dist}")
print(f"最优路径: {' -> '.join(map(str, best_path))}")

动态规划求解的最短总距离: 80
最优路径: 0 -> 1 -> 3 -> 2 -> 0

相关文章:

算法-TSP旅行商问题-03 - jack

目录问题的核心要素问题的复杂性常见的解法对于大规模问题:穷举动态规划实现 (Held-Karp) 旅行商问题 (Traveling Salesperson Problem, TSP) 旅行商问题是计算机科学和运筹学领域一个非常经典且著名的组合优化问题, 给定一系列城市和每对城市之间的距离,找到一条最短的哈密…...

AI编程⑤:【Cursor保姆级教程】零基础小白从安装到实战,手把手教你玩转AI编程神器!

一、什么是AI编程? 以前的编程是靠专业技术人员+学习至少一门擅长的编程语言去写程序 现在是通过对话聊天+AI大模型写程序 对话+AI大模型=AI编程 所有的模型对话上下文都有长度限制,这也是目前AI编程一个短板所在 二、Cursor免费和收费的区别,怎么充值?模式特点免费只能使用…...

ArkTS

装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,@Component表示自定义组件,@Entry表示该自定义组件为入口组件,@State表示组件中的状态变量,状态变量变化会触发UI刷新。 UI描述:以声明式的方式来描述UI…...

一文读懂基因检测PLM、体外诊断试剂PLM的功能、价值、解决方案

在体外诊断(IVD)与基因检测行业,研发面临 “高合规门槛、高数据复杂度、高协同需求” 三重挑战:合规需满足 ISO 13485、FDA 21 CFR Part 11、NMPA 等多标准,疏漏易致上市延期;基因试剂需记录上百种物料参数,实验数据关联复杂,传统 Excel 管理易出错、难追溯;研发与 SA…...

ai本地部署工具有哪些?新手入门AI推荐这几个

随着ai技术的火热,越来越多新手想尝试在本地部署ai模型,体验ai的魅力。但面对复杂的部署流程,不少人望而却步。其实,选对工具能让部署变得简单。今天就给大家推荐几款适合新手的ai本地部署工具,其中首推DS本地部署大师,还会详细介绍用它部署DeepSeek的操作步骤。 一、几款…...

匿名内部类

...

文件上传、分片上传结合antdProComponents表格展示,点击上传

文件上传、分片上传结合antdProComponents表格展示,点击上传上传组件:// ChunkUpload.jsx import React, { useCallback, forwardRef, useState, useImperativeHandle, useEffect, useRef } from react; import { UploadDropZone } from @rpldy/upload-drop-zone; import {Ch…...

2025 年 PLM 市场新锐崛起:五家厂商以创新技术引领行业变革新路径

在制造业数字化转型的汹涌浪潮中,产品生命周期管理(PLM)领域正历经着前所未有的深刻变革。往昔传统的软件模式逐渐式微,一批将技术创新奉为圭臬的新锐厂商强势登场。它们凭借独具差异化的解决方案,宛如矫健的黑马,在市场中迅速崭露头角,为制造企业精心打造出从研发设计的…...

2025 年国产 PLM 系统发展全景:厂商实力与核心功能深度解读

随着国产 PLM 技术的持续突破,本土厂商在功能适配性、行业针对性和服务响应速度上的优势愈发凸显,为不同规模、不同领域的制造企业提供了更贴合需求的解决方案。本文将聚焦 2025 年国产 PLM 系统主流厂商,全面解析厂商特色与系统核心功能模块,为企业选型提供参考。一、2025…...

开发效率翻倍!编码助手+云效 AI 评审如何破解代码质量与速度难题?

如今随着 AI 技术的突破,这一问题出现了全新解法:使用编码助手(包括不限于通义灵码、Qoder、Cursor、Claude Code 等工具,本文以通义灵码作为示例) + 云效 AI 评审,助力解决传统开发流程中的一些挑战。作者:致信 背景 随着软件开发复杂度的持续攀升和产品迭代周期的不断…...

SSL部署完成,https显示连接不安全如何处理?

在部署 SSL 后,如果浏览器仍然显示 “连接不安全” 或 “Not Secure”,通常是由以下几种原因导致的。针对每种可能的原因和问题,以下提供了详细的排查和解决方案。1. 排查问题的可能原因 1.1 SSL 证书未正确安装 如果 SSL 证书安装不完整或配置错误,浏览器会显示连接不安全…...

各省简称

各省简称目录一、华北地区二、东北地区三、华东地区四、华中地区五、华南地区六、西南地区七、西北地区八、特别行政区记忆小技巧: 一、华北地区省份全称 简称 由来简述北京市 京 直接取自全称中的字。历史上是京城的所在地。天津市 津 直接取自全称中的字。意为“天子的渡口”…...

完整教程:HDFS基准测试与数据治理

完整教程:HDFS基准测试与数据治理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

var code = 76cb2b4f-5a26-4a70-a3bf-dc8f2ae5162f

var code = "76cb2b4f-5a26-4a70-a3bf-dc8f2ae5162f"...

解放双手!三端通用的鼠标连点神器

前言在日常工作和游戏中,我们经常遇到需要大量重复点击的情况——无论是抢购、快速通过游戏关卡,还是处理繁琐的数据录入工作。手动重复点击不仅枯燥乏味,还容易导致手腕疲劳。今天给大家分享一款轻巧易用的鼠标连点器工具,支持多种点击模式,彻底解放你的双手!为什么推荐…...

用 C# 与 Tesseract 实现验证码识别系统

一、项目概述 验证码识别在自动化测试、爬虫开发与用户辅助系统中具有重要价值。本文将介绍如何使用 C# 调用 Tesseract OCR 实现验证码图像识别功能,并对验证码图像进行简单预处理,以提高识别准确率。 二、开发环境准备安装 Tesseract 更多内容访问ttocr.com或联系143642394…...

【9月19日最终截稿,SPIE出版】2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)

2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)将于2025年9月26-28日在黑龙江哈尔滨盛大召开。旨在为全球学者、工程师及行业专家提供一个高水平交流平台,围绕信息工程、人工智能、大数据、物联网、5G/6G通信等前沿领域展开研讨,分享最新研究成果与技术…...

Dockerfile:如何用CMD同时启动两个进程

场景 在一个Dockerfile中,如何编写CMD指令,使得可以同时启动两个进程? 方案 这两个进程假设分别为Springboot Jar工程、sh脚本:app.jar script.sh需要明确一点:CMD指令本身只能直接执行一个命令 所以我们只能通过间接方式来做到启动多个进程:使用启动脚本start.sh,在其中…...

启动GA-Event Activated,结束GA-End Ability

在GA中 Event Activated是激活时的行为 在激活结尾时调用End Ability...

202003_MRCTF_千层套娃

ZIP套娃,QR二维码Tags:ZIP套娃,QRCODE 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202003_MRCTF_千层套娃.zip 0x01. WP 01. 打开压缩文件发现hint信息 发现是zip套娃,需要通过python脚本进行自动化解压H…...

基于MATLAB的粒子群算法优化广义回归神经网络的实现

基于MATLAB的粒子群算法(PSO)优化广义回归神经网络(GRNN)的实现一、算法原理与流程 graph TDA[数据准备] --> B[PSO参数初始化]B --> C[GRNN适应度计算]C --> D[粒子速度更新]D --> E[粒子位置更新]E --> F[全局最优解更新]F --> G[GRNN模型训练]G -->…...

MySql EXPLAIN 详解

1、EXPLAIN介绍 EXPLAIN语句提供MySQL如何执行语句的信息。EXPLAIN返回SELECT语句中使用的每个表的信息并列出一行运行数据。它是按照MySQL在处理语句时读取表的顺序列出并输出到一个表格中。2、查询示例 2.1、【explain + 表名】显示的是这个表的表结构。 2.2、【explain + s…...

Transformer完整实现及注释

主要组件:Multi-Head Self-Attention (多头自注意力) Position Encoding (位置编码) Feed Forward Network (前馈神经网络) Encoder/Decoder Layer (编码器/解码器层) Complete Transformer Model (完整模型) """import torch import torch.nn as nn import to…...

数据策略与模型算法

数据策略与模型算法数据工程师:更多关心「基建」的问题,比如,数据链路如何构建、如何做技术选型、效率稳定性如何保障等等。 算法工程师:更多关心「模型」的问题,比如,具体某个算法是什么原理,如何调参等等。 数据分析师:运用工具解决「端到端」的问题,包括「问题抽象…...

25fall-cs101 作业图床 - Amy

...

在使用代理的时候,可以使用更简单的C++语法代替FGameplayAttribute代理,使用TStaticFuncPtr T

DECLARE_DELEGATE_REVAL(FGameplayAttribute, FAttributeSignature); 比如这里的代理 定义为FAttributeSignature AttributeSignature ;但是可以不生命代理,直接声明 TBaseStaticDelegateInstance<FGameplayAttribute(), FDefaultDelegateUserPolicy>::FFuncPtr它代表…...

从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!

完整内容:从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!你是否曾在面对大量文章资料,却要在短时间内将其精华提炼并制作成演示文稿时,感到焦头烂额、无从下手?一页页翻阅文章,手动摘取要点,再逐一编排进 PPT,整个过程繁琐又耗时,效率低下不说,最终呈现…...

[WPF学习笔记]多语言切换-001

1、VS2019新建项目2、引入Nuget包 3、修改XML代码引入命名空间并设置<Window x:Class="WPFMultiLanguageTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/…...

Shell 语法摘要

sed 的使用 sed 的全称是 Stream Editor,即流编辑器。它可以逐行处理输入数据(先将读入的行放到缓冲区中,对缓冲区里的内容进行处理),并将处理结果输出到标准输出。 格式:sed [选项] [address]{脚本命令(块)} 文件名 前缀 address 可以是数字或者文本(正则),格式:[addr…...

软件设计师知识点总结(一)

一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概念, 只有一个根目录 /, 所有文件都在它下面 二、常见目录介绍(记住重点)目录作用/bin二进制命令所在的目录(普通命令 => 普通用户…...

智能引擎驱动:DRS.Editor让汽车诊断设计效率跃升!

在汽车电子诊断数据管理领域,用户普遍依赖传统的线下 Excel 管理模式,这种离线、文件化的方式常常导致数据分散、版本混乱、共享困难、复用率低,正成为制约开发效率与质量的瓶颈,并带来以下痛点:校验低效易错:诊断数据编写不规范,合法性、逻辑性及完整性校验效率低,易出…...

【译】Visual Studio 2026 Insider 来了!

Visual Studio 2026 Insider 现已发布 —— 这标志着我们在这款 IDE 上迈出了最具雄心的一步。此版本将人工智能直接融入开发者的工作流程,性能方面的改进重新树立了企业级规模下对速度的预期,而现代化的设计则让整个开发环境感觉更轻盈、更专注。并且,我们首次推出了全新的…...

GAS_Aura-Granting Abilities

1...

CH584 CH585 触摸应用介绍一

1、提供的资料工程和功能介绍 | | | |-- TOUCH | | | | |-- TKYLIB:触摸库文件及其头文件 | | | | |-- Touch_EX001:触摸应用的综合演示,包括触摸滑条、触摸滑环、触摸按键和隔空感应四种触摸应用,配合EVB使用。 | | …...

OpenEuler 24.03 (LTS-SP2)安装最新版本docker

OpenEuler 24.03系统默认安装的docker版本是18.09,该版本有重大bug,所以鉴于此安装最新版本docker。 一、配置 Docker 仓库 首先,需要设置 Docker 的官方仓库,和替换为国内的镜像源。 1.安装必要的包:sudo dnf install -y dnf-utils2.设置稳定的仓库: docker官方没有明确…...

西门子SINAMICS S120伺服驱动系统介绍

SINAMICS S120是集V/F、矢量控制及伺服控制于一体的驱动控制系统,可以控制普通的三相异步电动机,还能控制同步电机、扭矩电机及直线电机,属于高性能驱动,是西门子SINAMICS M1级产品。S120产品特点“高度灵活”的模块化设计 允许不同功率等级与控制性能的单元自由组合,所有…...

第10章 STM32 模拟SPI电阻屏触摸配置和测试

前言 硬件的配置由前面的工程递增,会根据目的修改部分控制代码 由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成 源码地址https://gitcode.com/qq_36517072/stm32,第x章为cx文件夹一、STM32CUBE配置修改 带的2…...

ABAP同步和异步

在保存增强触发其他单据生成或者自建表保存需要COMMIT WORK 时候使用STARTING NEW TASK 优势是在新会话中提交:在这个新的、独立的上下文中执行 COMMIT WORK,只会提交该 RFC 函数内部自身的数据库操作,而不会影响到主增强程序所在的事务上下文。主程序的数据库更改仍会等待…...

202208_网鼎杯青龙组_CRYPTO

MD5,爆破Tags:MD5,爆破 0x00. 题目 小A鼓起勇气向女神索要电话号码,但女神一定要考考他。女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞,该漏洞可以向陌生人泄露AirDrop发起者或接收者的电话号码和电子邮箱。小A经…...

Oracle笔记:11GR2 datagruad 环境搭建BORKER

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle笔记:11GR2 datagruad 环境搭建BORKER 公司所有的DG环境都用到了…...

GAS_Aura-Gameplay Abilities

1简单说明了下GAS运行的情景...

领域驱动设计(DDD)【23】之泛化:从概念到实践

文章目录 一 泛化基础&#xff1a;理解DDD中的核心抽象机制1.1 什么是泛化&#xff1f;1.2 为什么泛化在DDD中重要&#xff1f;1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承&#xff1a;最直接的泛化实现2.2 接口实现&#xff1a;更灵活的泛化方…...

零基础langchain实战二:大模型输出格式化成json

零基础langchain实战一&#xff1a;模型、提示词和解析器-CSDN博客 书接上文 大模型输出格式化 在下面例子中&#xff1a;我们需要将大模型的输出格式化成json。 import os from dotenv import load_dotenvload_dotenv() # 加载 .env 文件 api_key os.getenv("DEEPS…...

Python 数据分析:numpy,抽提,整数数组索引

目录 1 代码示例2 欢迎纠错3 免费爬虫------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个…...

在项目中如何巧妙使用缓存

缓存 对于经常访问的数据&#xff0c;每次都从数据库&#xff08;硬盘&#xff09;中获取是比较慢&#xff0c;可以利用性能更高的存储来提高系统响应速度&#xff0c;俗称缓存 。合理使用缓存可以显著降低数据库的压力、提高系统性能。 那么&#xff0c;什么样的数据适合缓存…...

C语言字符串

字符串是C语言最核心的概念之一&#xff0c;却也是引发最多Bug的领域。掌握它&#xff0c;你将解锁高效处理文本的能力&#xff1b;忽视细节&#xff0c;则可能陷入内存陷阱。 一、字符串的本质&#xff1a;字符数组 核心规则&#xff1a;C语言用\0&#xff08;ASCII值0&#…...

HarmonyOS NEXT仓颉开发语言实战案例:图片预览器

上文分享了如何使用仓颉语言实现动态广场&#xff0c;动态广场中有很多图片&#xff0c;本文一下如何使用仓颉语言实现一个图片放大预览器&#xff1a; 看到这个效果&#xff0c;我首先想到的实现方案是弹窗&#xff0c;弹窗的弹出和消失效果为我们节省了很多工作&#xff0c;这…...

Rust代码规范之蛇形命名法和驼峰命名法

Rust 使用两种主要的命名风格&#xff1a;驼峰命名法&#xff08;UpperCamelCase&#xff09;和蛇形命名法&#xff08;snake_case&#xff09;。通常&#xff0c;类型&#xff08;如结构体、枚举、特征&#xff09;使用驼峰命名法&#xff0c;而变量、函数、方法等使用蛇形命名…...

cocos creator 3.8 - 精品源码 - 六边形消消乐(六边形叠叠乐、六边形堆叠战士)

cocos creator 3.8 - 精品源码 - 六边形消消乐 游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验 游戏介绍 六边形堆叠战士(六边形消消消)是一款脱胎于2048、1010&#xff0c;基于俄罗斯方块的魔性方块达人小游戏&#xff0c;可以多方向多造型消除哦&#xff01; 功能介…...

(七)Spring Web

Spring Web 是 Spring Framework 的一部分&#xff0c;专门用于构建 Web 应用程序。Spring Web 提供了一个强大的基础设施&#xff0c;用于开发 Web 服务、Web 应用程序和 RESTful API。它包括许多模块和组件&#xff0c;帮助开发人员轻松地构建、配置和管理 Web 应用程序。 以…...