首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-09-20 
求热心高手帮忙修改C语言代码,是关于退火算法的!我是在一道作业题,好不容易做出来了,但是代码有点问题!求

求热心高手帮忙修改C语言代码,是关于退火算法的!
我是在一道作业题,好不容易做出来了,但是代码有点问题!求帮忙呀。。。
题目:
在一个直径为100km的圆内,随机均匀分布着200个通信基站,基站信号能覆盖的范围22km内的圆形区域。为避免信号干扰,相邻基间频道不能相同。为保证正常通信,给每个基站分配一个信道,使得整个网络内的基站使用的频道数量最少。
代码如下:

C/C++ code
#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);}


[解决办法]
地图着色问题?
[解决办法]
这样的成熟算法,最好现成的已经反复验证过的。

热点排行