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

📄 strict16_nonblocking.c

📁 源文件为个人用于优化环形网络的遗传算法程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   strictly-ring----16 Traffics    */
///////////// Load other traffic: from the heaviest to the lightest///////////////
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<time.h>

#define ESC 27
#define ERRORLEVEL 0.01
#define nTraffics 2
#define PopSize 200 
#define MaxGens 500
#define Granularity 48
#define PXover 0.6
#define PMutation 0.4
#define RunTime 1
#define ITEMS 8

int pack_ring(int, int, int, int, int);
void swap(int*, int*);
void initiate(void);
void crossover(void);
void mutation(void);
void load_count(int);
void distribute(int,int);
void distribute_ring(int,int);
void search_split_ring(int ,int ,int );
int temp_traffic[nTraffics][16*15],load[16*15][nTraffics][16*15];// used for distribute traffic,n,split_traffic[16*15][nTraffics][16*15]
int ring[16*15][16], traffic[nTraffics][16*15];
int fitness[PopSize*2][2], pop[PopSize*2][16*15],split_list[nTraffics][1000];
int in_load[16], out_load[16], node_load[nTraffics][16], line_load[16];
int NVars, nNodes, max_split, NTemp, nWave, count, max_line_load[nTraffics],listpoint;
int I[16*15], J[16*15], temp_node[16*15][16], ns[16*15], Lij[16][16], K[16][16];
int g;

int main()
{
 FILE *fp1, *fp2;
 if((fp2=fopen("16traffic.txt", "r"))==NULL)
 {
	 printf("can't open file 2traffic.txt\n");
	 exit(1);
 }

	for(nNodes=16; nNodes>=16; nNodes--)
	{
 register int i, j, k;
 double avemaxgen, avemax[2],run_time, L[nTraffics], ftemp;
 int max[RunTime][2], maxgen[RunTime], maxmax[2], mingen; 
 int p, gen, display, l, run, temp, m, temp_split;
 int max_line, min_Waves, max_Waves, min_ADMs, max_ADMs, nADMs;// max_node,
 clock_t start_finish;

 if((fp1=fopen("strict16nonblocking.res", "a"))==NULL)
 {
	 printf("can't open file re16andor.res\n");
	 exit(1);
 }

   start_finish = clock();
  printf("nNodes=%d \n", nNodes); 
 NVars=nNodes*(nNodes-1);
 NTemp=nNodes*(nNodes-1);

 for(k=0; k<nTraffics; k++)
	 for(i=0; i<NVars; i++)
	   fscanf(fp2, "%d", &traffic[k][i]);
  for(k=0; k<NVars/2; k++)
  {
	  temp=k+1;
	  for(i=0; i<nNodes; i++)
	  {  temp=temp-nNodes+i+1; if(temp<=0) break;  }
	  j=nNodes+temp-1;
	  I[k]=i; J[k]=j; K[i][j]=k;
  }
  for(k=NVars/2; k<NVars; k++)
  {
	  temp=k-NVars/2+1;
	  for(i=1; i<nNodes; i++)
      {  temp=temp-i;  if (temp<=0) break;  }
	  j=temp+i-1;
	  I[k]=i; J[k]=j; K[i][j]=k;
  }

   for(i=0; i<nNodes-1; i++)
   {   Lij[i][i]=0;
	   for(j=i+1; j<nNodes; j++)
	   {
		   Lij[i][j]=j-i;
		   Lij[j][i]=nNodes-j+i;
	   }
   }
   for(m=0; m<nTraffics; m++)
   {
	  L[m]=0;
	  for(k=0; k<NVars; k++)
	  {
		  i=I[k]; j=J[k];
		  L[m]=L[m]+Lij[i][j]*traffic[m][k];
	  }
	  L[m]=2.0*L[m]/nNodes/NVars;
   }

   ftemp=L[0];  temp=0;
   for(m=0; m<nTraffics; m++)
   {
	  if(L[m]>ftemp)
	  {
		  ftemp=L[m];  temp=m;
	  }
   }
   if(temp)
   {
	   L[temp]=L[0];  L[0]=ftemp;
	   for(i=0; i<NVars; i++)
		   swap(&traffic[0][i], &traffic[temp][i]);
   }

   for(m=0; m<nTraffics; m++)
   {
	   load_count(m);
   }

 fprintf(fp1, "%d nodes strictly nonblocking with traffic=%d and g=%d.\n", nNodes, nTraffics, Granularity);

 max_line=max_line_load[0];
 for(m=1; m<nTraffics; m++) if(max_line<max_line_load[m]) max_line=max_line_load[m];
 min_Waves=(max_line+Granularity-1)/Granularity; 
 max_Waves=NVars/2;
 max_ADMs=NVars;
 min_ADMs=ceil((min_Waves+sqrt(4*NVars*min_Waves+min_Waves*min_Waves))/2.0);
  fprintf(fp1, "Maximum possible ADM's: %d \n", max_ADMs);
  fprintf(fp1, "Minimum possible ADM's: %6.2f \n", min_ADMs);
  fprintf(fp1, "Maximum possible Wavelengths: %d \n", max_Waves);
  fprintf(fp1, "Minimum possible Wavelengths: %d \n", min_Waves);

  for(run=0; run<RunTime; run++)
  { 

  max[run][0]=10000; max[run][1]=10000;
  display=10;
  initiate();
	temp_split=0;
  /* begin evolution  */
for(k=0; k<NVars; k++)
	  for(i=0; i<nNodes; i++)
		  ring[k][i]=0;
  //对每个个体进行操作
	for(k=0;k<NVars;k++)
	  for(m=0; m<nTraffics; m++)
		for(l=0; l<nNodes; l++)
	  	  load[k][m][l]=0;

  for(p=0; p<PopSize; p++)
  {	
	nWave=0; nADMs=0;listpoint=0;max_split=0;
  for(k=0; k<nTraffics; k++)
	 for(i=0; i<NVars; i++)	
	 {temp_traffic[k][i]=traffic[k][i];split_list[k][i]=0;}
		
for(l=0;l<240;l++)
	for(m=0;m<nTraffics;m++)
		for(k=0;k<240;k++)
			load[l][m][k]=0;

 distribute(p,min_Waves);
 
	  //NVars=nNodes*(nNodes-1);
 
  for(k=0; k<nWave; k++)
	  for(i=0; i<nNodes; i++)
		  if(ring[k][i]) { nADMs++; ring[k][i]=0;  }

  fitness[p][0]=nADMs; fitness[p][1]=nWave;
  if(temp_split<max_split) temp_split=max_split;
  } // end of for(p=0...)
 
  //对计算得到的种群进行杂交变异;
  for(gen=1; gen<MaxGens; gen++)
  {
	  //	 printf("Generation=%d\n", gen);

  crossover();
  mutation();

  for(p=PopSize; p<count; p++)
  { 
	  nWave=0; nADMs=0;listpoint=0;max_split=0;
   for(k=0; k<nTraffics; k++)
	 for(i=0; i<NVars; i++)
		{temp_traffic[k][i]=traffic[k][i];split_list[k][i]=0;}
for(l=0;l<240;l++)
	for(m=0;m<nTraffics;m++)
		for(k=0;k<240;k++)
			load[l][m][k]=0;

	distribute(p,min_Waves);
	
/*for(i=0;i<nWave;i++)
	for(m=0; m<nTraffics; m++)
	    for(l=0; l<nNodes; l++) 
	if(load[i][m][l]<0||load[i][m][l]>16) 
		printf("load[%d][%d][%d]=%d",i,m,l,load[i][m][l]);*/
//split();

  for(k=0; k<nWave; k++)
	  for(i=0; i<nNodes; i++)
		  if(ring[k][i]) { nADMs++; ring[k][i]=0;  }

  fitness[p][0]=nADMs; fitness[p][1]=nWave;
 if(temp_split<max_split) temp_split=max_split;
  } // end of for(p=PopSize...)
 
  // order the fitness and select the PopSize hightest tifness (least AMD's and Wavelengths) individuals

  for(i=0; i<PopSize; i++)
	  for(j=i+1; j<count; j++)
        if(fitness[i][0]>fitness[j][0])
		{
			swap(&fitness[i][0], &fitness[j][0]);
			swap(&fitness[i][1], &fitness[j][1]);
			for(k=0; k<NVars; k++)
			   swap(&pop[i][k], &pop[j][k]); 
		}
		else if(fitness[i][0]==fitness[j][0])
		{
			if(fitness[i][1]>fitness[j][1])
			{
			swap(&fitness[i][1], &fitness[j][1]);
			for(k=0; k<NVars; k++)
			   swap(&pop[i][k], &pop[j][k]);
			}
		}

  // calculation of the average number

  if(max[run][0]>fitness[0][0])
  {
	  max[run][0]=fitness[0][0];
	  max[run][1]=fitness[0][1];
	  maxgen[run]=gen;
  }
  else if(max[run][0]==fitness[0][0])
  {
 	  if(max[run][1]>fitness[0][1])
	  {
	  max[run][1]=fitness[0][1];
	  maxgen[run]=gen;
	  }
  }

  if(gen*100==display*MaxGens)
	 { printf("run=%d, %d%% finished\n", run, display); display+=10;  }
  } //end of for(gen...)
 
  fprintf(fp1, "max_split:  %d, ", temp_split);
  } // end of for(run...)

  fprintf(fp1, "\n");
  avemaxgen=0.0; avemax[0]=0.0; avemax[1]=0.0;
  maxmax[0]=max_ADMs; maxmax[1]=max[0][1]; mingen=MaxGens;

  for(run=0; run<RunTime; run++) 
  {
	  avemaxgen+=maxgen[run];
	  avemax[0]+=max[run][0];
	  avemax[1]+=max[run][1];
	  if(mingen>maxgen[run]) mingen=maxgen[run];
	  if(maxmax[0]>max[run][0])
	  {
		  maxmax[0]=max[run][0];
		  maxmax[1]=max[run][1];
	  }
	  else if(maxmax[0]==max[run][0])
	  {
		  if(maxmax[1]>max[run][1])
		  maxmax[1]=max[run][1];
	  }
  }
	  avemaxgen=avemaxgen/RunTime;
	  avemax[0]=avemax[0]/RunTime;
	  avemax[1]=avemax[1]/RunTime;

  // output

 
  fprintf(fp1, "Minimum ADMs of each run:  ");
  ftemp=0.0;
  for(i=0; i<RunTime; i++)
  {
	  fprintf(fp1, "%d, ", max[i][0]);
	  ftemp+=(max[i][0]-avemax[0])*(max[i][0]-avemax[0]);
  }
  ftemp/=(RunTime+1);
  ftemp=sqrt(ftemp);
  fprintf(fp1, "\nAVE_ADMs:  %4.2lf, MIN_ADMs:  %d, ", avemax[0], maxmax[0]);
  fprintf(fp1, "VAR_ADMs: %6.4lf\n", ftemp);
  fprintf(fp1, "Minimum Wavelengths of each run:  ");
  ftemp=0.0;
  for(i=0; i<RunTime; i++)
  {
	  fprintf(fp1, "%d, ", max[i][1]);
	  ftemp+=(max[i][1]-avemax[1])*(max[i][1]-avemax[1]);
  }
  ftemp/=(RunTime+1);
  ftemp=sqrt(ftemp);
  fprintf(fp1, "\nAVE_Waves:  %4.2lf, MIN_Waves:  %d, ", avemax[1], maxmax[1]);
  fprintf(fp1, "VAR_Waves: %6.4lf\n", ftemp);
  fprintf(fp1, "Gen of Minimum ADMs is in:  ");
  ftemp=0.0;
  for(i=0; i<RunTime; i++)
  {
	  fprintf(fp1, "%d, ", maxgen[i]);
	  ftemp+=(maxgen[i]-avemaxgen)*(maxgen[i]-avemaxgen);
  }
  ftemp/=(RunTime+1);
  ftemp=sqrt(ftemp);
  fprintf(fp1, "\nAve-Gen:  %8.2lf, Min-gen: %d", avemaxgen*200, mingen*200);
  fprintf(fp1, "VAR_Gen: %8.2lf\n\n", ftemp*200);

  start_finish=clock()-start_finish;
  run_time = (double)(start_finish) / CLOCKS_PER_SEC;
  fprintf(fp1, "Running time: %6.4lf\n\n", run_time);

  fclose(fp1);

  } //end of for(nNodes=....)
  fclose(fp2);
  printf("End of the program.\n\n");
  return(1);

 }     /*     end of main function     */

void initiate(void)
{
  int i, j, k, g, temp;
  for(i=0; i<PopSize*2; i++)
  {
      k=i;
	  for(j=0; j<NVars; j++)
	  {
		  if(k>=NVars) k=0;
		  pop[i][j]=k++;
	  }
  }  
   for(g=0; g<PopSize*2; g++)
	  for(k=0; k<NVars/2; k++)
	  {
		  i=rand()%NVars;
		  j=rand()%NVars;
		  temp=pop[g][i];
		  pop[g][i]=pop[g][j];
		  pop[g][j]=temp;
	  }
 
} 

 void swap(int *i, int *j)
 {
  int temp;
  temp=*i; *i=*j; *j=temp;
 }

 void crossover(void)
 {
  int pop1, pop2;
  int point1, point2;
  int i, j, g, num, num2, temp;
  int index1[16*15], index2[16*15];
//  int order1[16*15], order2[16*15];
  double prob;
  count=PopSize;
  for(i=0; i<PopSize; i+=2)
  {
	  prob=(rand()%1000)/1000.0;
	  if(prob<PXover)
	  {
		  pop1=rand()%PopSize;
		  while((pop2=rand()%PopSize)==pop1);
		  point1=(rand()%(NVars-1))+1;
		  while((point2=(rand()%(NVars-1))+1)==point1);
		  if(point1>point2)
		  { temp=point1; point1=point2; point2=temp; }
		  for(j=point1; j<point2; j++)
		  {
			  pop[count][j]=pop[pop2][j];
			  pop[count+1][j]=pop[pop1][j];
		  }
		  for(j=0; j<point1; j++)
		  {
			  pop[count][j]=pop[pop1][j];
			  pop[count+1][j]=pop[pop2][j];
		  }
		  for(j=point2; j<NVars; j++)
		  {
			  pop[count][j]=pop[pop1][j];
			  pop[count+1][j]=pop[pop2][j];
		  }
		  num=0;
		  for(j=point1; j<point2; j++)
		  {
			  for(g=point1; g<point2; g++){
				  if(pop[pop2][j]==pop[pop1][g])
					  break;
			  }
				  if(g==point2)
					  index1[num++]=pop[pop2][j];
		  }
		  num2=0;
		  for(j=point1; j<point2; j++)
		  {
			  for(g=point1; g<point2; g++){
				  if(pop[pop1][j]==pop[pop2][g])
					  break;
			  }
				  if(g==point2)
					  index2[num2++]=pop[pop1][j];
		  }
		  if(num!=num2)
			  printf("Alarming num!=num2");
		  for(j=0; j<num-1; j++){
			  for(g=j+1; g<num; g++)
			  {
				  if(index1[j]<index1[g])
				  { temp=index1[j]; index1[j]=index1[g]; index1[g]=temp; }
				  if(index2[j]<index2[g])
				  { temp=index2[j]; index2[j]=index2[g]; index2[g]=temp; }
			  }
		  }
    		for(g=0; g<num; g++)
			{
				for(j=0; j<point1; j++){
					if(pop[pop1][j]==index1[g])
					{
						pop[count][j]=index2[g];
						break;
					}
				}
			if(j==point1)
				for(j=point2; j<NVars; j++){
				if(pop[pop1][j]==index1[g])
				{
					pop[count][j]=index2[g];
					break;
				}
				}
			}
		count++;
		for(g=0; g<num; g++)
		{
			for(j=0; j<point1; j++){
				if(pop[pop2][j]==index2[g])
				{
					pop[count][j]=index1[g];
					break;

⌨️ 快捷键说明

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