求热心高手帮忙修改C语言代码,是关于退火算法的!

yingzijuntuan 2012-06-23 04:45:32
我是在一道作业题,好不容易做出来了,但是代码有点问题!求帮忙呀。。。
题目:
在一个直径为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);
}
...全文
176 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnmhx 2012-08-14
  • 打赏
  • 举报
回复
这样的成熟算法,最好现成的已经反复验证过的。
knate 2012-08-12
  • 打赏
  • 举报
回复
地图着色问题?
yingzijuntuan 2012-08-12
  • 打赏
  • 举报
回复
差不多就是那个意思吧!我用的是退火算法做的,但是结果有点问题,能帮忙看看么?

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧