1、蚁群算法源代码基本思想:基于LF算法的改进,将蚂蚁的拾起和放下策略用蚂蚁周围数据的信息熵的改变来判断,基于的事实为“包含聚类的子空间的信息熵比不包含聚类的信息熵小”。form1.cs文件:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.OleDb;using System.Diagnostics
2、;namespace AntClust public partial class Form1 : Form public Form1() InitializeComponent(); int tMax = 30000; /最外层迭代次数 int antC = 50; /蚂蚁数 int gridN = 30; /网格维数,gridN*gridN int atrCount = 4; /数据对象属性个数 List nodeAll=new List (); /所有节点集合 List antAll=new List (); /所有蚂蚁集合 List dataObjAll=new List ();/所有数
3、据对象集合 private void Form1_Load(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e) /从数据库读取数据 String connectionString = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb; OleDbConnection connection = new OleDbConnection(connectionString); OleDbDataAdapter ad = new Ol
4、eDbDataAdapter(select * from Iris, connection); DataSet ds = new DataSet(); ad.Fill(ds); /生成节点 for (int i = 0; i gridN; i ) for (int j = 0; j gridN; j ) nodeAll.Add(new Node (i,j); /生成蚂蚁 for (int i = 0; i antC; i ) antAll.Add(new Ant (); /生成数据对象 atrCount =ds.Tables0.Columns .Count-1 ; for (int i = 0
5、; i ds.Tables0.Rows.Count; i ) Single datatemp = new SingleatrCount; for (int j = 0; j atrCount; j ) datatempj = Convert .ToSingle (ds.Tables0.Rowsij 1.ToString(); dataObjAll.Add(new dataObj(ds.Tables0.RowsiID.ToString(), datatemp); /初始化数据对象和蚂蚁的位置 initPosition(); /主体迭代 Cacu(); /输出结果 for (int i = 0;
6、i dataObjAll.Count; i ) Debug.Write(dataObjAlli.myID.ToString() ,); Debug.Write(dataObjAlli.NodePosition.Px.ToString() ,); Debug.Write(dataObjAlli.NodePosition.Py.ToString() ,); Debug.WriteLine(); MessageBox.Show(请查看结果!); private void initPosition() /初始化数据对象的位置 Random rd = new Random(); for (int i =
7、 0; i dataObjAll.Count; i ) int tempP =(int)( rd.NextDouble() * nodeAll.Count); dataObjAlli.NodePosition = nodeAlltempP; nodeAlltempP.datalst.Add(dataObjAll i); /初始化蚂蚁的位置 rd = new Random(); for (int i = 0; i antAll.Count ; i ) int tempP = (int)(rd.NextDouble() * nodeAll.Count); antAlli.NodePosition
8、= nodeAlltempP; antAlli.isFull = false; antAlli.nowData = null; for (int i = 0; i dataObjAll.Count; i ) Debug.Write(dataObjAlli.myID.ToString() ,); Debug.Write(dataObjAlli.NodePosition.Px.ToString() ,); Debug.Write(dataObjAlli.NodePosition.Py.ToString() ,); Debug.WriteLine(); Debug.WriteLine(=); /主体
9、计算过程 int tp = 0; double E1; double E2; private void Cacu() List nodeT = new List(); List nodeN = new List(); List dataN = new List(); for (int t = 0; t tMax; t ) /最外层循环 for (int i = 0; i antAll.Count; i ) /计算蚂蚁周围节点数据对象总数 nodeT = antAlli.NodePosition.getNearByNodes1(gridN);/蚂蚁周围节点列表 nodeN.Clear(); no
10、deN.Add(antAlli.NodePosition); /记录当前区域所有节点 int tempIndex = 0; for (int k = 0; k nodeT.Count; k ) tempIndex = getNodeId(nodeTk.Px, nodeTk.Py); nodeN.Add(nodeAlltempIndex); int sum = 0; dataN.Clear(); for (int k = 0; k nodeN.Count; k ) for (int j = 0; j 0) /蚂蚁所在节点数据对象数目m0 /判断蚂蚁所在节点数据对象数目m与蚂蚁周围节点数据对象数目
11、n之和 if (antAlli.NodePosition.hasData() = 1) & (sum = 0) /m=1&n=0 /蚂蚁捡起所在节点数据 antAlli.isFull = true; antAlli.nowData = antAlli.NodePosition.datalst0;/* antAlli.NodePosition.datalst.RemoveAt(0); /Debug.WriteLine(m=1&n=0,捡起); /else if (antAlli.NodePosition.hasData() = 1) & (sum = 1) | (antAlli.NodePosi
12、tion.hasData() = 2) & (sum = 0) /m=1&n=1或者m=2&n=0 / / /蚂蚁不捡起所在节点数据 / /Debug.WriteLine(m=1&n=1或者m=2&n=0,不捡起); / else if (dataNum = 3) /m n=3 /计算信息熵,判断是否捡起 /tempE = getE(antAlli.NodePosition,1,null ); tp = getSelNode(antAlli.NodePosition); if (tp != -1) antAlli.isFull = true; antAlli.nowData = antAlli
13、.NodePosition.datalsttp;/* antAlli.NodePosition.datalst.RemoveAt(tp); /Debug.WriteLine(存在可以捡起的数据(捡起后信息熵减小),捡起); /else / / /Debug.WriteLine(不存在可以捡起的数据,不捡起); / /else if (antAlli.NodePosition.hasData() = 0) /蚂蚁所在节点数据对象数目m=0 / / /Debug.WriteLine(m=0,节点无数据对象,不处理); / else if (antAlli.isFull = true) /蚂蚁负载的
14、情况 /判断蚂蚁所在节点数据对象数目m与蚂蚁周围节点数据对象数目n之和 /if (dataNum = 0) /m n=0 / / /蚂蚁不放下携带的数据 / /Debug.WriteLine(m n=0,不放下数据); / if (dataNum = 1) /m n=1 /蚂蚁放下携带的数据 antAlli.isFull = false; /antAlli.nowData = null; antAlli.NodePosition.datalst.Add(antAlli.nowData); /更新数据对象位置 dataObjAllgetid(antAlli.nowData.myID).NodeP
15、osition = antAlli.NodePosition; /Debug.WriteLine(m n=1,放下数据); else if (dataNum = 2) /m n=2 /计算信息熵,判断是否放下 E1 = getE(antAlli.NodePosition, 1, antAlli.nowData); E2 = getE(antAlli.NodePosition, 2, antAlli.nowData); if (E1 E2) /MessageBox.Show(down); antAlli.isFull = false; /antAlli.nowData = null; antAl
16、li.NodePosition.datalst.Add(antAlli.nowData); /更新数据对象位置 dataObjAllgetid(antAlli.nowData.myID).NodePosition = antAlli.NodePosition; /Debug.WriteLine(蚂蚁放下数据后信息熵减小,放下数据); /else / / /Debug.WriteLine(蚂蚁放下数据后信息熵增大,不放下数据); / /移动蚂蚁 Random rd = new Random(); int tempP = (int)(rd.NextDouble() * nodeAll.Count)
17、; antAlli.NodePosition = nodeAlltempP; private int getid(string idin) for (int i = 0; i dataObjAll.Count; i ) if (dataObjAlli.myID = idin) return i; return Convert .ToInt32 ( idin); private int getIdInDataAllFromIDtemp(string id) for (int i = 0; i dataObjAll.Count; i ) if (dataObjAlli.myID = id) ret
18、urn i; return Convert .ToInt32 ( id); / / 蚂蚁在当前节点所拿起的数据对象 / / / private int getSelNode(Node nodeIn) double E1; double E2; E1 = getE(nodeIn, 1, null);/蚂蚁捡起数据前的信息熵值 for (int i = 0; i nodeIn.datalst.Count; i ) E2 = getE(nodeIn, 3, nodeIn.datalsti);/蚂蚁捡起数据后该区域信息熵值 if (E1 E2) return i; return -1; / / 计算当
19、前节点对应区域的熵值(比如一个3*3区域的9个节点对应的熵值) / / 当前蚂蚁所处节点 / 求取熵的类型,1表示原始区域的熵;2表示添加一个数据对象后计算的熵值;3表示删除某一个数据对象后计算的熵值 / type=1时,dataInOrOut=null;type=2或type=3时,dataInOrOut为一个数据对象 / double getE(Node nodeIn, int type,dataObj dataInOrOut) List nodeT = nodeIn.getNearByNodes1(gridN);/存储附近节点 List nodeN=new List (); nodeN.
20、Clear(); nodeN.Add(nodeIn); /记录当前区域所有节点 int tempIndex = 0; for (int k = 0; k nodeT.Count; k ) tempIndex = getNodeId(nodeTk.Px, nodeTk.Py); nodeN.Add(nodeAlltempIndex); List dataN=new List (); for (int k = 0; k nodeN.Count; k ) /循环节点 if (type = 3) /将某一个数据对象排除 for (int j = 0; j nodeNk.datalst.Count; j
21、 ) /循环各节点的数据对象 if (nodeNk.datalstj.myID != dataInOrOut.myID) dataN.Add(nodeNk.datalstj);/将当前影响到的所有数据对象放在一起 if (type = 1) /计算原有的所有数据对象的熵 for (int j = 0; j nodeNk.datalst.Count; j ) /循环各节点的数据对象 dataN.Add(nodeNk.datalstj); /将当前影响到的所有数据对象放在一起 if (type = 2) /添加一个数据对象 dataN.Add(dataInOrOut); /计算熵值 int row
22、C = dataN.Count ; double sumC = 0; /最终熵值 /对一个m*n的二维矩阵(dataN)进行运算,对各个元素频率之和求和。 for (int k = 0; k atrCount;k ) /对各个属性进行循环 Single dataCol = new SinglerowC; for (int j = 0; j rowC; j ) dataColj = dataNj.atrLstk; /二维矩阵(dataN)的i列 sumC = getSm(dataCol); return sumC ; / / 计算一个一维矩阵的各元素频率和 / / / private doubl
23、e getSm(Single data) int crow = data.Length; List datadis = new List(); dataM dt=new dataM() ; dt.dataN = data0; dt.num = 1; datadis.Add(dt); for (int i = 1; i data.Length; i ) int ind=hasB(datai, datadis) ; if (ind != -1) datadisind.num = 1; else dataM db=new dataM() ; db.dataN = datai; db.num = 1;
24、 datadis.Add(db); double sm=0; double tp = 0; for (int i = 0; i datadis.Count; i ) tp=(double ) datadisi.num / crow; tp = tp * Math.Log(tp); sm = tp; return sm; /查询在datadis中是否有data private int hasB(Single data, List datadis) for (int j = 0; j datadis.Count; j ) if (data = datadisj.dataN) return j; r
25、eturn -1; / / 根据位置计算节点在NodeAll中的ID / / private int getNodeId(int x, int y) int a=x * gridN y ; return (a); class dataM public Single dataN; public int num; Ant.cs文件:using System;using System.Collections.Generic;using System.Text;namespace AntClust / / 蚂蚁类 / class Ant public Node NodePosition; /蚂蚁位置 public bool isFull=false ; /蚂蚁负载状态,默认没有负载 public dataObj nowData; /当前蚂蚁负载的数据对象 Node.cs文件:using System;using System.Collections.Generic;using System.Text;namespace
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1