- 156.55 KB
- 2022-09-27 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
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