- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2011-2012第二学期
《算法设计与分析》期末考核
项目名称:运动员最佳配对问题
1. 项目描述( 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 比之前的最优值大,则更新 最
优值和配对顺序,回溯完成后则可得到最大总和及其相应的运动员配对方法让男队 员
按自己编号顺序站定,女运动员和他们搭配的各种组合就是女运动员的各种排列。因 此,
搜索的解空间树是 “排列树 ”。用回溯法搜索排列树的算法框架:
void backtrack (int t)
{
if (tn)
output(x);
else
for (int i=f(n,t);i=g(n,t);i++)
{
x[t]=h(i);
if (constraint(t)bound(t)) backtrack(t+1);
}
}
程序( 50 分)
方法一:分支限界法程序
# include stdio.h
# include stdlib.h
# define HeapSize 60
typedef struct
{
int n; // 男运动员个数
int ** p; // 男运动员竞赛优势
int ** q; // 女运动员竞赛优势
}Sport;
typedef struct
{
int w[20]; // 一种排列
int t; // 已排到的位数
int val; // 此种排列的配对和
}Node;
typedef struct minheap
{
int last; // 此时的元素个数
int maxsize; // 堆中的元素最大个数
Node * heep;
}Minheap, * Heap;
// 建大根堆
void MaxHeapInit (Heap H)
{
H = (Heap) malloc ( sizeof (Minheap));
H-maxsize = HeapSize;
H-last = 0;
H-heep = (Node *) malloc ((H-maxsize
文档评论(0)