华为软件精英挑战赛2016题解

代码:https://github.com/jinhang/2016_Huawei_SoftWareMatch

前言

赛题源自“未来网络”业务发放中的路由计算问题。算路问题属于基础算法问题,在图论、网络、交通等各个方面均有着广泛的研究与运用,里面不乏一些经典的算法,例如最短路中的广度优先搜索,Dijkstra算法等。网络算路问题的更优算法实现对于网络资源高效配置具有重要价值。

本次大赛分为初赛复赛总决赛三个主要阶段,当前为总决赛/复赛阶段。

总决赛/复赛赛题描述

1 问题定义

给定一个带权重的有向图G=(V,E),V为顶点集,E为有向边集,每一条有向边均有一个权重。对于给定的顶点s、t,以及V的子集V’和V’’,寻找从s到t的两条不成环的有向路径P’和P’’,使得P’经过V’中所有的顶点,而P’’经过V’’中所有的顶点(对P’经过V’中顶点的顺序以及P’’经过V’’中顶点的顺序不做要求)。

若不同时存在这样的两条有向路径,则输出无解,程序运行时间越短,则视为结果越优; 若同时存在这样的两条有向路径,则输出得到的两条路径,按下列优先级从高到低评价结果优劣:

1、 路径P’和P’’重合的有向边个数越少,则视为结果越优;

2、 在两条路径重合的有向边个数一样的情况下,两条路径权重总和越少,则视为结果越优;

3、 在上述两个指标一样的情况下,程序运行时间越短,则视为结果越优。

说明:

1)图中所有权重均为[1,100]内的整数;

2)任一有向边的起点不等于终点;

3)连接顶点A至顶点B的有向边可能超过一条,其权重可能一样,也可能不一样;

4)该有向图的顶点不会超过2000个,每个顶点出度(以该点为起点的有向边的数量)不超过20;

5)V’和V’’中元素个数均不超过100,交集为空,且不包含起始顶点s和终止顶点t;

6)从s到t的不成环有向路径P是指,P为由一系列有向边组成的从s至t的有向连通路径,且不允许重复经过任一顶点;

7)路径的权重是指所有组成该路径的所有有向边的权重之和(重复边的权重应分别在两条路径中各计算一次)。

2 输入与输出

输入文件格式

以两个.csv文件(csv是以逗号为分隔符的文本文件)给出输入数据,一个为图的数据(G),一个为需要计算的路径信息(s,t,V’,V’’)。文件每行以换行符(ASCII’\n’即0x0a)为结尾。

1)图的数据中,每一行包含如下的信息:

LinkID,SourceID,DestinationID,Cost

其中,LinkID为该有向边的索引,SourceID为该有向边的起始顶点的索引,DestinationID为该有向边的终止顶点的索引,Cost为该有向边的权重。顶点与有向边的索引均从0开始编号(不一定连续,但用例保证索引不重复),顶点索引范围在[0,2000),有向边索引范围在[0,40000)。

2)路径信息中,只有一行如下数据:

DemandID,SourceID,DestinationID,IncludingSet

其中,DemandID里面第一行为1,第二行为2,表示路径索引,1表示P’,2表示P’’,SourceID为起始顶点s的索引,DestinationID为终止顶点t的索引,IncludingSet表示必须经过的顶点集合V’或V’’,其中不同的顶点索引之间用“ | ”分割,如果该路径没有必经顶点要求,则此处输入NA。

输出文件格式

输出文件同样为一个.csv 文件。

1)如果该测试用例存在满足要求的有向路径P’和P’’,则输出两行信息,第一行按P’经过的有向边顺序,依次输出有向边的索引,索引之间用“ | ”分割;第二行按P’’经过的有向边顺序依次输出有向边的索引,索引之间用“ | ”分割;

2)如果该测试用例不同时存在两条满足要求的有向路径P’和P’’,则只输出一行信息:NA;

3)每一行只允许输出最多一条有向路径,以换行符0x0a结尾。

3 单个用例的评分机制

有解用例的排名机制

按下面流程对参赛者结果进行排名:

Step1: 对于提交的结果,进行合法性检验(详见题目描述);

Step2: 程序运行时间不得超过10s;

若不满足上述的结果则本用例得分为0;

Step3: 路径P’和P’’重合的有向边个数(不考虑权重)越少,排名越优;

Step4: 在路径P’和P’’重合的有向边个数一样的情况下,计算P’和P’’的权重和,权重越小,排名越优;

Step5: 在上述两个指标一样的情况下,用程序运行时间细化排名,时间越短,排名越优。

无解用例的排名机制

按下列流程对参赛者结果进行排名:

Step1: 对于提交的结果,验证是否识别出该用例无解,若无法识别或者程序运行时间超10s,则本用例得分为0;

Step2: 用程序的运行时间进行排名,时间越短,排名越优。

单个用例的评分标准如下:

根据上面排名流程得到的排名,使用标准分计分(排名第一的提交者为100分)。

若所有人均未得到正确结果,则所有人均得分为0。

4 网站系统判分机制

复赛阶段官方网站开放接收复赛程序提交,系统平台会使用N个测试用例在线判题,参赛者对于每个测试用例都会得到一个百分制分数,使用算术平均分为该参赛者的最终得分,并展示在各区域复赛排行榜中。

特别说明:复赛阶段的在线判题评分及排行仅供参赛者参考,不纳入最终复赛成绩。

5 简单用例说明

在如上图所示的有向图中,我们会得到下面的有向图信息:

0,0,1,1

1,1,2,1

2,2,3,1

3,1,4,1

4,4,3,1

5,0,5,1

6,5,2,1

如果此时需要寻找从0到3的路径P’和P’’,且P’必须经过顶点1,P’’必须经过顶点2,相应的路径信息文件内容为:

1,0,3,1

2,0,3,2

对于该用例,可以找到如下两组解:

0|1|2

5|6|2

以及

0|3|4

5|6|2

由于第一组解两条路径的重合边个数为1,第二组解两条路径的重合边个数为0。所以此时最优解应该是0|3|4,5|6|2。

6 复赛赛制说明

各区域晋级复赛队伍为32-36队,复赛采用分区域现场竞赛的形式开展,共分成三个小阶段:

1、 排位赛:区域现场复赛当天,各区域将通过一个官方用例对进入复赛队伍提交的程序进行判题评分并排序,排序前8名的队伍将作为下一个阶段分组赛8个小组的种子队,其余队伍通过抽签方式进行分组。

2、 分组赛:区域共分8个小组,各小组采用单循环对战方式竞赛,通过积分(每场比赛胜得3分,平各得1分,负得0分)进行小组排序,排序前2名的队伍小组出线进入下一阶段的淘汰晋级赛。

3、 淘汰晋级赛:各小组出线队伍组成16强,分成上下半区进行两两对战淘汰晋级赛,分为“1/8决赛→1/4决赛→半决赛→决赛”,最后决出区域4强进入全国总决赛。

两队对战规则说明:

1、 复赛分组赛和淘汰晋级赛均采用两队对战的形式,每场对战9局5胜。(分组赛胜积3分,负积0分,平各积1分,最后排序积分相同情况下,排位赛成绩靠前者胜出;淘汰赛出现平局,则由官方提供用例“加时赛”决出胜负);

2、 对战双方(如红方、蓝方)各需提供2个自设计用例,官方提供5个用例,共9个用例分9局进行对战,用例发放顺序为:红方1→蓝方1→红方2→蓝方2→官方1→官方2→官方3→官方4→官方5;

3、 每局对战中,如由于己方提供用例导致自己计算不出,则该局对方自动胜出,其余依据“单个用例评分机制”判定胜负。

7 总决赛赛制说明

各区域复赛前四名共32支队伍晋级总决赛,总决赛采用现场竞赛的形式开展,共分成三个小阶段:

1、 排位赛:总决赛当天,组委会将通过两个官方比赛用例对进入总决赛赛队伍提交的程序进行判题评分并排序。各参赛队根据排位赛评分排名进行分档,1-8名定为种子队(第一档),9-16名为第二档,17-24名为第三档,25-32名为第四档。排位赛排名仅供分组赛抽签使用,不影响参赛队伍最终排名;

2、 分组赛:全国32强共分8个小组,分组过程采用抽签进行,种子队抽签至A1-H1位置,第二档队伍抽签至A2-H2位置,第三档队伍抽签至A3-H3位置,第四档队伍抽签至A4-H4位置,形成小组赛分组。各小组采用单循环对战方式竞赛,通过积分(每场比赛胜得3分,平各得1分,负得0分)进行小组排序,排序前2名的队伍小组出线进入下一阶段的淘汰晋级赛。如遇积分相同情况,将根据“净胜局多-胜负关系占优-上传时间早”的优先级进行排序;

3、 淘汰晋级赛:各小组出线队伍组成16强,分成上下半区进行两两对战淘汰晋级赛,分为“1/8决赛→1/4决赛→半决赛→决赛”,最后决出全国总冠军。

两队对战规则说明:

1、 总决赛分组赛和淘汰晋级赛均采用两队对战的形式,每场对战9局5胜。(分组赛允许出现平局,淘汰赛出现平局,则 “上传时间早”的队伍胜出);

2、 对战双方(如红方、蓝方)各需提供2个自设计用例,官方提供5个用例,共9个用例分9局进行对战,用例发放顺序为:红方1→蓝方1→红方2→蓝方2→官方1→官方2→官方3→官方4→官方5;

3、 每局对战中,如由于己方提供用例导致自己计算不出,则该局对方自动胜出。官方提供用例如双方均未计算出正确路径,则双方均不得分。其余依据“单个用例评分机制”判定胜负。

8 关于参赛队自行生成对战测试用例的说明

由官方在复赛阶段提供若干完整用例作为选手生成用例的素材,选手可自行编辑用例(如删增顶点、有向边、必经顶点、修改起始终止顶点等),或完全自行设计用例,只需保证用例符合题目要求且有解。官方将通过大赛网站给进入复赛的参赛队开放用例设计工具。

9 总决赛/复赛注意事项

1、 核心算法禁止使用第三方代码;

2、 如参考有论文或第三方代码,必须在readme文件中提供来源说明;

3、 针对所有用例必须使用同一个算法和同一套代码实现。

初赛赛题描述

1 问题定义

给定一个带权重的有向图G=(V,E),V为顶点集,E为有向边集,每一条有向边均有一个权重。对于给定的顶点s、t,以及V的子集V‘,寻找从s到t的不成环有向路径P,使得P经过V‘中所有的顶点(对经过V‘中节点的顺序不做要求)。

若不存在这样的有向路径P,则输出无解,程序运行时间越短,则视为结果越优;若存在这样的有向路径P,则输出所得到的路径,路径的权重越小,则视为结果越优,在输出路径权重一样的前提下,程序运行时间越短,则视为结果越优。

说明:

1)图中所有权重均为[1,20]内的整数;

2)任一有向边的起点不等于终点;

3)连接顶点A至顶点B的有向边可能超过一条,其权重可能一样,也可能不一样;

4)该有向图的顶点不会超过600个,每个顶点出度(以该点为起点的有向边的数量)不超过8;

5)V‘中元素个数不超过50;

6)从s到t的不成环有向路径P是指,P为由一系列有向边组成的从s至t的有向连通路径,且不允许重复经过任一节点;

7)路径的权重是指所有组成该路径的所有有向边的权重之和。

2 输入与输出

输入文件格式

以两个.csv 文件(csv 是以逗号为分隔符的文本文件)给出输入数据,一个为图的数据(G),一个为需要计算的路径信息(s,t,V‘)。文件每行以换行符(ASCII‘\n‘即0x0a)为结尾。

1)图的数据中,每一行包含如下的信息:

LinkID,SourceID,DestinationID,Cost

其中,LinkID 为该有向边的索引,SourceID 为该有向边的起始顶点的索引,DestinationID为该有向边的终止顶点的索引,Cost 为该有向边的权重。顶点与有向边的索引均从0 开始 编号(不一定连续,但用例保证索引不重复)。

2)路径信息中,只有一行如下数据:

SourceID,DestinationID,IncludingSet

其中,SourceID 为该路径的起点,DestinationID 为该路径的终点,IncludingSet 表示必须经过的顶点集合V‘,其中不同的顶点索引之间用‘|‘分割。

输出文件格式

输出文件同样为一个.csv 文件。

1)如果该测试用例存在满足要求的有向路径P,则按P 经过的有向边顺序,依次输出有向边的索引,索引之间用‘|‘分割;

2)如果该测试用例不存在满足要求的有向路径P,则输出两个字符NA;

3)只允许输出最多一条有向路径。

3 单个用例的评分机制

有解用例的排名机制

按下面流程对参赛者结果进行排名:

Step1: 对于提交的结果,进行合法性检验(详见题目描述);

Step2: 程序运行时间不得超过10s;

若不满足上述的结果则本用例得分为0;

Step3: 计算提交的路径的权重,权重越小,排名越优;

Step4: 在权重相同的结果里,用程序运行时间进行排名,时间越短,排名越优。

无解用例的排名机制

按下列流程对参赛者结果进行排名:

Step1: 对于提交的结果,验证是否识别出该用例无解,若无法识别或者算法运行时间超10s,则本用例得分为0;

Step2: 用程序的运行时间进行排名,时间越短,排名越优。

单个用例的评分标准如下:

根据上面排名流程得到的排名,使用标准分计分(排名第一的提交者为100分)。

若所有人均未得到正确结果,则所有人均得分为0。

4 最终得分机制

平台会使用N个测试用例判题,该N个测试用例分为初级、中级、高级三个等级,参赛者对于每个测试用例都会得到一个百分制分数,使用加权平均分(初级权重为0.2,中级权重为0.3,高级权重为0.5)作为该参赛者的最终得分。

特别说明:在比赛初期,平台只放出初级、中级的测试用例,故此时满分为50分,在比赛后期,才会放出高级测试用例(具体发放时间会在网站公告通知),此时满分才为100分,请各位参赛者注意。

5 简单用例说明

在如上图所示的有向图中,我们会得到下面的有向图信息:

0,0,1,1

1,0,2,2

2,0,3,1

3,2,1,3

4,3,1,1

5,2,3,1

6,3,2,1

如果此时需要寻找从0到1的路径,且必须经过顶点2和3,我们会得到如下的路径信息:

0,1,2|3

对于该用例,可以找到如下两条可行路径:

1|5|4

2|6|3

由于第一条路径的权重为4,第二条路径的权重为5,所以此时最优解应该1|5|4。

运行环境

CPU:Intel Xeon CPU E5-2690 V2 @ 3.00GHz

内存:2G

内核:单核

编译器:gcc 4.8.4;java 1.7.0_95;

操作系统:linux Ubuntu 14.04.3 LTS 64位,内核版本 Linux version 3.13.0-24-gineric

SDK:为方便选手做题,分别提供c++(兼容c)和Java SDK包供参考(见赛题下载包),详细描述信息请见SDK目录下的readme.txt。

时间: 2024-10-07 10:57:03

华为软件精英挑战赛2016题解的相关文章

<路径算法>哈密顿路径变种问题(2016华为软件精英挑战赛初赛)

原创博客,转载请联系博主! 前言:几天前华为的这个软件精英(算法外包)挑战赛初赛刚刚落幕,其实这次是我第二次参加,只不过去年只入围到了64强(32强是复赛线),最后搞到了一个华为的一顶帽子(感谢交大某妹纸快递寄过来!),今年小较了一把真,幸运地闯进了排行榜.(第17位的就是我们Team噢!耶鲁顾神很给力!)    所以呢,回到正题首先来看一下初赛赛题吧! 初赛赛题要求 已知有向图G的拓扑(结点V,边E)和V的一个子图V’,在G内求一条从start结点到end结点的路径,要求经过V’的所有结点并且

德州扑克 2015 华为软件精英挑战赛

概述 华为2015软件挑战赛比赛总结,跟队友当时奋斗了15天吧,最后差点进32强了,第三轮遇到的对手太厉害,止步64强了.这次官方提供 Ubuntu 纯命令行镜像和庄家 Server,选手编写德州扑克选手机器人程序互相 PK(8人一组)500轮后钱多者胜出.运行只要运行华为提供的ne">dist_check_and_run.sh 脚本 即可,里面会给自动运行每个game程序.最近快要找工作了一些项目还是要总结一下的,感觉欠缺的地方还是有很多的,下面进入正题. 梳理一下主干主要这次比赛项目主

华为软件精英挑战赛【德州扑克】心得体会

这是华为举办的一个软件竞赛,华为提供一个德州扑克台桌的server,我们要根据牌型等因素,给出出牌的策略,类似模拟牌手的程序.从知道挑战的题目到提交最终版本的程序中间只有一个月的时间,刚看到这个题目一点头绪没有,看了论文有用蒙特卡洛模拟,决策树等,各种没听过的词汇,感觉写出这个程序会很难,和我一个教研室的小伙伴们看到这个题目的时候陆续都放弃了. 思考了半天我也放弃了,因为接下来几个星期还有实习的面试和小论文等着我完成,就这样过了2个星期,期间我把小论文与实习面试都完成了,在一天早晨无意中又点开了

华为2017软件精英挑战赛初赛源码

2017年三月底四月初跟实验室的小伙伴一起参加了华为的软件精英挑战赛,可惜实力不济,止步于赛区64强,还是倒数几名...... 我们使用了模拟退火+spfa最大流最小费用算法,通过上百次迭代,获取近似解. 核心代码如下: package com.cacheserverdeploy.deploy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.H

2017华为软件精英大赛复赛体验及最终代码

踉踉跄跄进入复赛,复赛题目出来的那一天,结点数最多10000,边最多10000.感觉我的费用流肯定要崩了啊:都有点想弃赛的冲动: 但是缓了几天之后,还是准备试一试,不能给学校丢人啊,到最后一个0分多尴尬: 复赛最大的变化就是服务器有了带宽上限,这点其实不难解决,计算费用流的时候每次加服务器不再提供无限流聊,提供最大档的流量不就可以了,但是这么做出来的结果cost一直很大:改了好久都没有解决: 还有遇到的参赛以来最大的困难就是输出路径那一块了,初赛的时候也听说好几个人输出路径有问题,搞了好几天,我

华为软件精英大赛复赛体验及最终代码

踉踉跄跄进入复赛,复赛题目出来的那一天,结点数最多10000,边最多10000.感觉我的费用流肯定要崩了啊:都有点想弃赛的冲动: 但是缓了几天之后,还是准备试一试,不能给学校丢人啊,到最后一个0分多尴尬: 复赛最大的变化就是服务器有了带宽上限,这点其实不难解决,计算费用流的时候每次加服务器不再提供无限流聊,提供最大档的流量不就可以了,但是这么做出来的结果cost一直很大:改了好久都没有解决: 还有遇到的参赛以来最大的困难就是输出路径那一块了,初赛的时候也听说好几个人输出路径有问题,搞了好几天,我

德州扑克AI简介——2015华为软件精英赛小结

2015华为软件精英挑战赛的比赛目的是设计德州扑克比赛的牌手程序,采用的是无限注的比赛规则.具体比赛规则见下面链接.在接到这个赛题之初,我们做的第一件事情是熟悉德州扑克的比赛规则,并尽可能去寻找现有的开源项目或者程序.具体来说,着手点主要有四点:维基.论文.比赛和开源项目. 首先阅读的是维基,这里参考的主要是英文的维基百科.通过维基百科,大致了解了德州扑克的发展历史和现状,并且得知在现在每年的都会有人与机器的德州扑克比赛和机器与机器之间的德州扑克比赛.此外,通过维基百科,还了解到当前主流学术界对

2017华为软件挑战赛总结

2017华为软件挑战赛总结 这次比赛是去年做的, 自己之前没有总结,现在才开始总结,很多东西快想不起来了,真是惭愧 赛题主要内容和目的 初赛题目和内容 给你一个流网络(边有容量和单位流量费用),已知有一些节点有流量需求(消费节点),现要选一些节点部署服务器(服务节点),给消费节点传输流量,使得在满足所有消费节点流量需求的条件下,最小化成本(服务器购买成本+线路流量费用) 服务器输出能力无上限,一个服务节点可以服务多个消费节点,一个消费节点也可以从多个服务节点获取流量 每台服务器的购买成本均相同

华为软件开发云测评报告一:项目管理

体验环境 体验方式:PC端 系统:Windows 64位 浏览器类型:Chrome浏览器 浏览器版本:49.0.2623.110 m 体验时间:2017.05.11 测试目的 了解华为软件开发云的项目管理服务功能,分析其优缺点: 瀑布化开发到敏捷开发的转型分析,以及未来软件开发模式的发展方向: 产品简介 产品名称:华为软件开发云 定位:软件开发云(DevCloud)是集华为研发实践.前沿研发理念.先进研发工具为一体的研发云平台,面向开发者提供研发工具服务,让软件开发简单高效. 产品slogan: