运动员最佳配对问题--实验报告

申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

文档介绍

运动员最佳配对问题--实验报告

2011-2012第二学期《算法设计与分析》期末考核项目名称:运动员最佳配对问题\n1.项目描述(10分)羽毛球队有男女运动员各n人。给定2个n×n矩阵P和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势;Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势。由于技术配合和心理状态等各种因素影响,P[i][j]不一定等于Q[j][i]。男运动员i和女运动员j配对组成混合双打的男女双方竞赛优势为P[i][j]*Q[j][i]。设计一个算法,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。编程任务:设计一个算法,对于给定的男女运动员竞赛优势,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。2.算法设计(10分)方法一:优先队列式分支限界法具体算法:算法开始时创建一个最大堆,用于表示活结点优先队列堆中每个结点的val值是优先队列的优先级。接着算法计算出图中每个顶点的最大val。如果搜索到所搜索的排列树的叶子节点,算法即告结束。方法二:回溯法具体算法:套用排列树框架,做好初始化后开始回溯,关键在于到达叶子节点时,需要计算当前的总和csum+=p[i][w[i]]*q[w[i]][i],若发现csum比之前的最优值大,则更新最优值和配对顺序,回溯完成后则可得到最大总和及其相应的运动员配对方法让男队员按自己编号顺序站定,女运动员和他们搭配的各种组合就是女运动员的各种排列。因此,搜索的解空间树是“排列树”。用回溯法搜索排列树的算法框架:voidbacktrack(intt){if(t>n)output(x);elsefor(inti=f(n,t);i<=g(n,t);i++){x[t]=h(i);if(constraint(t)&&bound(t))backtrack(t+1);}}程序(50分)方法一:分支限界法程序#include#include#defineHeapSize60\ntypedefstruct{intn;//男运动员个数int**p;//男运动员竞赛优势int**q;//女运动员竞赛优势}Sport;typedefstruct{intw[20];//一种排列intt;//已排到的位数intval;//此种排列的配对和}Node;typedefstructminheap{intlast;//此时的元素个数intmaxsize;//堆中的元素最大个数Node*heep;}Minheap,*Heap;//建大根堆voidMaxHeapInit(Heap&H){H=(Heap)malloc(sizeof(Minheap));H->maxsize=HeapSize;H->last=0;H->heep=(Node*)malloc((H->maxsize+1)*sizeof(Node));}//插入大根堆voidHeapInsert(Nodex,HeapH){inti;if(H->last==H->maxsize){printf("堆已满!!\n");exit(0);}i=++H->last;while(i!=1&&x.val>H->heep[i/2].val){H->heep[i]=H->heep[i/2];i/=2;}H->heep[i]=x;\n}//取大根堆的根,并保持堆的性质voidDeleteMax(HeapH,Node*x){inti,ci;Nodey;if(H->last==0){printf("空堆!!!\n");exit(0);}*x=H->heep[1];y=H->heep[H->last--];i=1;ci=2;while(ci<=H->last){if(cilast&&(H->heep[ci+1].val>H->heep[ci].val))ci++;if(H->heep[ci].valheep[i]=H->heep[ci];i=ci;ci*=2;}H->heep[i]=y;}//计算配对和voidCompute(Sport&S,Node&T){T.val=0;for(inti=0;ilast!=0)//当堆为空时结束循环{DeleteMax(H,&fNode);if(fNode.t==S.n-1)//为一个全排列时,比较节点内值是否比当前最优值更佳{if(best#includetypedefstruct{int**p;//男运动员竞赛优势int**q;//女运动员竞赛优势int*w;//排列编号int*best;//最好的排列编号intn;//男运动员个数intbestsum;//最好的配对和}Sport;voidSwap(int&a,int&b){intt;t=a;a=b;b=t;}//计算运动员的配对和voidCompute(Sport&S){intsum=0;for(inti=0;iS.bestsum){S.bestsum=sum;for(inti=0;i=S.n)Compute(S);elsefor(inti=t;i
查看更多

相关文章