蚁群算法源代码Word下载.docx
- 文档编号:21344499
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:19
- 大小:18.74KB
蚁群算法源代码Word下载.docx
《蚁群算法源代码Word下载.docx》由会员分享,可在线阅读,更多相关《蚁群算法源代码Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
();
//所有节点集合
Ant>
antAll=newList<
//所有蚂蚁集合
dataObj>
dataObjAll=newList<
//所有数据对象集合
privatevoidForm1_Load(objectsender,EventArgse)
privatevoidbutton1_Click(objectsender,EventArgse)
//从数据库读取数据
StringconnectionString="
Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=data.mdb"
;
OleDbConnectionconnection=newOleDbConnection(connectionString);
OleDbDataAdapterad=newOleDbDataAdapter("
select*fromIris"
connection);
DataSetds=newDataSet();
ad.Fill(ds);
//生成节点
for(inti=0;
i<
gridN;
i)
for(intj=0;
j<
j)
nodeAll.Add(newNode(i,j));
//生成蚂蚁
antC;
antAll.Add(newAnt());
//生成数据对象
atrCount=ds.Tables[0].Columns.Count-1;
ds.Tables[0].Rows.Count;
Single[]datatemp=newSingle[atrCount];
atrCount;
datatemp[j]=Convert.ToSingle(ds.Tables[0].Rows[i][j1].ToString());
dataObjAll.Add(newdataObj(ds.Tables[0].Rows[i]["
ID"
].ToString(),datatemp));
//初始化数据对象和蚂蚁的位置
initPosition();
//主体迭代
Cacu();
//输出结果
dataObjAll.Count;
i)
Debug.Write(dataObjAll[i].myID.ToString()"
"
);
Debug.Write(dataObjAll[i].NodePosition.Px.ToString()"
Debug.Write(dataObjAll[i].NodePosition.Py.ToString()"
Debug.WriteLine("
"
MessageBox.Show("
请查看结果!
privatevoidinitPosition()
//初始化数据对象的位置
Randomrd=newRandom();
inttempP=(int)(rd.NextDouble()*nodeAll.Count);
dataObjAll[i].NodePosition=nodeAll[tempP];
nodeAll[tempP].datalst.Add(dataObjAll[i]);
//初始化蚂蚁的位置
rd=newRandom();
antAll.Count;
inttempP=(int)(rd.NextDouble()*nodeAll.Count);
antAll[i].NodePosition=nodeAll[tempP];
antAll[i].isFull=false;
antAll[i].nowData=null;
==================================================================================="
//主体计算过程
inttp=0;
doubleE1;
doubleE2;
privatevoidCacu()
nodeT=newList<
();
nodeN=newList<
dataN=newList<
for(intt=0;
t<
tMax;
t)//最外层循环
antAll.Count;
//计算蚂蚁周围节点数据对象总数
nodeT=antAll[i].NodePosition.getNearByNodes1(gridN);
//蚂蚁周围节点列表
nodeN.Clear();
nodeN.Add(antAll[i].NodePosition);
//记录当前区域所有节点
inttempIndex=0;
for(intk=0;
k<
nodeT.Count;
k)
tempIndex=getNodeId(nodeT[k].Px,nodeT[k].Py);
nodeN.Add(nodeAll[tempIndex]);
intsum=0;
dataN.Clear();
nodeN.Count;
nodeN[k].datalst.Count;
j)
sum;
intdataNum=0;
dataNum=antAll[i].NodePosition.hasData()sum;
//判断蚂蚁是否负载
if(antAll[i].isFull==false)//蚂蚁空载的情况
//判断蚂蚁所在节点数据对象是否为空
if(antAll[i].NodePosition.hasData()>
0)//蚂蚁所在节点数据对象数目m>
//判断蚂蚁所在节点数据对象数目m与蚂蚁周围节点数据对象数目n之和
if((antAll[i].NodePosition.hasData()==1)&
&
(sum==0))//m=1&
n=0
//蚂蚁捡起所在节点数据
antAll[i].isFull=true;
antAll[i].nowData=antAll[i].NodePosition.datalst[0];
//*
antAll[i].NodePosition.datalst.RemoveAt(0);
//Debug.WriteLine("
m=1&
n=0,捡起"
//elseif(((antAll[i].NodePosition.hasData()==1)&
(sum==1))||((antAll[i].NodePosition.hasData()==2)&
(sum==0)))//m=1&
n=1或者m=2&
//{
////蚂蚁不捡起所在节点数据
////Debug.WriteLine("
n=0,不捡起"
//}
elseif(dataNum>
=3)//mn>
=3
//计算信息熵,判断是否捡起
//tempE=getE(antAll[i].NodePosition,1,null);
tp=getSelNode(antAll[i].NodePosition);
if(tp!
=-1)
antAll[i].nowData=antAll[i].NodePosition.datalst[tp];
antAll[i].NodePosition.datalst.RemoveAt(tp);
存在可以捡起的数据(捡起后信息熵减小),捡起"
//else
不存在可以捡起的数据,不捡起"
//elseif(antAll[i].NodePosition.hasData()==0)//蚂蚁所在节点数据对象数目m=0
m=0,节点无数据对象,不处理"
elseif(antAll[i].isFull==true)//蚂蚁负载的情况
//if(dataNum==0)//mn=0
////蚂蚁不放下携带的数据
mn=0,不放下数据"
if(dataNum==1)//mn=1
//蚂蚁放下携带的数据
//antAll[i].nowData=null;
antAll[i].NodePosition.datalst.Add(antAll[i].nowData);
//更新数据对象位置
dataObjAll[getid(antAll[i].nowData.myID)].NodePosition=antAll[i].NodePosition;
mn=1,放下数据"
=2)//mn>
=2
//计算信息熵,判断是否放下
E1=getE(antAll[i].NodePosition,1,antAll[i].nowData);
E2=getE(antAll[i].NodePosition,2,antAll[i].nowData);
if(E1<
E2)
//MessageBox.Show("
down"
蚂蚁放下数据后信息熵减小,放下数据"
蚂蚁放下数据后信息熵增大,不放下数据"
//移动蚂蚁
privateintgetid(stringidin)
if(dataObjAll[i].myID==idin)
returni;
returnConvert.ToInt32(idin);
privateintgetIdInDataAllFromIDtemp(stringid)
if(dataObjAll[i].myID==id)
returnConvert.ToInt32(id);
///<
summary>
///蚂蚁在当前节点所拿起的数据对象
/summary>
paramname="
nodeIn"
>
<
/param>
returns>
/returns>
privateintgetSelNode(NodenodeIn)
E1=getE(nodeIn,1,null);
//蚂蚁捡起数据前的信息熵值
nodeIn.datalst.Count;
E2=getE(nodeIn,3,nodeIn.datalst[i]);
//蚂蚁捡起数据后该区域信息熵值
E2)
return-1;
///计算当前节点对应区域的熵值(比如一个3*3区域的9个节点对应的熵值)
当前蚂蚁所处节点<
type"
求取熵的类型,1表示原始区域的熵;
2表示添加一个数据对象后计算的熵值;
3表示删除某一个数据对象后计算的熵值<
dataInOrOut"
type=1时,dataInOrOut=null;
type=2或type=3时,dataInOrOut为一个数据对象<
doublegetE(NodenodeIn,inttype,dataObjdataInOrOut)
nodeT=nodeIn.getNearByNodes1(gridN);
//存储附近节点
List<
Node>
nodeN=newList<
nodeN.Add(nodeIn);
k)
dataObj>
dataN=newList<
k)//循环节点
if(type==3)//将某一个数据对象排除
j)//循环各节点的数据对象
if(nodeN[k].datalst[j].myID!
=dataInOrOut.myID)
dataN.Add(nodeN[k].datalst[j]);
//将当前影响到的所有数据对象放在一起
if(type==1)//计算原有的所有数据对象的熵
//将当前影响到的所有数据对象放在一起
if(type==2)//添加一个数据对象
dataN.Add(dataInOrOut);
//计算熵值
introwC=dataN.Count;
doublesumC=0;
//最终熵值
//对一个m*n的二维矩阵(dataN)进行运算,对各个元素频率之和求和。
k)//对各个属性进行循环
Single[]dataCol=newSingle[rowC];
rowC;
dataCol[j]=dataN[j].atrLst[k];
//二维矩阵(dataN)的i列
sumC=getSm(dataCol);
returnsumC;
///计算一个一维矩阵的各元素频率和
data"
privatedoublegetSm(Single[]data)
intcrow=data.Length;
dataM>
datadis=newList<
dataMdt=newdataM();
dt.dataN=data[0];
dt.num=1;
datadis.Add(dt);
for(inti=1;
data.Length;
intind=hasB(data[i],datadis);
if(ind!
datadis[ind].num=1;
else
dataMdb=newdataM();
db.dataN=data[i];
db.num=1;
datadis.Add(db);
doublesm=0;
doubletp=0;
datadis.Count;
tp=(double)datadis[i].num/crow;
tp=tp*Math.Log(tp);
sm=tp;
returnsm;
//查询在datadis中是否有data
privateinthasB(Singledata,List<
datadis)
if(data==datadis[j].dataN)
returnj;
///根据位置计算节点在NodeAll中的ID
privateintgetNodeId(intx,inty)
inta=x*gridNy;
return(a);
classdataM
publicSingledataN;
publicintnum;
}
Ant.cs文件:
///蚂蚁类
classAnt
publicNodeNodePosition;
//蚂蚁位置
publicboolisFull=false;
//蚂蚁负载状态,默认没有负载
publicdataObjnowData;
//当前蚂蚁负载的数据对象
Node.cs文件:
namespace
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 源代码