1、计算机网络布线问题编号: 数学与计算科学学院创新性实验结题报告书实验题目: 计算机网络布线问题 实验成绩(教师填写): 学 院: 数学与计算科学学院 专 业: 信息与计算科学 姓名学号: 张稳华 0800710128 曾 强 0800710127 何明注 0800710111 指导教师: 唐敏 2011 年 04月 15日一、实验目的及主要创新性点:实验目的: 1 编制计算机程序解决问题;2 算法设计问题(理论问题:最短路径)结合实际的网络应用;3 解决该问题要有创新思想,积极思考解决问题的各种方法,试图和实际的网络中的应用相结合。创新:遗传算法是一种基于概率意义的随机搜索算法,它的思想是构造
2、一个问题的解的初代种群,经过选择,交叉和变异产生新的最优解集种群。遗传算法的特点具有自组织、自适应和自学习性,遗传算法提供了一种求解复杂系统优化问题的通用框,在工程设计、演化硬件电路设计以及人工智能等方面应用前景广阔。二、实验要求:1 提出解决该问题的各种方法;2 编制计算机程序解决问题;3 要与实际的网络应用结合起来。三、实验内容计算机网络要求网络中的计算机被连接起来。本问题考虑一个“线性”的网络,在这一网络中计算机被连接到一起,并且除了首尾的两台计算机只分别连接着一台计算机外,其他任意一台计算机恰连接着两台计算机。图1中用黑点表示计算机,它们的位置用直角坐标表示(相对于一个在图中未画出的坐
3、标系)。网络中连接的计算机之间的距离单位为英尺。由于很多原因。我们希望使用的电缆长度应尽可能地短,你的问题是去决定计算机应如何被连接以使你所用的电缆长度最短。在设计方案施工时,电缆将埋在地下,因此连接两台计算机所要用的电缆总长度等于计算机之间的距离加上额外的16英尺电缆,以从地下连接到计算机,并为施工留一些余量。图2给出了上图中计算机的最优连接方案,这样一个方案所有电缆的总长度是(4+16)+(5+16)+(5.38+16)+(11.18+16)=90.01英尺。图1图2四、实验解决方法通过实验内容,我们知道,本次实验要满足两个条件:一是所用的电缆长度最短;二是除了首尾的两台计算机只分别连接着
4、一台计算机外,其他任意一台计算机恰连接着两台计算机。我们想到了几种解决方法:1、 基于全排列的穷举法 穷举法也叫枚举法或列举法。通常对于一些要求得到精确结果而所求结果又不大的时候可用此法,具体的做法就是将所有可能的情况一一举出。穷举法就是举例,用无穷个数字进行实验,直到达到得出规律或者结果时候为止。此题因点数限制在8个,具有可行性。2、 把其看作是一个图的遍历,每个点只访问一次,有且仅有n-1条边。3、 最小生成树,考虑到最小生成树一个点可访问多于二个点,因此在构造最小生成树时,需要多加一个限制条件,以控制每个点被访问一次。4、 此问题也可看作成旅行商问题,因旅行商问题,从起点出发最后又回到起
5、点,此问题不需要回到起点,因此也可以用旅行商问题方面的方法进行求解。也可以看成找到一个欧拉回路,再去掉回路中最长的一条边。5、递归算法 递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。在使用递归策略时,必须有一个明确的递归结束条件,而本题中这个条件就是最短路径。6、遗传算法 遗传算法(Genetic Algorithm)是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 本次实验,我们小组将采用基于全排列的穷举法和遗传算法来求解问题。五、实验原理基于全
6、排列的穷举法。穷举法肯定能找出最短路径,不过怎样进行穷举呢?本文采用基于全排列的穷举。从n个不同元素中任取m(mn)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当mn时所有的排列情况叫全排列。只要全排列的算法可行,那么问题可得到求解。本文采用递归算法进行全排列,再在全排列中求解最短路径。便可得到精确解。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的
7、集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学遗传算子(geneticoperators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,
8、末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。遗传算法的特点:遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,主要有以下特点:1、 遗传算法以决策变量的编码作为运算对象。传统的优化算法往往直接决策变量的实际植本身,而遗传算法处理决策变量的某种编码形式,使得我们可以借鉴生物学中的染色体和基因的概念,可以模仿自然界生物的遗传和进化机理,也使得我们能够方便的应用遗传操作算子。2、 遗传算法直接以适应度作为搜索信息,无需导数等其它辅助信息。3、 遗传算法使用多个点的搜索信息,具有隐含并行性。4、 遗传算法使用概率搜索技术,而非确定性规则。六、实
9、验步骤1 开发环境配置安装Microsoft Visual c+ 6.02 程序流程图 图3 遗传算法程序流程图步1 在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc和变异率Pm,代数T;步2 随机产生U中的N个染色体s1, s2, , sN,组成初始种群S=s1, s2, , sN,置代数计数器t=1;步3 计算S中每个染色体的适应度f() ;步4 若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。步5 按选择概率P(xi)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1; 步6 按交叉率Pc所决定
10、的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;步7 按变异率Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;步8 将群体S3作为新一代种群,即用S3代替S,t=t+1,转步3;3 详细设计程序设计:程序的设计用的是Microsoft Visual c+ 6.0编写的。基于全排列的穷举法: #include #include #include using namespace std;/定义文件输入,用于测试时输入方便/ ifstream fin(in.txt);/
11、 #define cin fin#define N 8 /计算机最大的台数int m=0; /递归时用到,设为全局int sum; /当前计算机总的台数int a40321N+1; /用于存储全排列/*int a = new int40321N+1;*/存储坐标struct point int x,y;pointerN+1;/对几个点进行全排列,采用递归算法void perm(int* num, int i) int j, k, tmp; if( i sum ) for( j=i; ji ; k-) numk = numk-1; numi = tmp; perm(num, i+1); for(
12、 k=i; kj ; k+ ) numk = numk+1; numj = tmp; else / 此次排列 for( j=1; j=sum ; j+ ) amj = numj;/* cout amj ;*/ m+;/* cout sum ;*/ int numN+1; int i ; int *num = new intsum+1; float shortdistance40321=0; float reslut=1172; for( i=1; i=sum ; i+ ) numi = i; perm(num, 1); for ( i=1 ; i pointeri.x pointeri.y ;
13、 / for ( i=1 ; i=sum ; i+)/ / cout pointeri.x pointeri.y endl ;/ delete(num);/释放空间void search() int i,j; float distanceN+1N+1=0; float shortdistance40321=0; float reslut=1172; /8个点最长距离 int record=1; /距离邻接矩阵 for ( i=1 ; i=sum ; i+ ) for ( j=1 ; j=sum ; j+ ) distanceij = Distance( pointeri , pointerj
14、);/* cout distanceij ;*/ /* cout endl ;*/ /由sum计算循环次数 int count=1; for ( i=1;i=sum;i+) count *= i ; /* cout count: count endl ;*/ for ( i=0 ; icount ; i+ ) for ( j=1 ; jsum ; j+ ) shortdistancei += distance aij aij+1 + 16; / cout aij aij+1 endl; if ( shortdistancei = reslut ) reslut = shortdistancei
15、 ; /最小距离的排列/ for ( j=1 ; j=sum ; j+ )/ / cout aij ;/ / cout 1 ; j- ) / cout arecordj ; cout Cable requirement to connect ; cout ( pointerarecordj.x ,pointerarecordj.y ); cout to ( pointerarecordj-1.x ,pointerarecordj-1.y ) ; cout is 16+Distance( pointerarecordj , pointerarecordj-1 ) feet. endl ; cou
16、t Number of feet of cable required is ; cout reslut endl sum & sum!=0 ) input(); cout * endl ; cout Network # +n endl; search(); return 0; 遗传算法的代码如下:#include #include #include #include #include #include #include using namespace std;/ ifstream fin(in.txt);/ ofstream fout(out.txt);/ #define cin fin/#d
17、efine cout fout/ 变异概率 #define MUTATION_RATE 0.2/ 杂交概率#define CROSSOVER_RATE 0.75/ 基因组数目#define POP_SIZE 40/ 为2的倍数#define NUM_BEST_TO_ADD 2/ 产生随机数inline int RandInt(int x,int y) return rand()%(y-x+1)+x;inline double RandFloat() return (rand()/(RAND_MAX+1.0);/ 计算机坐标结构struct CoOrd float x,y; CoOrd(); C
18、oOrd(float a, float b):x(a),y(b);/ 基因组结构struct SGenome / 连接计算机间的路径(基因组) vector vecPC; / 适应分数 double dFitness; / 构造函数 SGenome():dFitness(0) SGenome(int nc): dFitness(0) vecPC = GrabPermutation(nc); / 创建计算机间随机的一条路径 vector GrabPermutation(int &limit); / 在GrabPermutation函数中使用 bool TestNumber(const vecto
19、r &vec, const int &number);/ 遗传算法类class CgaTSPprivate: / 计算机坐标向量 vector m_vecPCCoOrds; vector m_vecPopulation; vector m_savevecPC; double m_dMutationRate; double m_dCrossoverRate; / 整个种子群体的总适应性分 double m_dTotalFitness; / 在此之前找到的最短路径 double m_dShortestRoute; / 把所有代中的最短路径保存起来 double m_saveShortestRout
20、e; / 最长路径 double m_dLongestRoute; / 种子群中的基因组数目 int m_iPopSize; / 染色体数目 int m_iChromoLength; / 新一代中适应分最高的成员 int m_iFittestGenome; / 表明已经到了那一代 int m_iGeneration; / 交换变异 void MutateEM(vector &chromo); / 部分匹配杂交 void CrossoverPMX(const vector &mum, const vector &dad, vector &baby1, vector &baby2); SGenom
21、e& RouletteWheelSelection(); / 计算计算机之间连接路径的长度 double GetTourLength(const vector &route); void CalculatePopulationsFitness(); void CalculateBestWorstAvTot(); void Reset(); void CreateStartingPopulation(); / 计算两个计算之间的长度 double CalculateA_to_B(const CoOrd &PC1, const CoOrd &PC2); / 建立坐标 void CreateCoOr
22、d(); public: / 构造函数 CgaTSP(double mut_rat, double cross_rat, int pop_size, int NumPC ):m_dMutationRate(mut_rat), m_dCrossoverRate(cross_rat), m_iPopSize(pop_size), m_iFittestGenome(0), m_iGeneration(0), m_dShortestRoute(999999999), m_saveShortestRoute(999999999), m_dLongestRoute(0), m_iChromoLength(
23、NumPC) / 建立坐标 CreateCoOrd(); / 清除基因组生成新的基因组 CreateStartingPopulation(); CgaTSP() / 把所有的遗传算法的步骤进行合并到一个函数 void Epoch(); void Show();/*/ 随机生成一个基因并返回vector SGenome:GrabPermutation(int &limit) vector vecPerm; for (int i=0; ilimit; i+) / 0到limint-1为计算机的序号 int NextPossibleNumber = RandInt(0, limit-1); / 向量
24、中存在随见生成的序号就在生成一次 while(TestNumber(vecPerm, NextPossibleNumber) NextPossibleNumber = RandInt(0, limit-1); / 把新生成的序号放进向量 vecPerm.push_back(NextPossibleNumber); / 返回基因 return vecPerm;/ 测试number是否已经存在向量中bool SGenome:TestNumber(const vector &vec, const int &number) for (int i=0; ivec.size(); +i) if (veci
25、 = number) return true; return false;/ 计算路径长度和适应性分void CgaTSP:CalculatePopulationsFitness() / 对于每组基因计算路径长度 for (int i=0; im_iPopSize; +i) / 计算计算机间路径的总长度 double TourLength = GetTourLength(m_vecPopulationi.vecPC); m_vecPopulationi.dFitness = TourLength; if (TourLength m_dShortestRoute) m_dShortestRoute = TourLength; / 代表适应性分最高的成员 m_iFittestGenom
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1