老哥学习网 - www.lg9.cn 2024年04月26日 22:30 星期五
当前位置 首页 >公文范文 > 公文大全 >

人工智能求解函数最大值实验报告(2022年)

发布时间:2022-08-17 12:50:07 浏览数:

下面是小编为大家整理的人工智能求解函数最大值实验报告(2022年),供大家参考。希望对大家写作有帮助!

人工智能求解函数最大值实验报告(2022年)

人工智能求解函数最大值实验报告4篇

【篇一】人工智能求解函数最大值实验报告

“人工智能”实验报告

专业智能科学与技术

班级

学号

姓名

日期:2015.

实验一搜索策略

一实验内容

1.熟悉和掌握启发式搜索的定义、估价函数和算法过程;
比较不同算法的性能。

2. 修改八数码问题或路径规划问题的源程序,改变其启发函数定义,观察结果的变化,分析原因。

3. 熟悉和掌握各种搜索策略的思想,掌握A*算法的定义、估价函数和算法过程,理解求解流程和搜索顺序。

二实验思路

1.分别以各种搜索算法为例演示搜索过程,分析各种算法中的OPEN表CLOSE表的生成过程,分析估价函数对搜索算法的影响,分析某种启发式搜索算法的特点。进入演示系统后,选择搜索策略演示程序,可从多种不同搜索算法选择装载相关源文件。实验步骤如下:

(1)选择不同的搜索算法,点击“autosearch” 观察搜索过程。

(2)设置不同属性,观察搜索过程的变化。

(3)观察运行过程和搜索顺序,理解启发式搜索的原理。

(4)算法流程的任一时刻的相关状态,以算法流程高亮、open表、close表、节点静态图、   

(5)当前扩展节点移动图等5种形式在按钮上方同步显示,便于深入学习理解搜索算法。

(6)根据程序运行过程画出搜索算法框图。

三程序清单

1. 图搜索:

Let open be a list containing the initial state

Let closed be initially empty

Loop

if open is empty return failure

Node remove-first (open)

if Node is a goal

then return the path from initial state to Node

else put Node in closed

generate all successors of Node into S

For all nodes m in S

if m is not in open or closed

merge m into open

End Loop

2. A*算法:

OPEN={s, nil}

while OPEN is not empty

remove from OPEN the node with minimum f(n)

place on CLOSED

if n is a goal node,

return success (path p)

for each edge e connecting n & m with cost c

if is on CLOSED and {p|e} is cheaper than q,

then remove m from CLOSED,

put

【篇二】人工智能求解函数最大值实验报告

人工智能课程报告

——

专业:计算机科学与技术

年级:

姓名:

学号:

成绩:

2011-11-01

实验名称:人工智能程序设计

——少量动物识别专家系统

本程序用于识别豹子、老虎、鸟、长颈鹿、斑马等七种动物的一个实验专家系统。通过本程序的编制理解PROLOG的运行机制及推理规则,同时对专家系统有初步的了解。源程序代码如下:

database

xpositive(symbol,symbol).

xnegative(symbol,symbol).

predicates

run

animal_is(symbol)

it_is(symbol)

positive(symbol,symbol)

negative(symbol,symbol)

clear_facts

remember(symbol,symbol,symbol)

ask(symbol,symbol)

clauses

run:-animal_is(X),!,write("\nyour animal may be a(n) ",X),

nl,nl,clear_facts.

run:-write("\n unable to determine what "),

write("\n your animal is \n\n"), clear_facts.

positive(X,Y):-xpositive(X,Y),!.

positive(X,Y):-not(xnegative(X,Y)),!,ask(X,Y).

negative(X,Y):-xnegative(X,Y),!.

negative(X,Y):-not(xpositive(X,Y)),!,ask(X,Y).

ask(X,Y):-write(X," is ",Y,"\n" ),readln(Reply),

remember(X,Y,Reply).

remember(X,Y,yes):-assertz(xpositive(X,Y)).

remember(X,Y, no):-assertz(xnegative(X,Y)),fail.

clear_facts:-retract(xpositive(_,_)),fail.

clear_facts:-retract(xnegative(_,_)),fail.

clear_facts:-write("\n\nplease press the space bar to Exit"),readchar(_).

animal_is(cheetah):-it_is(mammal),it_is(carnivore),positive(has,tawny_color),positive(has,black_spots).

animal_is(tiger):-it_is(mammal),it_is(carnivore),positive(has,tawny_color),positive(has,black_stripes).

animal_is(giraffe):-it_is(ungulate),

positive(has,long_neck),

positive(has,long_legs),

positive(has,dark_spots).

animal_is(zebra):-it_is(ungulate),positive(has,black_stripes).

animal_is(ostrich):-it_is(bird),

negative(does,fly),

positive(has,long_neck),

positive(has,long_legs),

positive(has,black_and_white_color).

animal_is(penguin):-it_is(bird),

negative(does,fly),

positive(does,swim),

positive(has,black_and_white_color).

animal_is(albatross):-it_is(bird),positive(does,fly_well).

it_is(mammal):-positive(has,hair).

it_is(mammal):-positive(does,give_milk).

it_is(bird):-positive(has,feather).

it_is(bird):-positive(does,fly),positive(does,lay_eggs).

it_is(carnivore):-positive(does,eat_eat).

it_is(carnivore):-positive(has,pointed_teeth),

positive(has,claws),

positive(has,forward_eyes).

it_is(ungulate):-it_is(mammal),positive(has,hooves).

it_is(ungulate):-it_is(mammal),positive(has,chew_cud).

谓词解释:

Xpositive肯定数据库——记录yes选项的谓词,xnegative否定数据库——记录no选项的谓词。Cheetah:豹子 mammal:哺乳动物 carnivore:食肉动物 tawny_color:黄褐色 black_spots:黑斑点 black_stripes:斑纹 giraffe:长颈鹿 ungulate:有蹄的 zebra:斑马 ostrich:驼鸟penguin:企鹅 give_milk:哺乳 feather:羽毛

lay_eggs:下蛋 eat_eat:食肉 pointed_teeth:犬齿 claws:爪子

hooves:蹄 chew_cud:咀嚼

运行结果:在交互窗口下输入RUN,根据你要识别的动物特征选择yes或no。

假定要识别的动物是长颈鹿,运行结果如下:

【篇三】人工智能求解函数最大值实验报告

使用遗传算法求解函数最大值题目

使用遗传算法求解函数

在及y的最大值。

解答

算法

使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。

定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。

设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。

然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。

一 选择操作

首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。

但实验时发现结果不好,经过仔细研究之后发现,这里在x、y取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。

二 交叉操作

首先是根据交叉概率probCross选择要交叉的个体进行交叉。

这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。

三 变异操作

首先是根据变异概率probMutation选择要变异的个体。

变异时先随机生成变异的位置,然后把改位的01值翻转。

经过一定的进化之后得到最终种群,从中选择最优的个体即可得到最终的结果。

运行结果

借助matlab软件,我们可以知道该函数在该定义域下的图像为:

以下设置不同的参数值进行对比试验:

表1 不同参数的对比实验

以上我们主要对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。可以看出,随着种群规模的增大,染色体长度的增长,迭代次数的增加,算法得到的结果越来越精确。当参数规模达到一定程度时,再增加参数的值会明显地增加程序运行时间,但却不一定能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。

同时也大概比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,这里没有一一进行控制变量的比较。大致估算可知,交叉概率及交叉点的个数影响交叉操作产生新个体的质量,过多的交叉及变化过大的交叉可能会产生不好的结果,而过多的变异也应该会造成算法的不稳定。

下面给出以上几个实验结果的实验截图,其中到现在为止结果最好的一个为:

其余若干个为:

算法改进

以上实验得到的最好结果仍然是差强人意,这里对算法做一个小的优化,即添加防止种群退化的操作。记录当前位置所得到的最优值及对应的个体,每次更新种群之后,计算新种群的最优值,如果最优值变差了,则把之前较优的个体替换进新种群,防止种群退化;
否则更新最优值。

改进之后的效果如下所示,显然比之前更优,且实验结果显示对于前面对比实验中的参数值,这里只需要较小的参数(如迭代次数只需2000次)值即可稳定收敛到此最大值,可知改进非常有效。

增加输出精度之后为,于是得到最优的结果为2.894471354862841

源代码

改进后的源代码如下:

#include

#include

#include

#include

#include

using namespace std;

// 程序欲分配内存的数组大小

const int mxn = 10000; // 最大的种群规模

const int mxlen = 1000; // 最大的染色体长度

// 遗传算法关键参数

const int N = 200; // 种群的个体数

const int len = 30; // 每个个体的染色体的长度,x和y各占一半

const int crossnum = 4; // 交叉操作时多点交叉的交叉点个数

const int maxGeneration = 2000; // 最大进化代数

const double probCross = 0.85; // 交叉概率

const double probMutation = 0.15; // 变异概率

// 个体的染色体类

class Chromosome

{

public:

bool g[mxlen]; // 二进制编码的编码数组

Chromosome() // 默认构造函数,构造随机染色体

{

for (int i = 0; i < len; i++) g[i] = rand() % 2;

}

Chromosome(const Chromosome& c) // 拷贝构造函数,进行深复制

{

for (int i = 0; i < len; i++) g[i] = c.g[i];

}

void operator=(const Chromosome& c) // 重载=号,进行深复制

【篇四】人工智能求解函数最大值实验报告

人工智能导论实验报告

学院:计算机科学与技术学院

专业:计算机科学与技术

2016.12.20

人工智能导论实验报告 1

一、 简介(对该实验背景,方法以及目的的理解) 3

1. 实验背景 3

2. 实验方法 3

3. 实验目的 3

二、 方法(对每个问题的分析及解决问题的方法) 4

Q1: Depth First Search 4

Q2: Breadth First Search 4

Q3: Uniform Cost Search 5

Q4: A* Search 6

Q5: Corners Problem: Representation 6

Q6: Corners Problem: Heuristic 6

Q7: Eating All The Dots: Heuristic 7

Q8: Suboptimal Search 7

三、 实验结果(解决每个问题的结果) 7

Q1: Depth First Search 7

Q2: Breadth First Search 9

Q3: Uniform Cost Search 10

Q4: A* Search 12

Q5: Corners Problem: Representation 13

Q6: Corners Problem: Heuristic 14

Q7: Eating All The Dots: Heuristic 14

Q8: Suboptimal Search 15

自动评分 15

四、 总结及讨论(对该实验的总结以及任何该实验的启发) 15

一、简介(对该实验背景,方法以及目的的理解)

1.实验背景

1)自人工智能概念被提出,人工智能的发展就受到了很大的关注,取得了长足的发展,成为一门广泛的交叉和前沿科学。到目前,弱人工智能取得了长足的发展,而强人工智能则暂时处于瓶颈。

2)吃豆人Pacman 居住在亮蓝色的世界里,在这个世界有弯曲的走廊和美味佳肴。游戏的目的就是控制游戏的主角小精灵吃掉藏在迷宫内所有的豆子,并且不能被幽灵抓到。高效地浏览世界将是吃豆人掌握世界的第一步。

3)通过本学期的学习我们已经初步掌握了人工智能的基本知识,在实验中则应用这些知识使用人工智能操纵吃豆人游戏。

2.实验方法

1)在本实验中, Pacman 智能体将找到通过迷宫世界的路径, 既包括到达一个指定的位置,也包括高效地搜集食物。我们编辑文件search.py和searchAgents.py,编写一系列吃豆人程序,包括到达指定位置以及有效的吃豆,并将其应用到Pacman场景,完成对相关人工智能功能的完善。

2)在本实验中,我们对下面8个问题进行研究,针对每个问题提出解决方法,逐步完成吃豆人游戏:

Q1: Depth First Search

Q2: Breadth First Search

Q3: Uniform Cost Search

Q4: A* Search

Q5: Corners Problem: Representation

Q6: Corners Problem: Heuristic

Q7: Eating All The Dots: Heuristic

Q8: Suboptimal Search

3.实验目的

1)完成实验报告中的问题,编写一系列吃豆人程序,包括到达指定位置以及有效的吃豆;

2)通过分析吃豆人游戏巩固课堂上所学内容;

3)复习python语言的使用。

二、方法(对每个问题的分析及解决问题的方法)

Q1: Depth First Search

应用深度优先算法找到一个特定的位置的豆,我们通过depthFirstSearch函数实现深度优先搜索的功能。

深度优先遍历的方法是,从图中某顶点v出发:

1)访问顶点v;

2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;
直至图中和v有路径相通的顶点都被访问;

3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 

深度优先搜索的顺序如下图所示:

在depthFirstSearch中,由于搜索过程中火重复访问到部分节点,所以需要对于每个节点设置标记,以指示该节点是否被访问过。

先将每个后继节点压入搜索栈中,然后以深度优先的顺序进行搜索,判定是否符合目标状态,并将符合结果的节点放入结果集。

Q2: Breadth First Search

应用宽度优先算法找到一个特定的位置的豆,我们通过breadthFirstSearch函数实现深度优先搜索的功能。

广度优先搜索算法的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。如下图:

在breadthFirstSearch中,大体的搜索思路与深度优先算法一致,只是搜索的次序发生了变化。

在这里注意,在深度优先搜索和广度优先搜索方法中,我们使用的图搜索算法是一样的,但是涉及到具体的数据结构却是不同的。在深度优先搜索算法中,我们使用栈进行操作,在深度优先搜索算法中,我们使用队列进行操作,如下图所示。这两种数据结构的不同之处就在于其中元素的输出次序,在深度优先搜索中需要按照压栈顺序的逆序进行搜索,咋子广度优先搜索中需要按照入队顺序的顺序进行搜索。

Q3: Uniform Cost Search

很多情况下,路径中的代价是可以改变的,在这个问题中,我们完成代价一致搜索方法。

代价一致搜索,其实就是一个贪心搜索,取代扩展深度最浅的节点,代价一致搜索扩展的是路径消耗最低的节点n。如果所有单步耗散都相等的话,这种算法就和广度优先搜索算法是一样的。不过,这样在扩展到一个具有能返回到同一状态的零耗散行动的节点时就会陷入无限循环。

在uniformCostSearch函数中,我们计算每条路径的总代价,将总代价作为优先级进行搜索,待搜索序列存储于队列中。对于每个节点,使用代价函数getCostOfActions计算其所产生的代价,并依次作为搜索的优先级进行搜索。同样的,对于每个节点添加是否被访问的标记。

Q4: A* Search

A*算法是一种静态路网中求解最短路最有效的直接搜索方法,也是许多其他问题的常用启发式算法,对代价一致搜索算法进行了改进,加入了一个估计代价h。公式表示为:
f(n)=g(n)+h(n),其中 f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价(对于路径搜索问题,状态就是图中的节点,代价就是距离)。

在本实验中,我们使用曼哈顿距离作为启发函数。在aStarSearch函数中,我们首先搜索具有最低组合成本和启发式的节点。类似于问题三,我们计算每个节点的代价,并以此为依据搜索产生结果集,在搜索的过程中,还需要标记节点是否已经被访问过。

Q5: Corners Problem: Representation

找到所有的角落,在角落迷宫的四个角上面有四个豆,通过这个函数找到一条访问所有四个角落的最短的路径。

在CornersProblem类中,我们使用__init__函数存储墙壁的位置,吃豆人的起点和角落位置,定义新的函数getStartState用于获得节点起始状态,isGoalState函数判断当前节点是否为目标节点,getSuccessors函数返回后继状态,所需的操作以及代价,getCostOfActions函数计算动作序列所需的代价。

查找后继节点时,在四个方向一次遍历,使用directionToVector移动位置,如果没有墙,则把下一个的状态,动作,花费的步数加入下一节点

Q6: Corners Problem: Heuristic

构建合适的启发函数,完成问题5中的角落搜索问题。

在问题五使用的CornersProblem类中定义cornersHeuristic函数,为角落问题构造启发函数。在cornersHeuristic函数中使用了GetNextNodes函数获取下一个节点,isGoal函数判断是否为目标。

Q7: Eating All The Dots: Heuristic

用尽可能少的步数吃掉所有的豆子。这个问题利用之前A*算法可以很容易找到解,此种方法在这里不再详述。

下面在FoodSearchProblem类中定义函数foodHeuristic,构建合适的启发函数完成豆子搜索(启发式)问题。

Q8: Suboptimal Search

次最优搜索,定义一个优先吃最近的豆子的函数,以此来提高搜索速度。

补充AnyFoodSearchProblem目标测试函数,并在ClosestDotSearchAgent当中添加findPathToClosestDot函数,用于寻找最近的豆子。

三、实验结果(解决每个问题的结果)

Q1: Depth First Search

python pacman.py -l tinyMaze -p SearchAgent

python pacman.py -l mediumMaze -p SearchAgent

python pacman.py -l bigMaze -z .5 -p SearchAgent

Q2: Breadth First Search

python pacman.py -l mediumMaze -p SearchAgent -a fn=bfs

python pacman.py -l bigMaze -p SearchAgent -a fn=bfs -z .5

Q3: Uniform Cost Search

python pacman.py -l mediumMaze -p SearchAgent -a fn=ucs

python pacman.py -l mediumDottedMaze -p StayEastSearchAgent

python pacman.py -l mediumScaryMaze -p StayWestSearchAgent

Q4: A* Search

python pacman.py -l bigMaze -z .5 -p SearchAgent -a fn=astar,heuristic=manhattanHeuristic

Q5: Corners Problem: Representation

python pacman.py -l tinyCorners -p SearchAgent -a fn=bfs,prob=CornersProblem

python pacman.py -l mediumCorners -p SearchAgent -a fn=bfs,prob=CornersProblem

Q6: Corners Problem: Heuristic

python pacman.py -l mediumCorners -p AStarCornersAgent -z 0.5

Q7: Eating All The Dots: Heuristic

python pacman.py -l trickySearch -p AStarFoodSearchAgent

Q8: Suboptimal Search

python pacman.py -l bigSearch -p ClosestDotSearchAgent -z .5

自动评分

四、总结及讨论(对该实验的总结以及任何该实验的启发)

1.在这个实验中,我们对深度优先搜索、广度优先搜索、代价一致搜索和A*算法四种搜索方法进行了python代码实现,对这四种方法有了进一步的了解。与深度优先搜索和广度优先上搜索方法相比,代价一致搜索方法的效率更高,在代价一致上搜索方法失效时,等同于广度优先搜索。A*算法是最有效的直接搜索算法,使用公式进行预处理,这样能够省略大量不必要的搜索路径,提高了效率。

2.在启发式搜索中,估价函数非常重要,准确的估价函数能够增大搜索函数的效率并且具有相当高的准确性。由此,在启发式搜索中对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。

3.在本次实验中使用了大量python语言中的类,对之前的python知识有了很大的扩展。

推荐访问:最大值 求解 人工智能 人工智能求解函数最大值实验报告 人工智能求解函数最大值实验报告 人工智能遗传算法求函数最大值

相关文章:

Top