ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:18.74KB ,
资源ID:8208188      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8208188.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(蚁群算法源代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

蚁群算法源代码.docx

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