⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ant_sparse.cpp

📁 我根据书上算法自编的蚁群程序
💻 CPP
字号:

#include "Ant_sparse.h"
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#include <stdio.h>

double const alpha=0.8;
double const c=0.0001;
double const Q=20;
double const p=0.80;
double const a0=1;
double const keeplus=10;


double Ant_sparse::myrand()
{	
srand(time(0));
double my[100];
ccdi++;
if (ccdi==100) 
ccdi=0;
for(int mi=0;mi<100;mi++)
{double fav=rand()%10000;
my[mi]=fav/10000;}
return my[ccdi];
}

double Ant_sparse::f_xy_val(double a)
{
	double temp=0.0;
	
	//temp=pow(a,2)+3*pow(a,2)-9*a;此函数已验证成功
	temp=-cos(a)+(a+2)*sin(a+3);
	return temp;
}

Ant_sparse::Ant_sparse()
{

	ccdi=-1;//应用于myrand(),,应是全局变量................
	xy_num=2;
	block_num=20.0;
	ant_num=20;	

	maxscope=5.0;	
	minscope=-5.0;	
	xx=yy=1;

	int i,j;
	
	for(i=0;i<=block_num;i++)//第k个蚂蚁
	{
		 ant_k_val[i]=0;
	}
    for(i=0;i<=block_num;i++)	
		{
			phe[i]=c;
			//tabu[i]=i;
		}
     for(i=0;i<=block_num;i++)				
		block[i]=(maxscope-minscope)/block_num*i+minscope;	
}

Ant_sparse::~Ant_sparse()
{

}

void Ant_sparse::ant_trans()
{
	 int i,j,k,can,maxT0=0,maxT1=0;
	 double sumaffect2,maxT0_T,maxT1_T,sumpk,pr;

	 double ant_ptrans[21],change_phe[21];   
	 int kmax=0,ggmax=0;
	 double maxphe=0,f_max_k=0;
	
	int tabu[21];
	
	for(i=0;i<=block_num;i++)
		tabu[i]=i;
	for(i=0;i<=block_num;i++)
		change_phe[i]=0;
	for(k=0;k<ant_num+1;k++)
		ant_k_val[k]=0;

	
     
	for(k=0;k<ant_num+1;k++)
	{
		sumaffect2=0;
		 for(i=0;i<=block_num;i++)		
			 sumaffect2+=phe[i];
		 for(i=0;i<=block_num;i++)	
			 ant_ptrans[i]=phe[i]/sumaffect2;	
	

		if(myrand()>0.8)
		 {
			 //pr=rand()%10000/10000.0;
		     pr=myrand();
			 sumpk=0.0;
			     can=-1;
		tocan:     can++;		
				 //if(can==m_ant+1)can=0;
				 sumpk+=ant_ptrans[can];
				 if(sumpk>=pr)
				 {
					 tabu[k]=can;
					 phe[tabu[k]]=(1-p)*phe[tabu[k]]+p*c;
				 }
				 else goto tocan;
				
		 }
		 else
		 {
			 for(int gg=0;gg<ant_num+1;gg++)
				 if(phe[gg]>=maxphe)
				 {
					 maxphe=phe[gg];
					 ggmax=gg;
				 }
				 tabu[k]=ggmax;	
				 phe[tabu[k]]=(1-p)*phe[tabu[k]]+p*c;
		 }

	}

	
	for(k=0;k<=ant_num;k++)
	{
		ant_k_val[k]=f_xy_val(block[tabu[k]]); //改成一维函数试试
		f_max_k=ant_k_val[0];
		if(ant_k_val[k]<=f_max_k)
		{
			f_max_k=ant_k_val[k];
			kmax=k;
		}
	}
		
	//for(k=0;k<ant_num+1;k++)	
		//change_phe[tabu[k]]+=Q/(ant_k_val[k]+keeplus);
	
	change_phe[tabu[kmax]]+=1.0/(ant_k_val[kmax]+keeplus);

	//for(i=0;i<=block_num;i++)					
		//phe[i]=(1-alpha)*phe[i]+alpha*change_phe[i];	 	
	phe[tabu[kmax]]=(1-alpha)*phe[tabu[kmax]]+alpha*change_phe[tabu[kmax]];

     maxT0_T=0;
	 for(i=0;i<ant_num+1;i++)
	 {		 
		 if(phe[i]>maxT0_T)
		 {
			 maxT0_T=phe[i];
			 maxT0=i;
		 }
	 }	
	 
	 printf("信息素行:%-d  最大信息素:%-13.4f\n",maxT0,maxT0_T); 
	 printf("参数值:%-13.4f  最小函数值:%-13.4f\n",block[maxT0],f_xy_val(block[maxT0]));
		 	
}


void Ant_sparse::Ant_sparse_algo()
{
	double  max_mf1=0;
	double  max_mf2=0;
	double m_max=1e-4;

	int time=0;
	int select0=0;
	int select1=0;

	while(time<50)//////////现在考虑随迭代次数增加,但是值不变化,
		         
	{        
		printf("迭代次数:%d\n",time+1);		
		ant_trans();
		for(int i=0;i<ant_num+1;i++)
			printf("%13.4f",phe[i]);
		printf("\n");

		

		time++;
	}
	//cout<<"max="<<max_mf2<<endl;		
	
}


void Ant_sparse::disp()
{

		
	stupid_method();
		

}





void Ant_sparse::try_rand()
{
	

	stupid_method();
	cout<<"max="<<max_max<<endl;
	cout<<"min="<<min_min<<endl;
	

}

void Ant_sparse::stupid_method()
{
	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -