2017华为软件精英挑战赛读文件和写文件源代码(C++)

在delop.cpp中

struct Init Var;

void deploy_server(char * topo[MAX_EDGE_NUM], int line_num,char * filename)
{
	initial(topo,line_num);
	

	char *topo_file=new char[60000];
	char *str=new char[20];

	sprintf(str,"%d\n\n",Var.connode_num);
	strncat(topo_file,str,4);

	for(int i = 0;i < Var.connode_num;i++)
	{
		sprintf(str,"%d %d %d\n",Var.con_linkID[i],i,Var.con_needband[i]);
		strncat(topo_file,str,10);
	}
	
	printf("\n\n %s", topo_file);

	write_result(topo_file, filename);

}

在delop.h中

/*******************Graph初始化输入得到数据************************/

#define MAXnetNote	1000		//网络节点数量上限
#define MAXconNote	500		//消费节点数量上限
#define MAXnoteLink	20		//每个节点的最多链路数量
#define MAXserverPrice	5000		//每个服务器的最大价格

extern void initial(char *topo[MAX_EDGE_NUM], int line_num);

struct Supply
{
	int band;
	int band_price;
};

struct Init
{
	int netnode_num,netlink_num,connode_num,server_price;//网络节点数量,网络链路数量,消费节点数量,服务器单价
	struct Supply Link_supply[MAXnetNote][MAXnetNote];//每个链路总带宽大小,单位网络租用费
	int con_linkID[MAXconNote],con_needband[MAXconNote];//消费节点相连的网络节点,消费节点需要的带宽
};
extern struct Init Var;		

在Graph.cpp中

void initial(char *topo[MAX_EDGE_NUM], int line_num)
{
	char *line;	
	int ch,s,t,b,c,len,conID,l,n;//char,srcID,detID,bandwidth,cost,length,consumptionID,linkID,consumption_need_band

	for(int i = 0,j;i < line_num;i++)
	{
		line = topo[i];
		len = strlen(line);
		j = s = t = b = c = conID = l = n = 0;
		if(i == 0)//第一行为网络节点数量netnode_num,网络链路数量netlink_num,消费节点数量connode_num
		{
			while(!isdigit(ch = line[j++]) && j<len);
			if(isdigit(ch)) Var.netnode_num = ch - '0';
			else continue;
			while(isdigit(ch = line[j++])) Var.netnode_num = 10 * Var.netnode_num + (ch - '0');
			while(!isdigit(ch = line[j++])); Var.netlink_num = ch - '0';
			while(isdigit(ch = line[j++])) Var.netlink_num = 10 * Var.netlink_num + (ch - '0');
			while(!isdigit(ch = line[j++])); Var.connode_num = ch - '0';
			while(isdigit(ch = line[j++])) Var.connode_num = 10 * Var.connode_num + (ch - '0');
			printf("%d %d %d \n\n", Var.netnode_num,Var.netlink_num,Var.connode_num);
		}
		if(i == 2)//第二行为服务器部署成本
		{
			while(!isdigit(ch = line[j++]) && j<len);
			if(isdigit(ch)) Var.server_price = ch - '0';
			else continue;
			while(isdigit(ch = line[j++])) Var.server_price = 10 * Var.server_price + (ch - '0');
			printf("%d \n\n", Var.server_price);
		}
		if((i > 2)&&(i <= Var.netlink_num + 3))//总有链路数量行,分别为链路起始点ID s,终止点ID t,链路总带宽 b,单位网络租用费c
		{
			while(!isdigit(ch = line[j++]) && j<len);
			if(isdigit(ch)) s = ch - '0';
			else continue;
			while(isdigit(ch = line[j++])) s = 10 * s + (ch - '0');
			while(!isdigit(ch = line[j++])); t = ch - '0';
			while(isdigit(ch = line[j++])) t = 10 * t + (ch - '0');
			while(!isdigit(ch = line[j++])); b = ch - '0';
			while(isdigit(ch = line[j++])) b = 10 * b + (ch - '0');	
			while(!isdigit(ch = line[j++])); c = ch - '0';
			while(isdigit(ch = line[j++])) c = 10 * c + (ch - '0');	

			Var.Link_supply[s][t].band = b;
			Var.Link_supply[s][t].band_price = c;

			printf("%d %d %d %d\n", s,t,b,c);
		}
		if(i > Var.netlink_num + 3)//总有消费节点数量行,分别为消费节点ID conID,相连网络节点ID l,视频带宽消耗需求 n
		{
			while(!isdigit(ch = line[j++]) && j<len);
			if(isdigit(ch)) conID = ch - '0';
			else continue;
			while(isdigit(ch = line[j++])) conID = 10 * conID + (ch - '0');
			while(!isdigit(ch = line[j++])); l = ch - '0';
			while(isdigit(ch = line[j++])) l = 10 * l + (ch - '0');
			while(!isdigit(ch = line[j++])); n = ch - '0';
			while(isdigit(ch = line[j++])) n = 10 * n + (ch - '0');	

			Var.con_linkID[conID] = l;
			Var.con_needband[conID] = n;

			printf("%d %d %d \n", conID,l,n);
		}
	}	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的竞赛项目学习资料,作为参考学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 华为软件精英挑战赛初赛、复赛、决赛代码(决赛第14名)源码+学习说明.zip # 概览 赛题《大视频时代•布局》背景如下,摘自[2017年比赛官网](http://codecraft.huawei.com/): >在给定结构的G省电信网络中,为了视频内容快速低成本的传送到每个住户小区,需要在这个给定网络结构中选择一些网络节点附近放置视频内容存储服务器。需要解决的问题是:在满足所有的住户小区视频播放需求的基本前提下,如何选择视频内容存储服务器放置位置,使得成本最小。 该比赛要求参赛者在指定时间内给出一种视频服务器的部署方案,满足消费者的需求并使得成本最小。因为指定时间内无法算出结果,所以比拼的是:初始解、搜索策略、算法优化。比赛过程如下表所示。 |阶段 | 项目 | 比赛经过|赛题变化|解题思路| | --- | -- | ------ | ----- | ---------- | |初赛 | cdn1 |赛区第32,前36进入复赛| 赛题如表前所述 |先用dijkstra算法求粗糙解,再用最小费用最大流求精确解| |复赛 | cdn2 |赛区第3,前4进入总决赛|1)服务器具有10个等级的输出能力<br>2)节点有部署费用|1) 先用dijkstra算法求粗糙解,再用zkw算法求精确解<br>2) 采用神经网络来确定网络节点的属性评分参数,按评分选取初始解| |决赛 | cdn3 |全国第14,共36支队伍|两支队伍对战来争夺消费者,算法类->策略类|1) 使用复赛的选点策略进行选点<br>2) 为了开局很好的抢到优势开始提供的较大的流量<br>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. 利用得出的参数,对未知网络中的节点进行评分,选出评分较高的点作为初始解。 值得注意的是,之所以效果比较好,可能是因为比赛中网络拓扑结构还是比较相似的。此外,在赛后交流中,发现其他队伍的优化包括:使用单纯型算法、缩小网络大小(去掉网络最边缘的点)、使用阈值函数(决赛中的策略)等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值