西电杨丽英、王晓丽人工智能导论大作业

2024-01-01 08:20

本文主要是介绍西电杨丽英、王晓丽人工智能导论大作业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求:遗传算法解决TSP问题。

文件:N个城市的距离矩阵(下三角矩阵)

注意:老师可能会给其他N个城市的下三角距离矩阵,修改一下city_num和文件名即可。

import pandas as pd
import numpy as np#初始化种群
def Ini_pop(city_num, pop_num, pop, distance, matrix_distance):rand_ch = np.array(range(city_num))for i in range(pop_num):np.random.shuffle(rand_ch)pop[i, :] = rand_chdistance[i] = count_dis(city_num, matrix_distance, rand_ch)# 这里的适应度是距离#计算本次路径所有城市间的距离
def count_dis(city_num, matrix_distance, one_path):res = 0for i in range(city_num - 1):res += matrix_distance[one_path[i], one_path[i + 1]]res += matrix_distance[one_path[-1], one_path[0]]  # 最后一个城市和第一个城市的距离,需单独处理return res# 打印出当前路径
def print_path(city_num, one_path):res = str(one_path[0] + 1) + '-->'for i in range(1, city_num):res += str(one_path[i] + 1) + '-->'res += str(one_path[0] + 1)print("最佳路径为:")print(res)# 轮盘赌的方式选择子代
def select_lunpan(pop_num, pop, distance):fit = 1. / distance  # 适应度函数p = fit / sum(fit)q = p.cumsum()  # 累积概率select_id = []for i in range(pop_num):r = np.random.rand()  # 产生一个[0,1)的随机数for j in range(pop_num):if r < q[0]:select_id.append(0)breakelif q[j] < r <= q[j + 1]:select_id.append(j + 1)breaknext_gen = pop[select_id, :]return next_gen# 交叉操作-每个个体对的某一位置进行交叉
def cross_tran(city_num, pop_num, next_gen, cross_prob, evbest_path):for i in range(0, pop_num):best_gen = evbest_path.copy()if cross_prob >= np.random.rand():next_gen[i, :], best_gen = intercross(city_num, next_gen[i, :], best_gen)# 部分映射交叉
def intercross(city_num, inta, intb):r1 = np.random.randint(city_num)r2 = np.random.randint(city_num)while r2 == r1:r2 = np.random.randint(city_num)left, right = min(r1, r2), max(r1, r2)ind_a1 = inta.copy()ind_b1 = intb.copy()for i in range(left, right + 1):ind_a2 = inta.copy()ind_b2 = intb.copy()inta[i] = ind_b1[i]intb[i] = ind_a1[i]# 每个个体包含的城市序号是唯一的,因此交叉时若两个不相同,就会产生冲突x = np.argwhere(inta == inta[i])y = np.argwhere(intb == intb[i])# 产生冲突,将不是交叉区间的数据换成换出去的原数值,保证城市序号唯一if len(x) == 2:inta[x[x != i]] = ind_a2[i]if len(y) == 2:intb[y[y != i]] = ind_b2[i]return inta, intb# 变异方式:翻转变异
def mutation_sub(city_num, pop_num, next_gen, mut_prob):for i in range(pop_num):if mut_prob >= np.random.rand():r1 = np.random.randint(city_num)r2 = np.random.randint(city_num)while r2 == r1:r2 = np.random.randint(city_num)if r1 > r2:temp = r1r1 = r2r2 = tempnext_gen[i, r1:r2] = next_gen[i, r1:r2][::-1]#从最后元素到第一元素复制def main():city_num = 21read = pd.read_table('21.txt', header=None, sep='\s+')#read = pd.read_csv("rebuild.txt", sep=" ", header=None)res = np.zeros((21, 21))# 求两点距离矩阵row_index = 0col_index = 0read = read.valuesfor i in range(read.shape[0]):for j in range(read.shape[1]):if row_index == city_num:breakres[row_index][col_index] = read[i][j]res[col_index][row_index] = read[i][j]if res[row_index][col_index] == 0:row_index += 1col_index = 0else:col_index += 1matrix_distance = res#print(matrix_distance)city_num = 21  # 城市数量population_num = 100  # 群体个数cross_prob = 1  # 交叉概率mut_prob = 0.2  # 变异概率iteration = 600  # 迭代代数# 初始化初代种群和距离,个体为整数,距离为浮点数pop = np.array([0] * population_num * city_num).reshape(population_num, city_num)distance = np.zeros(population_num)# 初始化种群Ini_pop(city_num, population_num, pop, distance, matrix_distance)# draw_path(city_num, city_location, pop[0], distance)  # 绘制初代图像evbest_path = pop[0]evbest_distance = float("inf")best_path_list = []best_distance_list = []# 循环迭代遗传过程for i in range(iteration):# 选择next_gen = select_lunpan(population_num, pop, distance)# 交叉cross_tran(city_num, population_num, next_gen, cross_prob, evbest_path)# 变异mutation_sub(city_num, population_num, next_gen, mut_prob)# 更新每个个体距离值(1/适应度)for j in range(population_num):distance[j] = count_dis(city_num, matrix_distance, next_gen[j, :])index = distance.argmin()  # index 记录最小总路程# 为了防止曲线波动,每次记录最优值,如迭代后出现退化,则将当前最好的个体回退替换为历史最佳if distance[index] <= evbest_distance:evbest_distance = distance[index]evbest_path = next_gen[index, :]else:distance[index] = evbest_distancenext_gen[index, :] = evbest_path# 存储每一步的最优路径(个体)及距离best_path_list.append(evbest_path)best_distance_list.append(evbest_distance)best_distance = evbest_distancebest_path = evbest_pathprint_path(city_num, best_path)print(best_distance)if __name__ == '__main__':main()

注意:由于遗传算法有概率因素影响,不像暴力求解每次都是最优解,遗传算法TSP问题可能跑多次才可能跑出最优解(21个城市我跑了十几次才跑出最优解),因此,大家多跑几次跑出最优解就可以。

 

这篇关于西电杨丽英、王晓丽人工智能导论大作业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558648

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

从希腊神话到好莱坞大片,人工智能的七大历史时期值得铭记

本文选自historyextra,机器之心编译出品,参与成员:Angulia、小樱、柒柒、孟婷 你可能听过「技术奇点」,即本世纪某个阶段将出现超级智能,那时,技术将会以人类难以想象的速度飞速发展。同样,黑洞也是一个奇点,在其上任何物理定律都不适用;因此,技术奇点也是超越未来理解范围的一点。 然而,在我们到达那个奇点之前(假设我们能到达),还存在另一个极大的不连续问题,我将它称之

[Day 73] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在健康管理中的應用實例 1. 引言 隨著健康管理需求的提升,人工智能(AI)在該領域的應用越來越普遍。AI可以幫助醫療機構提升效率、精準診斷疾病、個性化治療方案,以及進行健康數據分析,從而改善病患的健康狀況。這篇文章將探討AI如何應用於健康管理,並通過具體代碼示例說明其技術實現。 2. AI在健康管理中的主要應用場景 個性化健康建議:通過分析用戶的健康數據,如飲食、運動、睡眠等,AI可

知名AIGC人工智能专家培训讲师唐兴通谈AI大模型数字化转型数字新媒体营销与数字化销售

在过去的二十年里,中国企业在数字营销领域经历了一场惊心动魄的变革。从最初的懵懂无知到如今的游刃有余,这一路走来,既有模仿学习的艰辛,也有创新突破的喜悦。然而,站在人工智能时代的门槛上,我们不禁要问:下一个十年,中国企业将如何在数字营销的浪潮中乘风破浪? 一、从跟风到精通:中国数字营销的进化史 回顾过去,中国企业在数字营销领域的发展可谓是一部"跟风学习"的编年史。从最初的搜索引擎营销(SEM),

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

通学人工智能一

AI 工具 1. 语言与内容创作工具 Heygen: 全球语言转换,创建逼真的数字人。系统主要是英文的,但可以通过微软小冰实现中文支持。 Predis.ai: 制作图文内容以及简单的视频。 通义听悟 & 讯飞语记: 帮助收集灵感并将其整理成文案。 2. 设计与图片生成 Pic Copilot: 自动生成电商网站。 Codia AI: 擅长将截图 1:1 复制成原图,并生成相关代码。 In

人工智能时代开启ai代写模式,让创作变得更加简单!

随着人工智能技术的飞速发展,我们的生活和工作方式正在发生翻天覆地的变化。在这个信息爆炸的时代,内容创作领域也迎来了新的变革——ai代写。这一模式的出现,让文章写作变得更加简单高效,为创作者们打开了新的可能。   一、ai代写的优势   提高写作效率   在传统写作过程中,创作者需要花费大量时间和精力进行资料搜集、构思和撰写。而ai代写能够在短时间内完成这些工作,大大提高了写作效率。创

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP