https://github.com/mindawei/cdn
2017华为软件精英挑战赛初赛、复赛、决赛代码。(最终排名总决赛第14名)
https://github.com/mindawei/cdn
dijkstra game huawei java min-cost-flow zkw
Last synced: 2 months ago
JSON representation
2017华为软件精英挑战赛初赛、复赛、决赛代码。(最终排名总决赛第14名)
- Host: GitHub
- URL: https://github.com/mindawei/cdn
- Owner: mindawei
- Created: 2017-03-12T09:19:34.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-01-28T06:22:02.000Z (over 7 years ago)
- Last Synced: 2025-07-14T18:44:09.733Z (3 months ago)
- Topics: dijkstra, game, huawei, java, min-cost-flow, zkw
- Language: Java
- Homepage:
- Size: 14.4 MB
- Stars: 16
- Watchers: 1
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
cdn 2017华为软件精英挑战赛初赛、复赛、决赛代码
---
# 概览
赛题《大视频时代•布局》背景如下,摘自[2017年比赛官网](http://codecraft.huawei.com/):
>在给定结构的G省电信网络中,为了视频内容快速低成本的传送到每个住户小区,需要在这个给定网络结构中选择一些网络节点附近放置视频内容存储服务器。需要解决的问题是:在满足所有的住户小区视频播放需求的基本前提下,如何选择视频内容存储服务器放置位置,使得成本最小。该比赛要求参赛者在指定时间内给出一种视频服务器的部署方案,满足消费者的需求并使得成本最小。因为指定时间内无法算出结果,所以比拼的是:初始解、搜索策略、算法优化。比赛过程如下表所示。
|阶段 | 项目 | 比赛经过|赛题变化|解题思路|
| --- | -- | ------ | ----- | ---------- |
|初赛 | cdn1 |赛区第32,前36进入复赛| 赛题如表前所述 |先用dijkstra算法求粗糙解,再用最小费用最大流求精确解|
|复赛 | cdn2 |赛区第3,前4进入总决赛|1)服务器具有10个等级的输出能力
2)节点有部署费用|1) 先用dijkstra算法求粗糙解,再用zkw算法求精确解
2) 采用神经网络来确定网络节点的属性评分参数,按评分选取初始解|
|决赛 | cdn3 |全国第14,共36支队伍|两支队伍对战来争夺消费者,算法类->策略类|1) 使用复赛的选点策略进行选点
2) 为了开局很好的抢到优势开始提供的较大的流量
3) 如果发现点没抢过对手,那么如果将增加提供的流量和对手竞争|# 如何运行项目
1. cdn文件夹中包含了cdn1、cdn2、cdn3三个Java项目,只要导入对应的项目即可。
2. 每个项目的结构如下:
* `com.cacheserverdeploy.deploy` 包中是比赛具体的一些实现代码。
* `com.filetool.util` 包中是官方的一些工具类:读写文件和日志。
* `com.util`包中是测试和运行相关的类。`Checker` 类用于校验输出答案是否正确。`FilePath` 类用于指定输入输出路径。`Main` 类测试`com.cacheserverdeploy.deploy` 包中的函数功能。
3. 配置 `com.util` 包中 `FilePath` 类中的路径,然后启动 `com.util` 包中的 `Main` 类既可以运行。运行时间限制在一分半内。# 总结
本次比赛,我们优化的点是一些算法和数据结构。因为我们使用的是Java语言,所以速度相对比较慢,比较幸运的是,我们利用神经网络训练网络节点的评分参数的方法效果很好,可以基于评分选取一个较好的初始解,从而在有限的时间内给出一个较好的解。该方法的过程如下(实现是[NodesSelector类](https://github.com/mindawei/cdn/blob/master/cdn3/src/com/cacheserverdeploy/deploy/NodesSelector.java)):
1. 对节点的属性进行统计,形成一个属性向量,利用最大最小值进行归一化。
2. 根据已有网络拓扑的最优解(最优解可以根据商业求解器求出,官方也公布了答案),将最后部署网络服务器的网络节点的Y值设为1,没部署的Y值设置为0.
3. 将向量和Y值丢入神经网络中训练。得出参数。
4. 利用得出的参数,对未知网络中的节点进行评分,选出评分较高的点作为初始解。值得注意的是,之所以效果比较好,可能是因为比赛中网络拓扑结构还是比较相似的。此外,在赛后交流中,发现其他队伍的优化包括:使用单纯型算法、缩小网络大小(去掉网络最边缘的点)、使用阈值函数(决赛中的策略)等等。