智能算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能实验—智能算法
实验一蚂蚁算法
一、实验目的:
理解蚂蚁算法的本质,会编写蚂蚁算法来求解TSP问题。
二、实验原理:
蚂蚁在寻找食物源时,能在其走过的路上释放一种特殊的分泌物——信息素(随着时间的推移该物质会逐渐挥发), 后来的蚂蚁选择该路径的概率与当时这条路径上该物质的强度成正比。当一定路径上通过的蚂蚁越来越多时,其留下的信息素轨迹也越来越多,后来蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度。
而强度大的信息素会吸引更多的蚂蚁,从而形成一种正反馈机制, 通过这种正反馈机制,蚂蚁最终可以发现最短路径。特别地,当蚂蚁巢穴与食物源之间出现障碍物时,蚂蚁不仅可以绕过障碍物,而且通过蚁群信息素轨迹在不同路径上的变化,经过一段时间的正反馈,最终收敛到最短路径上。
三、实验内容:
#include
#include
#include
using namespace std;
const int MaxInt=~(unsigned int)0 / 2;
/*double d[5][5]={
{0, 7, 6,10,13},
{7, 0, 7,10,10},
{6, 7, 0,5 ,9 },
{10,10,5,0, 6 },
{13,10,9,6, 0 }
}; //表示路径(i,j)之间的长度
*/
class Ant
{
private:
int AntNum;//蚂蚁个数;
int NodeNum;//节点个数;
int MaxRunNum;//最大运行次数
int RunNum;//运行次数
double **d;//表示路径(i,j)之间的长度
double **n;//边弧(i,j)的能见度(visibility), 或称局部启发因子,一般取1/d 表示路径(i,j)之间的长度;
double **t;//边弧(i,j)的信息素轨迹强度(intensity)
double INITINFO;//初始的信息素值
//double **deltaT;//蚂蚁k 于弧上(i,j)留下的单位长度轨迹信息素数量;
double **P;//蚂蚁k 在结点的转移概率,j 是尚未访问结点;
int **tab;//蚂蚁的禁忌表
double MinSum;//最短路径长度
int *MinRoute;//最优路径
double a;//信息素轨迹的相对重要性
double b;//边弧能见度的相对重要性
double p;//信息素轨迹的持久性(Evaporation)
double Q;//(轨迹数量)
public:
Ant(int Num,double position[][2]):NodeNum(Num)
{
srand(time(NULL));
AntNum=50;
p=0.8;
a=1;//(1~2)
b=2;//(2~5)
P=get2DMemory(P,NodeNum);
t=get2DMemory(t,NodeNum);
n=get2DMemory(n,NodeNum);
d=get2DMemory(d,NodeNum);
tab=get2DMemory(tab,AntNum,NodeNum);
posToDistance(position);
MinSum=MaxInt;
MinRoute=new int[NodeNum];
MaxRunNum=200;
RunNum=0;
INITINFO=200;
Q=2000;
}
void posToDistance(double pos[][2])
{
for(int i=0;i for(int j=0;j { d[i][j]=sqrt((pos[i][0]-pos[j][0])*(pos[i][0]-pos[j][0])+(pos[i][1]-pos[j][1])*(pos[i][1]-pos[j][1])); } } void getMinRoute(int *CurrentRoute) { for(int i=0;i MinRoute[i]=CurrentRoute[i]; } double getPossiblity(int i,int j,int k,int cNode) { if(i==j) return 0; else { if(inTab(j,k,cNode)==true) return 0; } return Pow(t[i][j],a)*Pow(n[i][j],b)/sumPossiblity(i,k,cNode); } bool inTab(int s,int k,int cNode) { for(int m=0;m if(s==tab[k][m]) return true; return false; } double sumPossiblity(int i,int k,int cNode) { double sum=0; for(int s=0;s { if(i==s) continue; if(inTab(s,k,cNode)==true) continue; sum+=Pow(t[i][s],a)*Pow(n[i][s],b); } return sum; } void updateInfomation() { for(int k=0;k { double sum=sumDistance(k); if(sum { MinSum=sum; getMinRoute(tab[k]); } for(int i=0;i for(int j=0;j { if(i==j) continue; t[i][j]=t[i][j]*p; } for(i=0;i