本学期源代码下载链接

实验一项目:图搜索技术
一、实验目的
1.加深学生对图搜索技术的理解。
2.掌握图搜索基本编程方法。
3.能初步运用图搜索技术解决一些实际应用问题。

二、预习要求
1.复习广度优先搜索算法。
2.复习深度优先搜索算法。
3.设计初步的搜索算法。
三、实验内容
修道士和野人问题如下:
有三个传教士和三个野人一起来到河边准备渡河,河边有一条空船,且传教士和野人都会划船,但每次最多可供两人乘渡。河的任何一岸以及船上一旦出现野人人数超过传教士人数,野人就会把传教士吃掉。为完全地渡河,传教士应如何规划渡河方案?

四、实验要求
能够搜索出最好的解题路径,把传教士和野人一起运送到河对岸

五、实验步骤及实验结果
#问题说明

#对问题进行细致思考, 可以发现 (yr,cjs,chuan) 就可以描述问题的整个状态

#其中 yr 代表野人在起点 数量, cjs 代表传教士 在起点的数量 ,船的位置, -1 船在起点
#所以 问题的 初始状态描述为 (3,3,-1)

问题的终点 描述为 (0,0,1)

#最终为了对 问题进行回溯
#每次的算符有 (1,0) (0,1) (1,1) (2,0) (0,2)
#5中基本算符 与 船的位置相结合 产生 10中算符

#搜索 过程列表用来保存搜索过的 结果 statue_list=[[yr,cjs,chuan,self_id,father_id] ]
#其中self_id 可以省略, 它 对应于数组下标

#概念 队列 不需要存储
#待搜索状态队列,先进先出, 每次将当前节点pop[0], 将当前节点的衍生节点 append,如果衍生过的节点已经被搜索过,则忽略不计,

当整个队列为空时,说明搜索过程结束

#概念队列可以采用两个下标 来进行实现,一个是数组当前的长度, 一个是 指向 弹出的 游标, 从0开始,向后 作为拓展节点

class yerenquestion:def __init__(self,yeren,chuanjiaoshi):self.chuan=-1self.self_id=0father_id=-1#下一步会被拓展的 状态下标self.tuozhan_point=0self.statue=[yeren,chuanjiaoshi,self.chuan,self.self_id,father_id]#算符self.suanfu=[[1,0],[0,1],[2,0],[0,2],[1,1]]#操作描述self.miaoshu_caozuo=['1个野人','1个传教士','2个野人','2个传教士','1个野人1个传教士',]self.miaoshu_list=[]self.sousuo_list=[]self.sousuo_list.append(self.statue)self.tuozhan()self.caozuo_index=0def tuozhan(self):if self.tuozhan_point>self.self_id:print("搜索结束")print(self.sousuo_list)exit(10)if self.tuozhan_point<=self.self_id:#从当前状态 拓展 节点self.product_statue()self.tuozhan_point+=1self.tuozhan()#根据当前搜索节点产生新的 节点def product_statue(self):#当前状态now_=self.sousuo_list[self.tuozhan_point]print('\n\n\n')print('当前状态',now_)self.chuan=now_[2]#可以产生的状态self.caozuo_index=0for item in self.suanfu:print("当前执行的算符",item)father_de_id=self.tuozhan_pointnew_statue=[now_[0]+self.chuan*item[0],now_[1]+self.chuan*item[1],-1*self.chuan,self.self_id,father_de_id]print("产生的新状态",new_statue)if  self.check_statue(new_statue)==True:self.sousuo_list.append(new_statue)self.self_id+=1self.miaoshu_list.append(self.miaoshu_caozuo[self.caozuo_index])self.caozuo_index+=1def check_statue(self,new_statue):#检查1 检查当前节点是否安全 野人在两岸的数量不能比传教士多, 除非传教士 为空# 起点不安全,传教士不为 0 ,野人比传教士多if new_statue[1]!=0 and new_statue[0]>new_statue[1]:return False#船对岸不安全if (3-new_statue[1])!=0 and (3-new_statue[0])>(3-new_statue[1]):return False#两岸人数不能为 负if new_statue[0]>3 or new_statue[0]<0 or new_statue[1]<0 or new_statue[1]>3:return False#保证节点未拓展过 flag=0 代表未拓展过# flag=0for item in self.sousuo_list:if new_statue[:3] == item[:3]:return Falseif new_statue[:3]==[0,0,1]:print("搜索成功")self.sousuo_list.append(new_statue)self.miaoshu_list.append(self.miaoshu_caozuo[self.caozuo_index])self.self_id+=1print(self.sousuo_list)self.show_process(self.self_id)exit(9)return True#展示搜索过程def show_process(self,self_id_):if self_id_==-1:print("开始运输")print("")if self_id_!=-1:self.show_process(self.sousuo_list[self_id_][4])if self_id_!=0:fangxiang = "运过去 "if self.sousuo_list[self_id_][2]==-1:fangxiang="运过来  "print(fangxiang,self.miaoshu_list[self_id_-1])print(self.sousuo_list[self_id_])
#求解
yerenquestion(3,3)
[3, 3, -1, 0, -1]
运过去  2个野人
[1, 3, 1, 1, 0]
运过来   1个野人
[2, 3, -1, 3, 2]
运过去  2个野人
[0, 3, 1, 4, 4]
运过来   1个野人
[1, 3, -1, 5, 5]
运过去  2个传教士
[1, 1, 1, 6, 6]
运过来   1个野人1个传教士
[2, 2, -1, 7, 7]
运过去  2个传教士
[2, 0, 1, 8, 8]
运过来   1个野人
[3, 0, -1, 9, 9]
运过去  2个野人
[1, 0, 1, 10, 10]
运过来   1个野人
[2, 0, -1, 11, 11]
运过去  2个野人
[0, 0, 1, 13, 12]

六、心得体会
问题说明

对问题进行细致思考, 可以发现 (yr,cjs,chuan) 就可以描述问题的整个状态

其中 yr 代表野人在起点 数量, cjs 代表传教士 在起点的数量 ,船的位置, -1 船在起点
所以 问题的 初始状态描述为 (3,3,-1)
问题的终点 描述为 (0,0,1)
最终为了对 问题进行回溯
每次的算符有 (1,0) (0,1) (1,1) (2,0) (0,2)
5中基本算符 与 船的位置相结合 产生 10中算符

搜索 过程列表用来保存搜索过的 结果 statue_list=[[yr,cjs,chuan,self_id,father_id] ]
其中self_id 可以省略, 它 对应于数组下标

概念 队列 不需要存储
待搜索状态队列,先进先出, 每次将当前节点pop[0], 将当前节点的衍生节点 append,如果衍生过的节点已经被搜索过,则忽略不计,
当整个队列为空时,说明搜索过程结束

概念队列可以采用两个下标 来进行实现,一个是数组当前的长度, 一个是 指向 弹出的 游标, 从0开始,向后 作为拓展节点

实验二项目:A*算法
一、实验目的

  1. 熟悉和掌握启发式搜索的定义、估价函数和算法过程,理解求解流程和搜索顺序。
    2.使学生掌握A算法的编程方法,
    3.并能利用A
    算法求解N数码难题。

二、预习要求
A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的代价以及从节点n到达目标节点的代价。

三、实验内容
1、以8数码或15数码为例,用A算法编写一个求解数码问题的程序。
2、画出A
算法求解框图。

四、实验要求
根据情况可以选择实现基本功能或者附加功能
1、基本功能
可以演示问题的求解过程。

2、附加功能
可选择实现下述一种或几种功能:
(1)开始演示。进入N数码难题演示程序,可选8数码或者15数码,点击“选择数码”按钮确定。
(2)点击“缺省棋局”,会产生一个固定的初始节点。点击“随机生成”,会产生任意排列的初始节点。
(3)算法执行。点击“连续执行”则程序自动搜索求解,并演示每一步结果;点击“单步运行”则每次执行一步求解流程。“运行速度”可自由调节。
(4)观察运行过程和搜索顺序,理解启发式搜索的原理。在下拉框中选择演示“15数码难题”,点击“选择数码”确定选择;运行15数码难题演示实例。
(5)算法流程的任一时刻的相关状态,以算法流程高亮、open表、close表、节点静态图、当前扩展节点移动图等5种形式在按钮上方同步显示,便于深入学习理解A*算法。

五、实验步骤及实验结果

  
  


start.py

from shiyan_2.uiClass1 import  mainwindow1from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
def start_ui():app=QApplication(sys.argv)window1=mainwindow1()window1.show()app.exec()start_ui()

uiClass1.py

# # import shiyan_2.fifteennumbergame as fnumgame
# from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom shiyan_2.fifteennumbergame import Ui_MainWindow
class  mainwindow1(QMainWindow,Ui_MainWindow):def __init__(self):super(mainwindow1,self).__init__()self.setupUi(self)# class MainWindow5(QMainWindow, w5.Ui_MainWindow):
#     def __init__(self):
#         super(MainWindow5, self).__init__()
#         self.setupUi(self)

qiuejie_question.py


import  copy### 传入一个 value_list
## 形如  [6, 5, 3, 1, 4, 7, 8, 2, 0]##两个测试值
value_list9=[6, 5, 3, 1, 4, 7, 8, 2, 0]result_list9=[1,2,3,8,0,4,7,6,5]value_list16=[0, 14, 15, 1, 12, 3, 13, 11, 10, 8, 9, 2, 5, 7, 4, 6]
result_list16=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0]# result_list16=list(range(1,17))
# result_list16[-1]=0
# print(result_list16)## 交换规则, 根据当前 空白 也就是 0 在value_list 中的 位置可以确定 它 下一步会被交换的位置
next_pos_list9=[[1,3],[0,2,4],[1,5],[0,4,6],[1,3,5,7],[2,4,8],[3,7],[6,4,8],[5,7]]next_pos_list16=[[1,4],[0,2,5],[1,3,6],[2,7],[0,5,8],[1,4,6,9],[2,5,7,10],[3,6,11],[4,9,12],[5,8,10,13],[6,9,11,14],[7,10,15],[8,13],[9,12,14],[10,13,15],[11,14]]#### 用来 保存 搜索过的 状态, 当没有被搜索过 时 压入 这个 列表, 当某个状态,被搜索过,则忽略,
# 这个 状态 列表上 还应该 有一个指针, 指向, 当前搜索的 状态,
# 每一次 指针向后移, 并且压入 会被搜索的 新状态 ,
# 当 搜索 指针到达 队尾还没有 求解问题,代表 问题 在这种 解法下 暂时无解
now_search=0# searched_status[0]= 状态的 集合
#[0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价
searched_status=[[],[],[],[],[]]#用来记录 每个 被搜索状态的 父亲状态,
father_status=[]# 得到传入的当前状态
now_value_list=''## 搜索的总代价 等于  g(x) + h(x)result_list=[]
#h(x) , g(x)
info_list=[[],[]]def product_process(value_list):n=searched_status[0].index(value_list)while searched_status[1][n]!= -1:result_list.append(searched_status[0][n])info_list[0].append(searched_status[3][n])info_list[1].append(searched_status[4][n])n=searched_status[1][n]result_list.append(searched_status[0][n])info_list[0].append(searched_status[3][n])info_list[1].append(searched_status[4][n])#####
#  求解每一步的   g(x)
def get_offset(value_list):sum_offset=0len_=len(value_list)result_list=''if len_==9:result_list=result_list9if len_==16:result_list=result_list16for i in range(len(value_list)):if value_list[i]!=result_list[i]:sum_offset+=10if sum_offset!=0:#如果没有达到终点,就进行 搜索print(value_list)print('距离是{0}'.format(sum_offset))print(len(searched_status[0]))return sum_offset#### 根据求得的  h(x)
#### 根据搜索 过的路径  得到 g(x)
def sum_daijia():#初始代价为0gx=0pass# 添加searched_status=[]
# [0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价
def append_searched_list(value_list,father_index,is_searched,hwight,gwight):addlist=[value_list,father_index,is_searched,hwight,gwight]for i in range(len(searched_status)):searched_status[i].append(addlist[i])def expand_searched_list():while True:#如果 valuest 有返回值 说明 当前可以进行拓展, 否则会跑出一个异常valuest_index=get_valuest_index()now_value_list = searched_status[0][valuest_index]#得到 0在 节点中的 位置zero_index=get_zero_index(now_value_list)# 说明这个节点 被拓展过 了searched_status[2][valuest_index]=1#####len_=len(now_value_list)stop_step=0next_pos_list=''if len_ == 9:next_pos_list = next_pos_list9stop_step=40if len_ == 16:next_pos_list = next_pos_list16stop_step = 100#根据 下一步 可以 到达 的 状态 进行搜索for i in range(len(next_pos_list[zero_index])):new_list=copy.deepcopy(now_value_list)#交换 可以到达的节点 与 0 的位置new_list[zero_index],new_list[next_pos_list[zero_index][i]]=new_list[next_pos_list[zero_index][i]],new_list[zero_index]#如果这个状态 还没有出现过if new_list not in searched_status[0]:hwight = get_offset(new_list)gwight = searched_status[4][valuest_index]+1if gwight > stop_step:print('这个初始图没有解')return '这个初始图没有解',None,searched_statusraise Exception('这个初始图没有解')father_index =  valuest_indexappend_searched_list(new_list,father_index,0,hwight,gwight)if hwight == 0:print('游戏结束')a = get_valuest_index()print(searched_status[4][a])product_process(new_list)print(result_list)return  result_list,info_list,searched_statusraise Exception('游戏结束')# return now_value_list#expand_searched_list()#找到 最需要 被 搜索的 节点
def get_valuest_index():# 设定搜索的 代价 上限threshold_value = 1000000need_expand_index = -1for i in range(len(searched_status[0])):# [0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价#当前节点没有被搜索过if searched_status[2][i]==0:#当前节点搜索 代价比较小 ,当循环 一遍 之后 找到的就是 代价最小的 节点if (searched_status[3][i]+searched_status[4][i])<threshold_value:threshold_value=searched_status[3][i]+searched_status[4][i]need_expand_index=iif need_expand_index != -1:#说明有 尚未拓展的节点, 那么对他进行拓展print('当前最小代价',(searched_status[3][need_expand_index]+searched_status[4][need_expand_index]))return  need_expand_indexelse:print(searched_status[0])print(len(searched_status[0]))raise Exception('没有需要被拓展的节点了')def get_zero_index(value_list):zero_index=''for  i in range(len(value_list)):zero_index= (i if value_list[i]==0 else zero_index)if zero_index == '' :raise Exception('找不到零所在的位置')else :return zero_indexdef goto_next_statue():passdef get_random_list(n):import randomif type(n) == int:list1 = list(range(n))random.shuffle(list1)print(list1)return list1else:raise Exception('get_random_list 需要传入一个整数')def start_question(value_list):# [0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价global searched_statussearched_status = [[], [], [], [], []]# 用来记录 每个 被搜索状态的 父亲状态,global father_statusfather_status = []global result_listresult_list=[]# value_list=get_random_list(9)# value_list = get_random_list(16)now_value_list=value_listwight=get_offset(value_list)# 将当前状态 添加到 被搜索 列表#[0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价append_searched_list(now_value_list,-1,0,wight,0)#添加完第一个状态,开始 搜索 与 拓展的 递归# expand_searched_list()# contanst_expand()#连续拓展  节点
# def contanst_expand():
#     while True:
#         expand_searched_list()#
# start_question(get_random_list(16))
# # start_question([3, 7, 6, 0, 2, 4, 1, 5, 8])
# expand_searched_list()# get_offset(value_list16)#1222

fifteennumbergame

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'fifteennumbergame.ui'
#
# Created by: PyQt5 UI code generator 5.13.1
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont, QPalette
from PyQt5.QtWidgets import QMainWindow
import time
import shiyan_2.qiuejie_question as qj
from PyQt5.QtCore import QTimerfrom PyQt5.QtCore import Qtclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1012, 600)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.widget = QtWidgets.QWidget(self.centralwidget)self.widget.setGeometry(QtCore.QRect(12, 12, 904, 532))self.widget.setObjectName("widget")self.gridLayout = QtWidgets.QGridLayout(self.widget)self.gridLayout.setContentsMargins(0, 0, 0, 0)self.gridLayout.setObjectName("gridLayout")self.label_12 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_12.sizePolicy().hasHeightForWidth())self.label_12.setSizePolicy(sizePolicy)self.label_12.setObjectName("label_12")self.gridLayout.addWidget(self.label_12, 0, 3, 1, 1)spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem, 3, 0, 1, 1)spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem1, 1, 0, 1, 1)self.label_8 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_8.sizePolicy().hasHeightForWidth())self.label_8.setSizePolicy(sizePolicy)self.label_8.setObjectName("label_8")self.gridLayout.addWidget(self.label_8, 3, 2, 1, 1)spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem2, 0, 0, 1, 1)spacerItem3 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem3, 7, 2, 1, 1)spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem4, 4, 0, 1, 1)self.pushButton_2 = QtWidgets.QPushButton(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())self.pushButton_2.setSizePolicy(sizePolicy)self.pushButton_2.setMinimumSize(QtCore.QSize(80, 50))self.pushButton_2.setObjectName("pushButton_2")self.gridLayout.addWidget(self.pushButton_2, 5, 2, 1, 1)self.textBrowser = QtWidgets.QTextBrowser(self.widget)self.textBrowser.setObjectName("textBrowser")self.gridLayout.addWidget(self.textBrowser, 1, 6, 2, 2)self.label_20 = QtWidgets.QLabel(self.widget)self.label_20.setObjectName("label_20")self.gridLayout.addWidget(self.label_20, 3, 6, 1, 1)self.textBrowser_3 = QtWidgets.QTextBrowser(self.widget)self.textBrowser_3.setObjectName("textBrowser_3")self.gridLayout.addWidget(self.textBrowser_3, 4, 6, 2, 4)spacerItem5 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem5, 7, 7, 1, 1)self.label_17 = QtWidgets.QLabel(self.widget)self.label_17.setObjectName("label_17")self.gridLayout.addWidget(self.label_17, 4, 1, 1, 1)spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem6, 2, 0, 1, 1)spacerItem7 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem7, 7, 8, 1, 1)self.label_2 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())self.label_2.setSizePolicy(sizePolicy)self.label_2.setObjectName("label_2")self.gridLayout.addWidget(self.label_2, 1, 1, 1, 1)self.label_10 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_10.sizePolicy().hasHeightForWidth())self.label_10.setSizePolicy(sizePolicy)self.label_10.setObjectName("label_10")self.gridLayout.addWidget(self.label_10, 2, 3, 1, 1)self.label_7 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth())self.label_7.setSizePolicy(sizePolicy)self.label_7.setObjectName("label_7")self.gridLayout.addWidget(self.label_7, 2, 2, 1, 1)self.label_14 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth())self.label_14.setSizePolicy(sizePolicy)self.label_14.setObjectName("label_14")self.gridLayout.addWidget(self.label_14, 1, 4, 1, 1)self.label_16 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_16.sizePolicy().hasHeightForWidth())self.label_16.setSizePolicy(sizePolicy)self.label_16.setObjectName("label_16")self.gridLayout.addWidget(self.label_16, 3, 4, 1, 1)spacerItem8 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem8, 7, 6, 1, 1)spacerItem9 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem9, 7, 5, 1, 1)self.label_4 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth())self.label_4.setSizePolicy(sizePolicy)self.label_4.setObjectName("label_4")self.gridLayout.addWidget(self.label_4, 3, 1, 1, 1)spacerItem10 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem10, 7, 9, 1, 1)spacerItem11 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem11, 7, 4, 1, 1)spacerItem12 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem12, 5, 0, 1, 1)self.label_18 = QtWidgets.QLabel(self.widget)self.label_18.setObjectName("label_18")self.gridLayout.addWidget(self.label_18, 0, 6, 1, 1)self.horizontalSlider = QtWidgets.QSlider(self.widget)self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)self.horizontalSlider.setObjectName("horizontalSlider")self.gridLayout.addWidget(self.horizontalSlider, 4, 2, 1, 2)self.label_5 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth())self.label_5.setSizePolicy(sizePolicy)self.label_5.setObjectName("label_5")self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1)spacerItem13 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem13, 7, 1, 1, 1)self.textBrowser_2 = QtWidgets.QTextBrowser(self.widget)self.textBrowser_2.setObjectName("textBrowser_2")self.gridLayout.addWidget(self.textBrowser_2, 1, 8, 2, 2)self.label_9 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_9.sizePolicy().hasHeightForWidth())self.label_9.setSizePolicy(sizePolicy)self.label_9.setObjectName("label_9")self.gridLayout.addWidget(self.label_9, 3, 3, 1, 1)self.label_6 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth())self.label_6.setSizePolicy(sizePolicy)self.label_6.setObjectName("label_6")self.gridLayout.addWidget(self.label_6, 1, 2, 1, 1)spacerItem14 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem14, 7, 0, 1, 1)self.label_3 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())self.label_3.setSizePolicy(sizePolicy)self.label_3.setObjectName("label_3")self.gridLayout.addWidget(self.label_3, 2, 1, 1, 1)spacerItem15 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)self.gridLayout.addItem(spacerItem15, 7, 3, 1, 1)self.label_19 = QtWidgets.QLabel(self.widget)self.label_19.setObjectName("label_19")self.gridLayout.addWidget(self.label_19, 0, 8, 1, 1)self.label_15 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_15.sizePolicy().hasHeightForWidth())self.label_15.setSizePolicy(sizePolicy)self.label_15.setObjectName("label_15")self.gridLayout.addWidget(self.label_15, 2, 4, 1, 1)self.pushButton = QtWidgets.QPushButton(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())self.pushButton.setSizePolicy(sizePolicy)self.pushButton.setMinimumSize(QtCore.QSize(80, 50))self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 5, 1, 1, 1)self.label_13 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_13.sizePolicy().hasHeightForWidth())self.label_13.setSizePolicy(sizePolicy)self.label_13.setObjectName("label_13")self.gridLayout.addWidget(self.label_13, 0, 4, 1, 1)self.label_11 = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label_11.sizePolicy().hasHeightForWidth())self.label_11.setSizePolicy(sizePolicy)self.label_11.setObjectName("label_11")self.gridLayout.addWidget(self.label_11, 1, 3, 1, 1)self.label = QtWidgets.QLabel(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())self.label.setSizePolicy(sizePolicy)self.label.setObjectName("label")self.gridLayout.addWidget(self.label, 0, 1, 1, 1)self.pushButton_3 = QtWidgets.QPushButton(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.pushButton_3.sizePolicy().hasHeightForWidth())self.pushButton_3.setSizePolicy(sizePolicy)self.pushButton_3.setMinimumSize(QtCore.QSize(80, 50))self.pushButton_3.setObjectName("pushButton_3")self.gridLayout.addWidget(self.pushButton_3, 5, 3, 1, 1)self.pushButton_4 = QtWidgets.QPushButton(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.pushButton_4.sizePolicy().hasHeightForWidth())self.pushButton_4.setSizePolicy(sizePolicy)self.pushButton_4.setMinimumSize(QtCore.QSize(80, 50))self.pushButton_4.setObjectName("pushButton_4")self.gridLayout.addWidget(self.pushButton_4, 5, 4, 1, 1)self.pushButton_5 = QtWidgets.QPushButton(self.widget)sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.pushButton_5.sizePolicy().hasHeightForWidth())self.pushButton_5.setSizePolicy(sizePolicy)self.pushButton_5.setMinimumSize(QtCore.QSize(80, 50))self.pushButton_5.setObjectName("pushButton_5")self.gridLayout.addWidget(self.pushButton_5, 5, 5, 1, 1)self.label_21 = QtWidgets.QLabel(self.widget)self.label_21.setObjectName("label_21")self.gridLayout.addWidget(self.label_21, 4, 4, 1, 1)MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)##############################添加的代码# 创建放置button的列表self.button_list = [[self.label, self.label_5, self.label_12, self.label_13],[self.label_2, self.label_6, self.label_11, self.label_14],[self.label_3, self.label_7, self.label_10, self.label_15],[self.label_4, self.label_8, self.label_9, self.label_16]]# 建立按钮之间的联机# self.pushButton.clicked.connect(self.setbutton_inner)self.game_sudu=20font1 = QFont()font1.setPointSize(20)self.label_21.setFont(font1)self.horizontalSlider.setValue(20)self.horizontalSlider.setRange(1, 30)# self.horizontalSlider.changeEvent.connect(self.get_slider_value)# self.horizontalSlider.sliderChange.connect(self.get_slider_value)self.horizontalSlider.setPageStep(1)self.horizontalSlider.valueChanged.connect(self.get_slider_value)##单步求解self.pushButton.clicked.connect(self.one_step_solu)#绑定定时器self.value_list=''self.result_list=''self.info_list=''self.status_list=''self.result_index=-1# 连续执行#self.refresh_timer=''self.pushButton_2.clicked.connect(self.solu_question)#在8 断码 和 15断码之间进行切换self.qiju=16self.pushButton_3.clicked.connect(self.change_qiju)#随机生成棋局self.pushButton_5.clicked.connect(self.display_qiju)# 随机缺省棋局self.pushButton_4.clicked.connect(self.display_quesheng_qiju)###添加代码结束########################3self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.change_qiju()def one_step_solu(self):try :self.result_index -= 1self.value_list = self.result_list[self.result_index]print(self.value_list)self.set_qiju_inner(self.value_list)self.refresh()except Exception as e:print(e)def solu_question(self):try:if self.refresh_timer=='':self.refresh_timer = QTimer(self)self.refresh_timer.timeout.connect(self.get_new_value_list)jiange=1000.0/self.game_suduprint('时间间隔',jiange)jiange=int(jiange)self.refresh_timer.start(jiange)except Exception as e:if e=="游戏结束":print("over !")if e=="这个初始图没有解":print("无解!")print(e)def get_new_value_list(self):try:self.result_index-=1self.value_list = self.result_list[self.result_index]print(self.value_list)self.set_qiju_inner(self.value_list)except Exception as e:if e == "游戏结束":print("over !")if e == "这个初始图没有解":print("无解!")self.refresh_timer.stop()self.refresh_timer=''#布置随机棋局def display_qiju(self):if self.refresh_timer !='':self.refresh_timer.stop()self.refresh_timer=''self.clear_qiju()self.value_list=''if self.qiju==9:self.setbutton_9_inner()self.value_list=self.get_random_list(9)else:self.setbutton_16_inner()self.value_list=self.get_random_list(16)self.set_qiju_inner(self.value_list)self.refresh()self.qiujie()self.shuchu()def shuchu(self):if type(self.result_list)==str:self.textBrowser_3.setText(self.result_list)self.textBrowser_2.setText('')self.textBrowser.setText('')for i in range(len(self.status_list[0])):a='状态描述\n '+str(self.status_list[0][i])b='当前节点序号 '+str(i) + '\n父节点序号 '+str(self.status_list[1][i])c='预估代价 '+str(self.status_list[3][i])+'\n当前代价 ' +str(self.status_list[4][i])+'\n'if self.status_list[2][i]==0:self.textBrowser.append(a)self.textBrowser.append(b)self.textBrowser.append(c)if self.status_list[2][i]==1:self.textBrowser_2.append(a)self.textBrowser_2.append(b)self.textBrowser_2.append(c)print(type(self.result_list))print(type(self.result_list)==list)if type(self.result_list)==list:self.textBrowser.setText('')self.textBrowser_2.setText('')self.textBrowser_3.setText('')for i in range(len(self.result_list)):a='状态描述 '+str(self.result_list[len(self.result_list)-i-1])b='预估代价 '+str(self.info_list[0][len(self.info_list[0]) - i - 1])c='实际代价 '+str(self.info_list[1][len(self.info_list[1]) - i - 1])+'\n'self.textBrowser_3.append(a)self.textBrowser_3.append(b)self.textBrowser_3.append(c)# [0]自身状态   [1]父节点  [2]是否被搜索过 [3]预估代价  [4]当前代价for i in range(len(self.status_list[0])):a='状态描述\n '+str(self.status_list[0][i])b='当前节点序号 '+str(i) + '\n父节点序号 '+str(self.status_list[1][i])c='预估代价 '+str(self.status_list[3][i])+'\n当前代价 ' +str(self.status_list[4][i])+'\n'if self.status_list[2][i]==0:self.textBrowser.append(a)self.textBrowser.append(b)self.textBrowser.append(c)if self.status_list[2][i]==1:self.textBrowser_2.append(a)self.textBrowser_2.append(b)self.textBrowser_2.append(c)def qiujie(self):try:qj.start_question(self.value_list)self.result_list,self.info_list,self.status_list = qj.expand_searched_list()self.result_index = len(self.result_list)except Exception as e:if e=="游戏结束":print("over !")if e=="这个初始图没有解":print("无解!")print(e)# 布置缺省棋局def display_quesheng_qiju(self):# self.refresh_timer=''if self.refresh_timer !='':self.refresh_timer.stop()self.refresh_timer=''self.clear_qiju()self.value_list = ''if self.qiju==16:self.setbutton_16_inner()self.value_list=[10, 11, 0, 6, 14, 3, 2, 12, 9, 1, 4, 7, 8, 5, 13, 15]if self.qiju == 9:self.setbutton_9_inner()self.value_list=[3, 7, 6, 0, 2, 4, 1, 5, 8]self.set_qiju_inner(self.value_list)self.refresh()self.qiujie()self.shuchu()def get_random_list(self,n):import randomif type(n) == int:list1 = list(range(n))random.shuffle(list1)print(list1)return list1else:raise Exception('get_random_list 需要传入一个整数')# 绑定游戏速度def get_slider_value(self):self.game_sudu = self.horizontalSlider.value()print(self.game_sudu)font1 = QFont()font1.setPointSize(20)self.label_21.setFont(font1)self.label_21.setText(str(self.game_sudu))self.refresh()def  change_qiju(self):if  self.qiju==16:self.qiju=9self.clear_qiju()self.setbutton_9_inner()else:self.qiju=16self.clear_qiju()self.setbutton_16_inner()print(self.qiju)self.refresh()def clear_qiju(self):self.button_list = [[self.label, self.label_5, self.label_12, self.label_13],[self.label_2, self.label_6, self.label_11, self.label_14],[self.label_3, self.label_7, self.label_10, self.label_15],[self.label_4, self.label_8, self.label_9, self.label_16]]count = 0for i in range(len(self.button_list)):for j in range(len(self.button_list[i])):count += 1# self.button_list[i][j].setFont()font1 = QFont()font1.setPointSize(20)self.button_list[i][j].setFont(font1)self.button_list[i][j].setText(' ')if count == 16:self.button_list[i][j].setText(' ')self.refresh()def refresh(self):self.setVisible(False)self.setVisible(True)# QMainWindow(self).setVisible(False)# QMainWindow(self).setVisible(True)def set_qiju_inner(self,value_list):count = 0for i in range(len(self.button_list)):for j in range(len(self.button_list[i])):# self.button_list[i][j].setFont()font1 = QFont()font1.setPointSize(20)self.button_list[i][j].setFont(font1)# print('\n\n\n\n',value_list)self.button_list[i][j].setText(str(value_list[count]))self.button_list[i][j].setAutoFillBackground(False)  # 设置背景充满,为设置背景颜色的必要条件# print(value_list[count])if value_list[count] == 0:pe = QPalette()# pe.setColor(QPalette.WindowText, Qt.red)  # 设置字体颜色self.button_list[i][j].setAutoFillBackground(True)  # 设置背景充满,为设置背景颜色的必要条件pe.setColor(QPalette.Window, Qt.red)  # 设置背景颜色# pe.setColor(QPalette.Background,Qt.blue)<span style="font-family: Arial, Helvetica, sans-serif;">#设置背景颜色,和上面一行的效果一样self.button_list[i][j].setPalette(pe)self.button_list[i][j].setText('#')count += 1self.refresh()#######添加的代码def setbutton_16_inner(self):# 创建放置button的列表self.button_list = [[self.label, self.label_5, self.label_12, self.label_13],[self.label_2, self.label_6, self.label_11, self.label_14],[self.label_3, self.label_7, self.label_10, self.label_15],[self.label_4, self.label_8, self.label_9, self.label_16]]count=0for i in range(len(self.button_list)):for j in range(len(self.button_list[i])):count+=1# self.button_list[i][j].setFont()font1=QFont()font1.setPointSize(20)self.button_list[i][j].setFont(font1)self.button_list[i][j].setText(str(count))if count==16:pe = QPalette()# pe.setColor(QPalette.WindowText, Qt.red)  # 设置字体颜色self.button_list[i][j].setAutoFillBackground(True)  # 设置背景充满,为设置背景颜色的必要条件pe.setColor(QPalette.Window, Qt.red)  # 设置背景颜色# pe.setColor(QPalette.Background,Qt.blue)<span style="font-family: Arial, Helvetica, sans-serif;">#设置背景颜色,和上面一行的效果一样self.button_list[i][j].setPalette(pe)self.button_list[i][j].setText('#')self.refresh()# 添加的代码#############def setbutton_9_inner(self):# 创建放置button的列表self.button_list = [[self.label, self.label_5, self.label_12],[self.label_2, self.label_6, self.label_11],[self.label_3, self.label_7, self.label_10]]count = 0for i in range(len(self.button_list)):for j in range(len(self.button_list[i])):count += 1# self.button_list[i][j].setFont()font1 = QFont()font1.setPointSize(20)self.button_list[i][j].setFont(font1)self.button_list[i][j].setText(str(count))if count == 9:pe = QPalette()# pe.setColor(QPalette.WindowText, Qt.red)  # 设置字体颜色self.button_list[i][j].setAutoFillBackground(True)  # 设置背景充满,为设置背景颜色的必要条件pe.setColor(QPalette.Window, Qt.red)  # 设置背景颜色# pe.setColor(QPalette.Background,Qt.blue)<span style="font-family: Arial, Helvetica, sans-serif;">#设置背景颜色,和上面一行的效果一样self.button_list[i][j].setPalette(pe)self.button_list[i][j].setText('#')self.refresh()def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.label_12.setText(_translate("MainWindow", "TextLabel"))self.label_8.setText(_translate("MainWindow", "TextLabel"))self.pushButton_2.setText(_translate("MainWindow", "连续执行"))self.label_20.setText(_translate("MainWindow", "A*算法流程"))self.label_17.setText(_translate("MainWindow", "执行速度"))self.label_2.setText(_translate("MainWindow", "TextLabel"))self.label_10.setText(_translate("MainWindow", "TextLabel"))self.label_7.setText(_translate("MainWindow", "TextLabel"))self.label_14.setText(_translate("MainWindow", "TextLabel"))self.label_16.setText(_translate("MainWindow", "TextLabel"))self.label_4.setText(_translate("MainWindow", "TextLabel"))self.label_18.setText(_translate("MainWindow", "open表"))self.label_5.setText(_translate("MainWindow", "TextLabel"))self.label_9.setText(_translate("MainWindow", "TextLabel"))self.label_6.setText(_translate("MainWindow", "TextLabel"))self.label_3.setText(_translate("MainWindow", "TextLabel"))self.label_19.setText(_translate("MainWindow", "close表"))self.label_15.setText(_translate("MainWindow", "TextLabel"))self.pushButton.setText(_translate("MainWindow", "单步执行"))self.label_13.setText(_translate("MainWindow", "TextLabel"))self.label_11.setText(_translate("MainWindow", "TextLabel"))self.label.setText(_translate("MainWindow", "TextLabel"))self.pushButton_3.setText(_translate("MainWindow", "8/16段"))self.pushButton_4.setText(_translate("MainWindow", "缺省棋局"))self.pushButton_5.setText(_translate("MainWindow", "随机生成"))self.label_21.setText(_translate("MainWindow", "TextLabel"))self.label_21.setText('20')

六、心得体会

用来 保存 搜索过的 状态, 当没有被搜索过 时 压入 这个 列表, 当某个状态,被搜索过,则忽略,
这个 状态 列表上 还应该 有一个指针, 指向, 当前搜索的 状态,
每一次 指针向后移, 并且压入 会被搜索的 新状态 ,
当 搜索 指针到达 队尾还没有 求解问题,代表 问题 在这种 解法下 暂时无解

open表中用来保存还没有搜所过的节点,
Close 表中用来记录搜索过的节点

并且记录下来每个节点的 父节点,用来回溯最后的求解路径

实验三项目:神经网络
一、实验目的

  1. 加深学生对神经网络的理解。
    2.使学生掌握BP神经网络。
    3.使学生能够运用神经网络解决一些实际问题。
    二、预习要求
    神经网络,是模拟生物神经网络进行信息处理的一种数学模型。它以对大脑的生理研究成果为基础,其目的在于模拟大脑的某些机理与机制,实现一些特定的功能。目前,人工神经网络已应用于很多领域。
    BP网络是一种多层前馈型神经网络,其神经元的传递是S型函数,输出量为0到1之间的连续量,它可以实现从输入到输出的任意非线性映射。由于权值的调整采用反向传播学习算法,因此也常称其为BP网络。BP网络主要用于函数逼近、模式识别、分类等领域。

三、实验内容
设计合适的BP神经网络,解决函数逼近问题。要求根据问题选择合适的BP神经网络结构,对非线性函数—正弦函数进行逼近,并分析神经网络不同参数的影响。
四、实验要求
要求能够对正弦函数进行逼近。

五、实验步骤及实验结果
网络结构:

输入层
第一层layers.Dense(32, activation=‘relu’)
第二层layers.Dense(32, activation=‘relu’)
第三层layers.Dense(32, activation=‘relu’)
输出层layers.Dense(1,))

import matplotlib.pyplot as plt#约定俗成的写法plt
#首先定义两个函数(正弦&余弦)
import numpy as npimport tensorflow as tf
from tensorflow.keras import layersmodel = tf.keras.Sequential()
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1,))
#
# model.compile(optimizer=tf.keras.optimizers.Adam(0.5),
#               loss='categorical_crossentropy',
#               metrics=['accuracy'])optimizer = tf.keras.optimizers.RMSprop(0.001)model.compile(loss='mse',optimizer=optimizer,metrics=['mae', 'mse'])X=np.linspace(-np.pi,np.pi,256,endpoint=True)#-π to+π的256个值
print("x的值",X.shape)
S=np.sin(X)x1=[]
s1=[]
for index in range(len(X)):x1.append([X[index]])s1.append([S[index]])
x1=np.array(x1)
s1=np.array(s1)model.fit(x1,s1,epochs=0, batch_size=32)
before_t=[]
for tempx in X:print(tempx)tempx=model.predict([tempx])tempx=tempx[0]before_t.append(tempx)model.fit(x1,s1,epochs=100, batch_size=32)after_t=[]
for tempx in X:print(tempx)tempx=model.predict([tempx])tempx=tempx[0]after_t.append(tempx)print(tempx)plt.plot(X,S,label='sin(x)')
plt.plot(X,before_t,label="before_train")
plt.plot(X,after_t,label="after_train",color="yellow")
#在ipython的交互环境中需要这句话才能显示出来
plt.legend()
plt.show()

六、心得体会
当神经元个数足够时,神经网络可以用来拟合任意的函数,
也可以用来对离散函数进行,连续化处理
也可以用来对函数进行 求导,积分 函数进行直接拟合

1、编写一个描述亲属关系的逻辑程序,然后再给予出一些事实数据,建立一个小型演绎数据库。
提示:可以以父亲和母亲为基本关系(作为基本谓词),再由此来描述祖父、祖母、兄弟、姐妹以及其他所属关系。

代码

import kanren
import sympyfrom kanren import run, eq, membero, var, conde
from kanren import Relation, facts
parent = Relation()
facts(parent, ("Homer","Bart"),("lmk","Bart"),("Homer","Lisa"),("Abe","Homer"))
x = var()res1=run(0, x, parent(x, "Bart"))print(res1)father=Relation()
mather=Relation()
facts(father,("f1","f2"),("f2","f3"),("f2","f31"),("f3","f4"),("f4","f5"))facts(mather,("m1","m2"),("m2","m3"),("m3","m4"))someone=var()
someone_son=var()#爷爷
def grandfather(grandson):someone = var()someone_son = var()return run(0,someone,father(someone,someone_son),father(someone_son,grandson))#奶奶
def grandmather(grandson):someone = var()someone_son = var()return run(0,someone,mather(someone,someone_son),mather(someone_son,grandson))
# grandfather1=grandfather("f3")#兄弟
def borther(one_person):one_father = var()one_mather =var()one_brother = var()return run(0,(one_person,one_brother),father(one_father,one_person),father(one_father,one_brother),)one_grandson=input("你要找谁的爷爷\n")
grandfather1=grandfather(one_grandson)
print(grandfather1)one_person=input("你要找谁的兄弟\n")
borther1=borther(one_person)
print(borther1)

2、编写一个路径查询程序,使其能输出图中所有路径。
提示:程序中的事实描述了下面的有向图,规则是图中两节点间通路的定义。

import  pyDatalog
pyDatalog.create_terms('X,Y,Z,link,can_reach')
# there is a link between node 1 and node 2
+link('a', 'b')
+link('a', 'c')
+link('c', 'd')
+link('b', 'd')
+link('b', 'e')
+link('d', 'e')
# x y之间是否可达?
can_reach(X, Y) <= link(X, Y)  # direct link
# 递归查找 x,y 之间是否可达
can_reach(X, Y) <= link(X, Z) & can_reach(Z, Y) & (X != Y)while True:start_node=input('请输入出发的地点')print(can_reach(start_node, Y))


3、一个雇主在发出招聘广告之后,收到了大量的应聘申请。为了从中筛选出不量的候选人,该雇主采用下列判据:申请者必须会打字、开车,并且住在伦敦。
(a)用规则表述这个雇主的选择准则。
(b)用事实描述下列申请者的情况:
史密斯住在剑桥,会开车但不会打字。
布朗住在伦敦,会开车也会打字。
简住在格拉斯哥,不会开车但会打字。
埃文斯住在伦敦,会开车也会打字。
格林住在卢顿,会开车也会打字。
(c)要求运行结果提供一个候选人名单。

import pyDatalog.pyDatalog as pyDatalog
pyDatalog.create_terms('X,live,drive,type_word,can_be_hire')#现在又 几个 应聘者
# sms  ,bl  , jian  ,aws   ,gl+live('sms','jianqiao')
+live('bl','lundun')
+live('jian','silage')
+live('aws','lundun')
+live('gl','ludun')+drive('sms')
+drive('bl')
+drive('aws')
+drive('gl')+type_word('bl')
+type_word('jian')
+type_word('aws')
+type_word('gl')
#定义能够被雇佣的 员工
can_be_hire(X)  <= live(X,'lundun') & drive(X)  & type_word(X)print(can_be_hire(X))

输出结果

人工智能学习-传教士-15数码-拟合-逻辑推理相关推荐

  1. 【人工智能导论】A*算法求解15数码问题 Java

    完整源码 - Eclipse项目文件 - GitHub地址 题目描述 关于本算法 两个晚上写完的,不足之处多多指教- 启发函数的选择: 一开始选用不在位数码个数+节点深度作为启发函数,效果不是很好. ...

  2. 现在忘掉Sklearn吧,来自己手写一个人工智能线性回归,人工智能学习实验----01

    人工智能学习实验----01 本文是我的第一次人工智能学习的实验的操作,还请多多包涵. 现在忘掉Sklearn吧,来自己手写一个人工智能线性回归吧!!!-人工智能学习实验----01 模块化的编程固然 ...

  3. 史上最权威的人工智能学习网站推荐

    AI学习资源推荐原则 权威:本文介绍的课程都是由国内外知名企业或高校推出的,课程内容的权威性.前沿性有保障. 免费:课程基本都是免费的,就算收费也是象征性收1元那种. 正版:所有课程资源都是发布者通过 ...

  4. AI 人工智能学习路线

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 相关视频资料下载见:https://blog.csdn.net/qwxwaty/article/de ...

  5. 人工智能学习体系大纲

    课程体系 阶段一.数学基础 一.数据分析 二.概率论 三.线性代数及矩阵 阶段二.Python 一.环境搭建 二.Python基础 三.Python常用库 四.Python机器学习库 阶段三.机器学习 ...

  6. 人工智能学习路线 及 学习资源

    机器学习速成课程(Machine Learning Crash Course) 3月的第一天,谷歌就为AI开发者和研究人员带来了重大福利:近日,谷歌上线人工智能学习网站Learn with Googl ...

  7. python解决八数码问题_A*算法解决15数码问题_Python实现

    1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...

  8. 太肝了,挑战扫雷世界纪录:扫雷自动化Python+OpenCV实战(附迪迦250G人工智能学习资料)

    咱们废话不多说,先看成果~ 中级 - 0.74秒 3BV/S=60.81 相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一.世界综合排名 ...

  9. AC620FPGA学习笔记——BCD数码管

    AC620FPGA学习笔记--BCD数码管 BCD数码管 硬件结构 整体框架 BCDDisplay模块 device_74hc595模块 代码部分 device_74hc595 BCDdecoder ...

  10. 15数码问题(A*算法)

    一.题目 设计一个启发函数,利用A*算法求解15数码问题. 初始状态 5 1 2 4 9 6 3 8 13 15 10 11 14 0 7 12 目标状态 1 2 3 4 5 6 7 8 9 10 1 ...

最新文章

  1. 汇编:call指令的应用
  2. VTK:Medical之MedicalDemo1
  3. Verilog中的UDP
  4. 启动rrt什么意思_python学习第144课--创建虚拟机、设置虚拟机参数以及启动虚拟机...
  5. OVS+DPDK Datapath 包分类技术
  6. Java实现单例模式之饿汉式、懒汉式、枚举式,带测试。
  7. Java:比较两个对象中全部属性值是否相等
  8. php 清除内容中的bom,检查并清除php文件中bom的函数
  9. office excel2013如何启用solver选项
  10. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
  11. jquery audio在微信或者客户端需要点击两次才能正常播放的问题解决方案
  12. 高通平台 LCD 的 LK部分代码解析
  13. 07-11-Exchange Server 2019-配置-Outlook 2019-IMAP4
  14. 【转载】数据中心网络架构浅谈
  15. 图数据库查询语言Cypher
  16. l33t-hoster .htaccess \x00注释putenv绕过disable_function计算c代码
  17. 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵
  18. 2019.5.5 qq音乐数据源m4a抓取(新)
  19. 微信开放平台unionID 的利用(app推广转化率的解决方案)
  20. RPiPlay配置树莓派AirPlay投屏

热门文章

  1. Leetcode 20有效的括号、33搜索旋转排序数组、88合并两个有序数组(nums1长度为m+n)、160相交链表、54螺旋矩阵、415字符相加(不能直接转Int)、reverse()函数
  2. 数据中心网络图怎么画?几步教会你
  3. 计算机怎样更新卡驱动,电脑显卡驱动怎么更新(NVIDIA显卡手动更新教程)
  4. acer switch 10 linux,【AcerSwitch10E评测】拆开来用的电脑 Acer Switch 10E评测(全文)_Acer Switch 10E_笔记本评测-中关村在线...
  5. 双系统装完只能u盘启动_双系统启动引导修复 双系统启动引导设置教程
  6. PCI 总线及地址空间
  7. [小白slam攻略]ROVIO安装运行及保存轨迹用evo评估
  8. 解决Win7的svchost进程占内存过大,计算机运行过慢的方法
  9. python删除重复文件
  10. CNTV CBOX的服务项