人工智能原理实验四:智能算法与机器学习

一、实验目的

本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握人工智能相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对智能程序、智能算法等有比较深入的认识。要掌握的知识点如下:

  1. 掌握人工智能中涉及的相关概念、算法;
  2. 熟悉人工智能中的知识表示方法;
  3. 掌握问题表示、求解及编程实现;
  4. 熟悉和掌握遗传算法、蚁群算法、决策树、贝叶斯等的基本概念和基本思想;
  5. 能够用选定的编程语言设计简单的算法系统;
  6. 通过实验培养学生利用智能算法和机器学习算法进行问题求解的基本技能。

二、基本要求

1、实验前,复习《人工智能》课程中的有关内容。

2、准备好实验数据。

3、程序可以组队完成(实验报告上要标明自己完成部分,切勿提交一样的报告),程序应加适当的注释。

4、完成实验报告,由小组完成报告要有明显区别,分析和总结应该按照自己完成的部分进行。

三、实验软件

推荐使用C或C++(Visual studio等平台)(不限制语言使用,如Java,matlab,Python等都可以)。

四、实验内容:

1.以N个节点的TSP(旅行商问题)问题为例,应用遗传算法进行求解,求出问题的最优解。

问题描述

    旅行商问题(Traveling Salesman Problem, TSP),又译为旅行推销员问题、货担郎问题,简称为TSP问题,是最基本的路线问题。假设有n个可直达的城市,一销售商从其中的某一城市出发,不重复地走完其余n-1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。

    TSP问题是组合数学中一个古老而又困难的问题,也是一个典型的组合优化问题,现已归入NP完备问题类。NP问题用穷举法不能在有效时间内求解,所以只能使用启发式搜索。遗传算法是求解此类问题比较实用、有效的方法之一。

下面给出30个城市的位置信息:

最优路径为:1 2 3 4 6 5 7 8 9 10 11 12 13 14 15 16 17 19 18 20 21 22 23 24 25 28 26 27 29 30

其路径长度为:424.869292

也可取前10个城市的坐标进行测试:

有人求得的最优路径为: 0 3 5 4 9 8 7 6 2 1 0

路径长度是166.541336

上述10个城市的求解中编号从0开始,把所有路径搜索完又返回到出发节点。

1.应用遗传算法求解30/10个节点的TSP(旅行商问题)问题,求问题的最优解。

2.使用蚁群优化算法或者粒群优化算法求解以上TSP问题。

3.利用贝叶斯算法和决策树算法进行数据分类操作

数据集:汽车评估数据集(见附录)

实验步骤:

仔细阅读并了解实验数据集;

使用任何一种熟悉的计算机语言(比如C,Java或者matlab)实现朴素贝叶斯算法和决策树算法;

利用朴素贝叶斯算法和决策树算法在训练数据的基础上学习分类器;

利用测试数据对学习的分类器进行性能评估;

统计分析实验结果并上交实验报告;

五、学生实验报告要求

实验报告需要包含以下几个部分

(1)求出问题最优解,若得不出最优解,请分析原因;

1.应用遗传算法求解30个节点的TSP(旅行商问题)问题,求问题的最优解。

2.使用蚁群优化算法或者粒群优化算法求解以上TSP问题。

(2)对实验中的几个算法控制参数进行仔细定义,并能通过实验选择参数的最佳值;

# 遗传算法参数
population_size = 50
num_generations = 1000
crossover_rate = 0.8
mutation_rate = 0.02
# 蚁群算法参数设置
num_ants = 10  # 蚂蚁数量,即蚁群规模
pheromone_decay = 0.5  # 信息素挥发系数,控制信息素的挥发速度,取值范围一般在(0, 1)之间
alpha = 1.0  # 信息素的重要程度参数,用于控制蚂蚁选择下一步路径时信息素的影响力
beta = 2.0  # 启发函数(即路径长度)的重要程度参数,用于控制蚂蚁选择下一步路径时路径长度的影响力
Q = 100.0  # 信息素增加强度,表示每次蚂蚁经过一条路径后释放的信息素量
num_iterations = 100  # 蚁群算法迭代次数,即蚂蚁搜索的总轮数

(3)要求界面显示每次迭代求出的局部最优解和最终求出的全局最优解。

1.应用遗传算法求解30个节点的TSP(旅行商问题)问题,求问题的最优解。

2.使用蚁群优化算法或者粒群优化算法求解以上TSP问题。

第一次运行结果:最终最佳路径: [11, 5, 6, 10, 9, 7, 8, 3, 2, 4, 30, 29, 28, 26, 27, 25, 24, 23, 22, 21, 17, 20, 18, 19, 14, 15, 13, 12, 16, 1], 距离: 524.0661832365629

第二次运行结果:最终最佳路径: [24, 23, 22, 21, 17, 20, 18, 19, 14, 15, 13, 12, 11, 5, 6, 10, 9, 7, 8, 3, 2, 4, 30, 29, 28, 26, 27, 25, 16, 1], 距离: 529.3772998688348

(4)测试种群规模对算法结果的影响。(运算速度,内存空间,准确率等)

(5)测试算法中重要参数(如遗传算法中的交叉概率、变异概率)对算法结果的影响(运算速度,内存空间,准确率等),以表格或者曲线图等形式表达。

较大的种群规模可能会增加算法的运行时间和内存开销,但通常能够更好地探索搜索空间。

五、实验结果讨论。

从实验结果来看,不同的种群规模对算法的性能和结果产生了影响。以下是对实验结果的一些讨论:

1.性能比较:随着种群规模的增加,算法的性能有所提高。这是因为较大的种群规模有助于更好地探索搜索空间,提高全局搜索的能力。然而,这也伴随着更多的计算开销。

2.最佳解决方案:在这个实验中,种群规模为50和100的情况下,最终的最佳解决方案是相同的。这可能是由于算法在较小规模下已经找到了局部最优解,增加种群规模没有进一步改善结果。

3.运行时间:随着种群规模的增加,运行时间也相应增加。较大的种群规模需要更多的计算资源,因此运行时间较长。在实际应用中,需要权衡运行时间和结果质量。

4. 结果稳定性:实验中显示,不同的种群规模下最终的最佳解决方案并不总是一致的。这表明在某些情况下,增加种群规模并不能保证一定能够找到更好的解决方案。这也反映了遗传算法在某些问题上可能受到初始条件和随机性的影响。

3.

朴素贝叶斯算法结果分析

准确率: 约为 68.5%。该指标表示模型正确分类的样本所占比例。在这个场景下,准确率较低,可能是因为朴素贝叶斯算法对于这个数据集的特征分布假设过于简单,或者数据集中的特征与类别的关系不符合朴素贝叶斯的假设。

精确率: 对于类别 0 和类别 2,精确率分别为 1.00 和 0.68。精确率表示在模型预测为某一类别时,实际为该类别的概率。在这里,类别 0 的精确率较高,说明模型在预测类别 0时的准确性较高。

召回率: 对于类别0、1和类别2,召回率分别为0.02、0.00和1.00。召回率表示实际为某一类别的样本中,模型成功预测为该类别的概率。在这里,类别2的召回率较高,说明模型成功捕捉了该类别的样本。

F1-score: 类别 2 的 F1-score 较高,表示在精确率和召回率之间取得了一种平衡。

决策树算法结果分析

准确率: 约为 96.8%。相对于朴素贝叶斯,决策树在这个数据集上表现得更好,准确率较高。精确率: 对于所有类别,精确率均较高。说明决策树模型在预测各个类别时的准确性都很高。召回率: 对于所有类别,召回率均较高。说明决策树模型能够成功捕捉各个类别的样本。

F1-score: 各个类别的 F1-score 均较高,表明模型在精确率和召回率之间取得了良好的平衡。

总体而言,决策树模型在这个数据集上的性能明显优于朴素贝叶斯模型。朴素贝叶斯在这里可能过于简化了特征之间的关系,而决策树能够更好地适应数据集的复杂性。

六、程序清单

1.

import numpy as np
import time# 定义城市坐标
cities = {1: (87, 7), 2: (91, 38), 3: (83, 46), 4: (71, 44), 5: (64, 60),6: (68, 58), 7: (83, 69), 8: (87, 76), 9: (74, 78), 10: (71, 71),11: (58, 69), 12: (54, 62), 13: (51, 67), 14: (37, 84), 15: (41, 94),16: (2, 99), 17: (7, 64), 18: (22, 60), 19: (25, 62), 20: (18, 54),21: (4, 50), 22: (13, 40), 23: (18, 40), 24: (24, 42), 25: (25, 38),26: (41, 26), 27: (45, 21), 28: (44, 35), 29: (58, 35), 30: (62, 32)
}# 城市数量
num_cities = len(cities)# 遗传算法参数
# 不同的种群规模
population_sizes = [20, 50, 100, 200]
num_generations = 1000
crossover_rate = 0.8
mutation_rate = 0.02# 计算两个城市之间的距离
def calculate_distance(city1, city2):return np.sqrt((city1[0] - city2[0])**2 + (city1[1] - city2[1])**2)# 计算整个路径的总距离
def calculate_total_distance(tour):total_distance = 0for i in range(num_cities - 1):total_distance += calculate_distance(cities[tour[i]], cities[tour[i + 1]])total_distance += calculate_distance(cities[tour[-1]], cities[tour[0]])  # 返回起始城市return total_distancefor population_size in population_sizes:print(f"\n测试种群规模 {population_size}\n{'='*20}")# 初始化种群population = [np.random.permutation(num_cities) + 1 for _ in range(population_size)]  # 注意城市编号从1开始start_time = time.time()# 遗传算法主循环for generation in range(num_generations):# 计算种群中每个个体的适应度fitness = [1 / calculate_total_distance(individual) for individual in population]# 使用轮盘赌选择交叉的父母selected_indices = np.random.choice(range(population_size), size=population_size, p=fitness/np.sum(fitness))# 进行交叉操作生成新一代new_population = []for i in range(0, population_size, 2):parent1 = population[selected_indices[i]]parent2 = population[selected_indices[i + 1]]crossover_point = np.random.randint(1, num_cities - 1)child1 = np.concatenate((parent1[:crossover_point], np.setdiff1d(parent2, parent1[:crossover_point])))child2 = np.concatenate((parent2[:crossover_point], np.setdiff1d(parent1, parent2[:crossover_point])))new_population.extend([child1, child2])# 进行变异操作for i in range(population_size):if np.random.rand() < mutation_rate:mutation_indices = np.random.choice(num_cities, size=2, replace=False)new_population[i][mutation_indices[0]], new_population[i][mutation_indices[1]] = (new_population[i][mutation_indices[1]], new_population[i][mutation_indices[0]])# 用新一代替换旧一代population = new_population# 显示每一代中的最佳解决方案best_solution_index = np.argmax(fitness)best_solution = population[best_solution_index]best_distance = calculate_total_distance(best_solution)# print(f"第 {generation + 1}/{num_generations} 代, 最短路径: {best_solution}, 距离: {best_distance}")end_time = time.time()# 显示最终的最佳解决方案final_best_solution_index = np.argmax(fitness)final_best_solution = population[final_best_solution_index]final_best_distance = calculate_total_distance(final_best_solution)print(f"最终最佳解决方案: {final_best_solution}, 距离: {final_best_distance}")print(f"运行时间: {end_time - start_time:.2f}秒\n")

2.

import numpy as np# 定义城市坐标
cities = {1: (87, 7), 2: (91, 38), 3: (83, 46), 4: (71, 44), 5: (64, 60),6: (68, 58), 7: (83, 69), 8: (87, 76), 9: (74, 78), 10: (71, 71),11: (58, 69), 12: (54, 62), 13: (51, 67), 14: (37, 84), 15: (41, 94),16: (2, 99), 17: (7, 64), 18: (22, 60), 19: (25, 62), 20: (18, 54),21: (4, 50), 22: (13, 40), 23: (18, 40), 24: (24, 42), 25: (25, 38),26: (41, 26), 27: (45, 21), 28: (44, 35), 29: (58, 35), 30: (62, 32)
}
# 城市数量
num_cities = len(cities)
# 蚁群算法参数设置
num_ants = 10  # 蚂蚁数量,即蚁群规模
pheromone_decay = 0.5  # 信息素挥发系数,控制信息素的挥发速度,取值范围一般在(0, 1)之间
alpha = 1.0  # 信息素的重要程度参数,用于控制蚂蚁选择下一步路径时信息素的影响力
beta = 2.0  # 启发函数(即路径长度)的重要程度参数,用于控制蚂蚁选择下一步路径时路径长度的影响力
Q = 100.0  # 信息素增加强度,表示每次蚂蚁经过一条路径后释放的信息素量
num_iterations = 100  # 蚁群算法迭代次数,即蚂蚁搜索的总轮数# 初始化信息素矩阵
pheromone_matrix = np.ones((num_cities, num_cities))
# 计算城市间距离矩阵
distance_matrix = np.zeros((num_cities, num_cities))
for i in range(1, num_cities + 1):for j in range(1, num_cities + 1):distance_matrix[i - 1, j - 1] = np.sqrt((cities[i][0] - cities[j][0])**2 + (cities[i][1] - cities[j][1])**2)
# 主循环
for iteration in range(num_iterations):ant_tours = []# 每只蚂蚁构建路径for ant in range(num_ants):visited_cities = []current_city = np.random.randint(1, num_cities + 1)visited_cities.append(current_city)# 构建路径while len(visited_cities) < num_cities:# 计算选择下一个城市的概率probabilities = []for city in range(1, num_cities + 1):if city not in visited_cities:pheromone = pheromone_matrix[current_city - 1, city - 1]distance = distance_matrix[current_city - 1, city - 1]probability = (pheromone**alpha) * ((1.0 / distance)**beta)probabilities.append((city, probability))# 选择下一个城市selected_city = max(probabilities, key=lambda x: x[1])[0]visited_cities.append(selected_city)current_city = selected_cityant_tours.append(visited_cities)# 更新信息素pheromone_matrix *= pheromone_decayfor tour in ant_tours:for i in range(num_cities - 1):pheromone_matrix[tour[i] - 1, tour[i + 1] - 1] += Q / distance_matrix[tour[i] - 1, tour[i + 1] - 1]# 考虑最后一个城市到第一个城市的信息素更新pheromone_matrix[tour[-1] - 1, tour[0] - 1] += Q / distance_matrix[tour[-1] - 1, tour[0] - 1]# 打印最终的路径
best_tour = max(ant_tours, key=lambda x: sum(distance_matrix[x[i] - 1, x[i + 1] - 1] for i in range(num_cities - 1)))
best_distance = sum(distance_matrix[best_tour[i] - 1, best_tour[i + 1] - 1] for i in range(num_cities - 1))
print(f"最终最佳路径: {best_tour}, 距离: {best_distance}")

3.

mport pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import LabelEncoder# 1. 读取数据集
data = pd.read_csv('CarDatas.txt', header=None, delimiter=' ')
# 给数据集添加列名
data.columns = ['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety', 'class']# 2. 将文本数据转换为数值型数据
label_encoder = LabelEncoder()
data_encoded = data.apply(label_encoder.fit_transform)# 3. 划分训练集和测试集
X = data_encoded.drop('class', axis=1)
y = data_encoded['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 4. 朴素贝叶斯算法
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train, y_train)
nb_predictions = nb_classifier.predict(X_test)# 5. 决策树算法
dt_classifier = DecisionTreeClassifier()
dt_classifier.fit(X_train, y_train)
dt_predictions = dt_classifier.predict(X_test)# 6. 性能评估
print("朴素贝叶斯性能评估:")
print("准确率:", accuracy_score(y_test, nb_predictions))
print("分类报告:\n", classification_report(y_test, nb_predictions))print("\n决策树性能评估:")
print("准确率:", accuracy_score(y_test, dt_predictions))
print("分类报告:\n", classification_report(y_test, dt_predictions))

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

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

相关文章

免费生成AI PPT产品推荐?

要完全免费几乎是没有的&#xff0c;要知道AI还是非常烧钱的。 不过免费蹭还是有很多方法的&#xff0c;这里收集了一些&#xff1a; 下面分享我自己免费蹭过的几款AI制作PPT的工具。 1 金山-WPS PPT对我们来说并不陌生&#xff0c;而微软的PowerPoint与金山的WPS也是我们最常…

WPF 消息循环(二)

们已经知道&#xff0c;win32/MFC/WinForm/WPF 都依靠消息循环驱动&#xff0c;让程序跑起来。 这里就介绍 WPF 中是如何使用消息循环来驱动程序的。 1. 背景 只听说过 Dispatcher &#xff0c;哪里来的消息循环&#xff1f; WPF 启动运行堆栈&#xff1a; > WpfApp1.…

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…

JS中的Promise用法大全

目录 一、相关概念介绍1.什么是Promise2.Promise状态3.创建Promise4.then()方法5.catch方法6.链式调用7.异步编程 二、使用1.构造Promise2.executor 函数3.then() 方法4.then() 方法返回的Promise的状态 三、Async/Await语法糖四、Promise应用场景五、总结 一、相关概念介绍 1…

【新界面】基于卷积神经网络的垃圾分类(Matlab)

基于CNN的垃圾识别与分类GUI【新界面】 有需要可直接联系我&#xff0c;基本都在在线&#xff0c;能秒回&#xff01;可加我看演示视频&#xff0c;不懂可以远程教学 1.此项目设计包括两份完整的源代码&#xff0c;有GUI界面的代码和无GUI界面系统的代码。 &#xff08;以下部…

pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要结构&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 这里不支持批处理 Python version…

bugku-simple MQTT-wp解析

1.下载题目打开题目&#xff0c;是一个流量包&#xff0c;题目说是MQTT&#xff0c;然后打开流量之后的流量都是MQTT&#xff0c;我们来搜一下MQTT是什么流量 MQTT流量&#xff1a; 是一种基于发布订阅模式的轻量级的通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&…

HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装

TCP/IP协议栈的封装过程 用户从应用层发出数据先会交给传输层&#xff0c;传输层会添加TCP或者UDP头部&#xff0c;然后交给网络层&#xff0c;网络层会添加IP头部&#xff0c;然后交给数据链路层&#xff0c;数据链路层会添加以太网头部和以太网尾部&#xff0c;最后变成01这样…

Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令

注&#xff1a;本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”&#xff0c;因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址&#xff0c;有效解决地址不足困境。 IPv6 具…

关卡选择与布局器

unity布局管理器 使用unity布局管理器轻松对关卡选择进行布局。 实现过程 准备普通按钮button设置字体和对应的sprite设置父gameobject&#xff08;levelbase&#xff09; 再创建UI.image&#xff08;selectbackground&#xff09;布局背景和大小gameobject&#xff08;grid…

python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入

【1】引言 前序学习过程中&#xff0c;我们偶然发现&#xff1a;如果原始图像是png格式&#xff0c;将其从BGR转向HSV&#xff0c;再从HSV转回BGR后&#xff0c;图像的效果要好于JPG格式。 文章链接为&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图…

程序算术题-2

程序算术题-2 输出所有组合逻辑实例代码 输出所有排列逻辑实例代码 输出所有组合 计算一组数字按n位数组合的所有组合。 逻辑 /*** param stringBuilder 用于组合的拼接* param list 组合数序列* param level 目前位数* param exceptedLevel 组合期待位数*/…

VQ-VAE和VAE 的区别是什么?

第一行所展示的就是普通的VAE,它的核心是通过encoder和decoder&#xff0c;将像素空间的图像压缩到一个提取了核心特征的隐变量向量。VQ-VAE的思想是&#xff0c;即使VAE中压缩的这个隐变量中的向量提取了图片中的核心特征信息&#xff0c;但是这些信息仍然可能存在冗余&#x…

使用Qt Creator设计可视化窗体(一)

一、创建项目 打开 Qt Creator &#xff0c;在菜单栏中选中&#xff1a; “文件” --------> “新建文件或项目” &#xff1b;或者使用快捷键&#xff1a;Ctrl n&#xff1b;或者直接点击&#xff1a;“new” Qt 中的构建工具有三种可供选择&#xff0c;分别是&#…

Python3 爬虫 Scrapy 与 Redis

Scrapy是一个分布式爬虫的框架&#xff0c;如果把它像普通的爬虫一样单机运行&#xff0c;它的优势将不会被体现出来。因此&#xff0c;要让Scrapy往分布式爬虫方向发展&#xff0c;就需要学习Scrapy与Redis的结合使用。Redis在Scrapy的爬虫中作为一个队列存在。 一、Scrapy_r…

Docker 学习

Docker 学习 Docker 概念 Docker 安装 一般是在服务器里 Docker阿里云镜像加速 配置主要是Linux命令 Docker命令大纲及帮助文档的使用 docker帮助文档 查看docker命令 docker --help查看某个命令&#xff0c;例如ps的详细文档 docker ps --help也可查阅 [docker官方帮助手…

超牛免费 机械臂模型、工业机器人模型下载网站集合

‌机械臂是一种高精度、多输入多输出的复杂系统&#xff0c;能够模仿人手的动作&#xff0c;按照给定程序、轨迹和要求实现自动抓取、搬运等功能‌。它通常由执行机构、驱动装置、控制系统以及传感器等组成&#xff0c;能够完成各种复杂的动作。‌ 机械臂在工业、医学、娱乐、…

【Python技术】同花顺wencai涨停分析基础上增加连板分析

周末&#xff0c;有读者加我&#xff0c; 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。 先看效果 这里附上完整代码&#xff1a; import streamlit as st import pywencai import pandas as pd from datetime import datetime, timedelta import plotly.graph_o…

小程序子组件调用父组件方法、父组件调用子组件方法

1、子组件调用父组件方法 子组件this.triggerEvent(finish); startShare(e) {let url config.apiUrl "/business/lzShare/edit";let data this.data.currentData;util.httpPut(url, data).then((res) > {this.triggerEvent(finish);console.log(res.result);})…

怎样使用Eclipse创建Maven的Java WEB 项目

文章目录 1、第一种方式&#xff08;选择 archetype 方式&#xff09; 1.1、第一步&#xff1a;创建项目1.2、第二步&#xff1a;配置jre1.3、第三步&#xff1a;配置tomcat1.4、第四步&#xff1a;设置为WEB3.11.5、第五步&#xff1a;配置Maven的编译级别 1.5.1、第一种方法…