人工智能A*算法与CNN结合- CNN 增加卷积层的数量,并对卷积核大小进行调整
以下是一个增强版的将 A* 算法与卷积神经网络(CNN)结合的代码实现,其中 CNN 增加了卷积层的数量,并对卷积核大小进行了调整。整体思路依然是先利用 A* 算法生成训练数据,再用这些数据训练 CNN 模型,最后使用训练好的模型进行路径规划。
import numpy as np
import heapq
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader# A* 算法实现
class Node:def __init__(self, x, y, g=float('inf'), h=float('inf'), parent=None):self.x = xself.y = yself.g = gself.h = hself.f = g + hself.parent = parentdef __lt__(self, other):return self.f < other.fdef heuristic(current, goal):return abs(current[0] - goal[0]) + abs(current[1] - goal[1])def astar(grid, start, goal):rows, cols = grid.shapeopen_list = []closed_set = set()start_node = Node(start[0], start[1], g=0, h=heuristic(start, goal))heapq.heappush(open_list, start_node)while open_list:current_node = heapq.heappop(open_list)if (current_node.x, current_node.y) == goal:path = []while current_node:path.append((current_node.x, current_node.y))current_node = current_node.parentreturn path[::-1]closed_set.add((current_node.x, current_node.y))neighbors = [(0, 1), (0, -1), (1, 0), (-1, 0)]for dx, dy in neighbors:new_x, new_y = current_node.x + dx, current_node.y + dyif 0 <= new_x < rows and 0 <= new_y < cols and grid[new_x][new_y] == 0 and (new_x, new_y) not in closed_set:new_g = current_node.g + 1new_h = heuristic((new_x, new_y), goal)new_node = Node(new_x, new_y, g=new_g, h=new_h, parent=current_node)found = Falsefor i, node in enumerate(open_list):if node.x == new_x and node.y == new_y:if new_g < node.g:open_list[i] = new_nodeheapq.heapify(open_list)found = Truebreakif not found:heapq.heappush(open_list, new_node)return None# 生成训练数据
def generate_training_data(grid, num_samples):rows, cols = grid.shapeinputs = []outputs = []for _ in range(num_samples):start = (np.random.randint(0, rows), np.random.randint(0, cols))goal = (np.random.randint(0, rows), np.random.randint(0, cols))path = astar(grid, start, goal)if path:input_data = np.zeros((1, rows, cols))input_data[0, start[0], start[1]] = 1input_data[0, goal[0], goal[1]] = 2output_data = np.zeros((1, rows, cols))for point in path:output_data[0, point[0], point[1]] = 1inputs.append(input_data)outputs.append(output_data)return np.array(inputs), np.array(outputs)# 自定义数据集类
class PathDataset(Dataset):def __init__(self, inputs, outputs):self.inputs = torch.tensor(inputs, dtype=torch.float32)self.outputs = torch.tensor(outputs, dtype=torch.float32)def __len__(self):return len(self.inputs)def __getitem__(self, idx):return self.inputs[idx], self.outputs[idx]# 定义增强版卷积神经网络模型
class EnhancedPathCNN(nn.Module):def __init__(self):super(EnhancedPathCNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=5, padding=2)self.relu1 = nn.ReLU()self.conv2 = nn.Conv2d(32, 64, kernel_size=5, padding=2)self.relu2 = nn.ReLU()self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.relu3 = nn.ReLU()self.conv4 = nn.Conv2d(128, 64, kernel_size=3, padding=1)self.relu4 = nn.ReLU()self.conv5 = nn.Conv2d(64, 1, kernel_size=3, padding=1)def forward(self, x):x = self.relu1(self.conv1(x))x = self.relu2(self.conv2(x))x = self.relu3(self.conv3(x))x = self.relu4(self.conv4(x))x = self.conv5(x)return x# 训练神经网络
def train_model(model, dataloader, criterion, optimizer, epochs):for epoch in range(epochs):running_loss = 0.0for inputs, labels in dataloader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f'Epoch {epoch + 1}, Loss: {running_loss / len(dataloader)}')# 主程序
if __name__ == "__main__":# 示例地图map_grid = np.array([[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 0, 0, 0],[0, 0, 1, 1, 0],[0, 0, 0, 0, 0]])# 生成训练数据num_samples = 1000inputs, outputs = generate_training_data(map_grid, num_samples)# 创建数据集和数据加载器dataset = PathDataset(inputs, outputs)dataloader = DataLoader(dataset, batch_size=32, shuffle=True)# 初始化增强版 CNN 模型model = EnhancedPathCNN()# 定义损失函数和优化器criterion = nn.MSELoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型epochs = 10train_model(model, dataloader, criterion, optimizer, epochs)# 使用训练好的模型进行路径规划start = (0, 0)goal = (4, 4)input_data = np.zeros((1, 1, map_grid.shape[0], map_grid.shape[1]))input_data[0, 0, start[0], start[1]] = 1input_data[0, 0, goal[0], goal[1]] = 2input_tensor = torch.tensor(input_data, dtype=torch.float32)output = model(input_tensor)output_path = output.detach().numpy()[0, 0]path_points = np.argwhere(output_path > 0.5)print("增强版 CNN 预测的路径点:", path_points)
代码解释
1. A* 算法部分
这部分和之前的实现基本一致,Node 类用于表示地图中的节点,heuristic 函数计算启发式代价,astar 函数通过维护开放列表和关闭列表来搜索从起点到终点的最短路径。
2. 数据生成部分
generate_training_data 函数随机生成起点和终点,调用 A* 算法计算路径,将起点、终点信息作为输入,路径信息作为输出,生成训练数据。
3. 数据集和数据加载器部分
PathDataset 类继承自 torch.utils.data.Dataset,用于封装训练数据,DataLoader 用于批量加载数据并支持随机打乱。
4. 增强版卷积神经网络部分
EnhancedPathCNN类定义了一个更复杂的 CNN 模型,增加了卷积层的数量,同时调整了卷积核的大小。具体来说,前两层使用 5x5 的卷积核,后三层使用 3x3 的卷积核,每层卷积后都接一个 ReLU 激活函数,最后一层卷积输出单通道的预测路径。train_model函数使用均方误差损失函数(nn.MSELoss)和 Adam 优化器对模型进行训练,在多个 epoch 中不断更新模型参数。
5. 主程序部分
定义示例地图,生成训练数据,创建数据集和数据加载器,初始化增强版 CNN 模型,定义损失函数和优化器,训练模型,最后使用训练好的模型进行路径规划并输出预测的路径点。
注意事项
- 增加卷积层和调整卷积核大小可能会增加模型的复杂度和训练时间,需要确保有足够的计算资源和训练数据。
- 可以根据实际情况进一步调整模型结构、卷积核大小、学习率等超参数,以获得更好的性能。
- CNN 模型预测的路径不一定是最优路径,A* 算法能保证最优路径,但 CNN 可以在效率上有一定提升。
相关文章:
人工智能A*算法与CNN结合- CNN 增加卷积层的数量,并对卷积核大小进行调整
以下是一个增强版的将 A* 算法与卷积神经网络(CNN)结合的代码实现,其中 CNN 增加了卷积层的数量,并对卷积核大小进行了调整。整体思路依然是先利用 A* 算法生成训练数据,再用这些数据训练 CNN 模型,最后使用…...
机器学习中常用的评价指标
一、分类任务常用指标 1. 准确率(Accuracy) 定义:正确预测样本数占总样本数的比例。优点:直观易懂,适用于类别平衡的数据。缺点:对类别不平衡数据敏感(如欺诈检测中99%的负样本)。…...
Windows安装cwgo,一直安装的是linux平台的
Windows安装cwgo,一直安装的是linux平台的 查看 go env ,发现 GOOSlinux 临时修改 GOOS ,set GOOSwindows ,再安装。 此时,安装的就是 windows 的可执行文件。安装之后再将 GOOS 修改回来即可。...
GitHub Pages + Jekyll 博客搭建指南(静态网站)
目录 🚀 静态网站及其生成工具指南🌍 什么是静态网站?📌 静态网站的优势⚖️ 静态网站 VS 动态网站 🚀 常见的静态网站生成器对比🛠️ 使用 GitHub Pages Jekyll 搭建个人博客📌 1. 创建 GitHu…...
21.[前端开发]Day21-HTML5新增内容-CSS函数-BFC-媒体查询
王者荣耀-网页缩小的问题处理 为什么会产生这个问题?怎么去解决 可以给body设置最小宽度 1 HTML5新增元素 HTML5语义化元素 HTML5其他新增元素 2 Video、Audio元素 HTML5新增元素 - video video支持的视频格式 video的兼容性写法 HTML5新增元素 - audio audio…...
C++SLT(五)——list
目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...
网络安全ITP是什么 网络安全产品ips
DS/IPS都是专门针对计算机病毒和黑客入侵而设计的网络安全设备 1、含义不同 IDS :入侵检测系统(发现非法入侵只能报警不能自己过滤) 做一个形象的比喻:假如防火墙是一幢大楼的门锁,那么IDS就是这幢大楼里的监视系统…...
评估大模型(LLM)摘要生成能力:方法、挑战与策略
大语言模型(LLMs)有着强大的摘要生成能力,为信息快速提取和处理提供了便利。从新闻文章的快速概览到学术文献的要点提炼,LLMs 生成的摘要广泛应用于各个场景。然而,准确评估这些摘要的质量却颇具挑战。如何确定一个摘要…...
《PYTHON语言程序设计》(2018版)1.20修改这道题,利用类的方式(二) 接近成功....(上)
在类的外面建立4个顶点 turtle.speed(20)ran1_x1 random.randint(-69, -60) ran1_y1 random.randint(-5, 10) ran1_x2 random.randint(-69, -60) ran1_y2 random.randint(75, 80) ran1_x3 random.randint(79, 90) ran1_y3 random.randint(70, 85) ran1_x4 random.randin…...
USB子系统学习(四)使用libusb读取鼠标数据
文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商品详情 …...
【产品小白】用户调研的需求是否都采纳?
在用户调研中,并非所有需求都应被直接采纳,而应通过系统分析转化为符合产品战略的有效决策。以下是关键思考框架: 1. 用户需求 ≠ 产品需求 矛盾性:用户个体需求可能相互冲突(如A功能的去留),需…...
软件测试就业
文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别?六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…...
qt部分核心机制
作业 1> 手动将登录项目实现,不要使用拖拽编程 并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一个跳转信号,如果登录失败&#…...
【RocketMQ】RocketMq之ConsumeQueue深入研究
目录 一:RocketMq 整体文件存储介绍 二:ConsumeQueue 的文件结构 三:ConsumeQueue 写入和查询流程 一:RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分: CommitLog:存储消息的元数据。所有消息都会…...
如今物联网的快速发展对hmi的更新有哪些积极影响
一、功能更加丰富 物联网的快速发展使得 HMI(人机界面)能够连接更多的设备和系统,从而实现更加丰富的功能。例如,通过与传感器网络的连接,HMI 可以实时显示设备的运行状态、环境参数等信息,为用户提供更加…...
linux 性能60秒分析
linux 60秒分析 需要运行的工具是 1、uptime 2、dmesg | tail 3、vmstat 1 4、mpstat -P ALL 1 5、pidstat 1 6、iostat -xz 1 7、free -m 8、sar -n DEV 1 9、sar -n TCP,ETCP 1 10、topuptime 快速检查平均负载 [rootaaaaaa ~]# uptime15:17:20 up 3 days, 14 min, 7 us…...
Redisson全面解析:从使用方法到工作原理的深度探索
文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…...
neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.
目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j,参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后,重新登录网页版neo4j,发现对应的数据库状态变…...
51单片机之引脚图(详解)
8051单片机引脚分类与功能笔记 1. 电源引脚 VCC(第40脚):接入5V电源,为单片机提供工作电压。GND(第20脚):接地端,确保电路的电位参考点。 2.时钟引脚 XTAL1(第19脚&a…...
Hangfire.NET:.NET任务调度
引言:为何选择 Hangfire? 在开发.NET 应用程序时,我们常常会遇到这样的场景:应用程序需要定期发送报告,像财务报表,每日业务数据汇总报告等,这些报告需要定时生成并发送给相关人员;…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
