求热心高手帮忙修改C语言代码,是关于退火算法的!
我是在一道作业题,好不容易做出来了,但是代码有点问题!求帮忙呀。。。
题目:
在一个直径为100km的圆内,随机均匀分布着200个通信基站,基站信号能覆盖的范围22km内的圆形区域。为避免信号干扰,相邻基间频道不能相同。为保证正常通信,给每个基站分配一个信道,使得整个网络内的基站使用的频道数量最少。
代码如下:
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define N 200//200个通信基站int ping[N];//用数字来表示不同的频率int discard[N];//表示用频率i的个数,discard[i]表示频率利用频率i的基站数目int x[N],y[N];//200个点的坐标int lei=N;//记录一共用了的频率类型void create()//初始化每个点的频率{ int i; //生成可行解 for(i=0;i<N;i++) { ping[i]=i; discard[i]=1;//表示这个频率是要用的 }}void init_location(){ srand(time(0)); //圆以(0,0)为中心 int k=0; while(k<N) { int a=rand()%200; int b=rand()%200; if(a*a+b*b<10000)//表示在圆内 { x[k]=a; y[k++]=b; if((k+1)%10==0) printf("\n");// printf("(%d,%d) ",a,b); } }}int kexing(int a,int b)//将a点的频率变成b后是否是可行解{ int flag=1; for(int i=0;i<N;i++) { if(i==a) continue; int dis; dis=pow(x[i]-x[a],2)+pow(y[i]-y[a],2); if(dis>22*22) continue; if(ping[i]==ping[b]) { flag=0; return flag; } } return flag;}void tuihuo(){ double T=10,afa=0.99,e=pow(0.1,30); int M=2000000;// printf("\n%d",pow(2,4)); int k=0;//迭代次数 srand(time(0)); while(k<M&&T>e) { //生成新方案 int a=rand()%N; int b=rand()%N;//第a个点的频率变成b if(!kexing(a,b)) continue; //生成了可行解,如果把a原先的频率废弃掉,看看能否减少频率种类 if(discard[ping[a]]==1&&discard[b]!=0)//如果a原先的频率只有一个基站使用,b频率有人使用 //将a的频率换成b时,减少了频率的种类 { lei--; discard[ping[a]]--; discard[b]++;//使用b频率的增加一个 ping[a]=b; } else { int c=rand(); double detaf; if(discard[ping[a]]>1&&discard[b]==0)//a原先的频率有很多基站使用,b频率没有使用,改变后增加频率种类 { detaf=-1; lei++; } else detaf=0;//其他情况都是没有改变种类 //现在按概率接受解决方法 if(exp(-detaf/T)>c)//按概率接受新方法 { discard[ping[a]]--; discard[b]++; ping[a]=b; } } T=T*afa; } for(int i=0;i<N;i++) { if(i%10==0) printf("\n"); printf("%d ",ping[i],discard[ping[i]]); }}void main(){ create(); init_location(); tuihuo(); printf("\n"); printf("\n\n一共用频率 %d 种!\n\n",lei);}