33,008
社区成员
发帖
与我相关
我的任务
分享
#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);
}