海康威视2017软件精英挑战赛初赛题目

详情请 关注 官网:http://codechallenge.hikvision.com/
此处仅为个人记录

题目概述

在车库中安排若干泊车机器人,根据给定的车位地图,合理优化机器人的数量及其运动路径,尽量减少客户在停车和取车中的等待时间,并使总成本最小。

参数设定

为了简化问题,我们对泊车机器人的实际运行情况做出如下规定和说明,与“题目背景”中所述的泊车机器人真实运行情况有所不同,请注意。

地图说明:

给定一个停车地图,以下图为例:地图中红色部分表示车位(P),黑色部分表示障碍物(B),黄色部分表示入口(I),绿色部分表示出口(E),白色表示行车道路(X),每个车位都与行车道路(X)相邻,每个车位(P)只能停一辆车。
1.泊车机器人必须能到达每个车位;
2.每个车位有且只有一个入口, 即每个红色区域旁边有且只有一个白色区域;
3.出口和入口各只有一个,且不重合,分布在地图边缘,泊车机器人从入口和出口都能到达每个车位。
个人理解:以上为检查地图合理条件,车必可达,达出的最短路径唯一,车必可出。
topic_01.jpg

泊车机器人说明:

1.泊车机器人(R)运行速度为每秒一个格,且只能向前、后、左、右移动,不能沿对角线移动。
2.泊车机器人不论在载车还是空车状态,都不能穿过图例中黑色区域(B);且只能由白色区域(X)进入到红色区域(P),或相反;不能在红色区域(P)之间移动。比如,上图图例中左上角, 允许3->1和1->3,但不允许1->2。
3.泊车机器人在搬运车辆的过程中不能停车等待。
4.泊车机器人在空闲的时候,可以行驶到任何位置(除了B区域)。
5.允许多个泊车机器人相遇,泊车机器人之间不会发生碰撞;允许多个泊车机器人同一时间出现在同一格子中。
6.假设泊车机器人空载时耗能极少可忽略不计,载车时能耗(W)与车的质量(m)以及行驶里程(S)相关,W=k*m*S,k为能耗系数。
个人理解:不当士用,红色不可穿,运车不停,空车随意,X处允许撞车,空载用太阳能。

车辆说明:

1.每辆车(C)都有申请进入时间(T-in)、申请离开时间(T-out)、实际进入时间(T-in')、实际离开时间(T-out')、最长等待时间(t)、车的质量(m,m≤2000)。
2.申请进入时间(T-in)表示车辆到达时间,实际进入时间(T-in')为泊车机器人从入口处把车辆接走的时间点;申请离开时间(T-out)表示客户取车的时间点,实际离开时间(T-out')表示泊车机器人把车辆搬到出口的时间点;若(T-in')>(T-in)+(t),则客户放弃停车。
3.每辆车的等待时间(T1)=(T-in')-(T-in)+(T-out')-(T-out);若发生客户放弃停车的情况,需要对每辆被放弃的车辆增加罚时(p),总罚时(T2)=罚时系数(p)*放弃停车车辆数(q)。(注:放弃停车的车辆的等待时间,不计算到T1,该车不会停到车库里面,因此也不用规划路径,只需要计入T2即可
个人理解:

  • Car参数: T-in T-out T-in’ T-out t m
  • (T-in')>(T-in)+(t),客户放弃停车
  • 等待时间(T1)=(T-in')-(T-in)+(T-out')-(T-out),放弃停车则不计入T1,计入T2。
  • 总罚时(T2)=罚时系数(p)*放弃停车车辆数(q)。

题目说明

现有一批车辆需要停到车库中,请设计一个合理的停车方案,使Z最小。 Z=a*n+T+W
n为泊车机器人个数,a为系数;T=bT1+T2, b为系数;W为总能耗。具体公式为 Z= n*a + b*∑T1 + p*q + k*∑m*s

输入

1.从标准输入 输入的数据以空格分隔,每行以换行符(‘\n’)结尾。
2.格式:
能耗系数k 罚时系数p 泊车机器人系数a 客户停车等待系数b
停车库宽w 停车库高h
接下来是一个w*h的二维数组, 数组中P表示车位,B表示障碍物,I表示入口,E表示出口,X表示过道
车辆数目N
1 申请入库时间点 申请出库时间点 最大等待时间 车的质量
2
3
.
.
N 申请入库时间点 申请出库时间点 最大等待时间 车的质量

说明:

a.所有输入都是不小于0的整数,且不大于100000,地图宽高都不大于100,车辆数N不大于5000
b.为了方便计算,时间点都是归一化时间,即从0开始,依次增加
c.机器人行驶里程说明,例如示例图中车辆从入口4到停车位6,它的行驶路程为4->5->6,那么它的里程数为2

输入示例:

1 80 400 5 //能耗系数k:1, 罚时系数p:80, 泊车机器人系数a:400,等待系数b:5
6 6 // 地图宽高都为6
X X X X X X
X B P P P P
X X B B B B
X X X X X E
X X X X X X
I B P P B B
4 // 车辆数为4
1 0 50 20 10 // 车辆编号为1,申请进入时间点为0,申请离开时间点50,最大等地时间20,质量为10,即车辆如果在0+20这个时间点还没有被接走,就表示该车放弃泊车。
2 3 45 15 15
3 10 64 10 11
4 25 60 20 12

输出

1.标准输出,输出的数据以空格分隔,每行以换行符(‘\n’)结尾。
2.输出格式:
首先判断给的用例地图是否有效(判断依据见地图说明),
如果地图无效则:NO
文件结束
如果地图有效:YES
泊车机器人个数n 所有车的等待时间T(b*T1+T2) 所有泊车机器人的总能耗W
1 是否放弃停车,是输出yes该行结束
2 是否放弃停车,否输出no 入库泊车机器人编号(0开始) 入库时间点(机器人从入库出搬运的时间点) 入库路径 出库泊车机器人编号 出库时间点(泊车机器人从车位搬运的时间点) 出库路径
.
.
N-1 no入库泊车机器人编号(0开始) 入库时间点(机器人从入库处搬运的时间点) 入库路径 出库泊车机器人编号 出库时间点(泊车机器人从车位搬运的时间点) 出库路径
N yes

输出示例:

YES
1 400 416 // 需要泊车机器人1辆,总的等待时间为400 机器人总能耗416
1 no 0 0 (4,0) (3,0) (2,0) (1,0) (0,0) (0,1) (0,2) (0,3) (1,3) 0 62 (1,3) (0,3) (0,2) (0,1) (0,0) (1,0) (2,0) (3,0) (3,1) (3,2) (3,3) (3,4) (3,5)
2 no 0 16 (4,0) (4,1) (4,2) (5,2) 0 45 (5,2) (4,2) (3,2) (3,3) (3,4) (3,5)
3 yes
4 no 0 25 (4,0) (4,1) (4,2) (4,3) (5,3) 0 78 (5,3) (4,3) (3,3) (3,4) (3,5)

补充说明

1.泊车机器人初始位置都在入口I处。
2.泊车机器人在没有收到申请出库之前不能在车位上搬运汽车。即车一旦到达车位后,只有收到离开命令后才能搬运。
3.同时申请入库(出库)的车辆顺序由机器人决定,不同时间的先申请先处理。申请入库和出库之间没有时间关系(例:A先申请入库,B后申请出库,机器人可以先执行B,再执行A)。
4.车位有空的情况下,泊车机器人空闲时且入口有车辆等待入库,不能拒载。
5.泊车机器人入库或者出库的过车中,行驶里程不能大于整个地图的空闲区域数。
6.泊车机器人接到车辆后有足够长的时间把车放在车位,即输入的case中保证申请离开时间(T-out)>实际进入时间(T-in')+地图全部白色区域的格子数。因此入库的车必定要在停车位上停过。
7.编程所使用的语言为C,C++,JAVA;不能使用第三方开源库,也不能使用操作系统的特效函数。
8.运行环境
硬件环境:至强E5 2650 V4 8核心;
最大内存:2G;
运行时间:100S以内
GCC版本:4.8.2
JAVA版本:JDK 1.7.0_80

示例展示

topic_02.jpg
K=1, p=80,a=400,b=5
topic_03.jpg
一种策略如下:
topic_04.jpg

topic_05.代码大赛修改.jpg
对于该策略,用了一辆泊车机器人,时间T = 120+90+110 =400, 能耗W =200+120+96=416。这个策略得到的Z不一定是最小的,因此现在需要参赛者提供的程序能够针对不同的比赛用例,给出Z最小即可,即不存在标准答案,参赛者给出自认为可行的方案即可。

评判标准

对于地图有误的用例:

1.地图判断错误,得0分。
2.地图判断正确,按程序运行时间排名,越短排名越靠前。

对于地图无误的用例:

1.计算出来的Z跟实际给出的车辆路径计算出来的T,W等数据不符合得0分。
2.验证系统会根据给出的路径,模拟泊车机器人运行过程,查看是否存在同一时间点同一泊车机器人搬运多辆车,或者是否存在泊车机器人跳跃移动情况,如果存在得0分。
3.车辆路径存在冲突,或者根本不可能完成(例如泊车机器人同时搬运多辆车的情况),得0分。
4.路径以及给出的Z都符合要求的情况,Z越小,排名越靠前。
5.对于给出的Z相同,程序运行时间越短的,排名越靠前。

对于单个用例,排名第一的得100分,其他的依次降低。
总的分数为:单个用例分数总和/用例个数。

将1.txt中的车辆表分割成NumRobots个表:
输入NumRobots。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    int NumRobots=2;
    cin >> NumRobots;
    ifstream infile("2.txt", ios::in | ios::_Nocreate);
    string *carstr = new string[NumRobots];

    if (!infile)
    {
        cerr << "open error" << endl;
        exit(1);
    }
    int cnt = 0;
    string stmp,str="";
    string row ,col,carRows;
    int inrow=0, incol=0,allParks=0,incarRows=0;

    int allRows = 0;
    while (!infile.eof())
    {
        cnt++;
        if (cnt == 5)
        {
            infile>>row;
            continue;
        }
        if (cnt == 6)
        {
            infile >> col;
            inrow = std::stoi(row);
            incol = std::stoi(col);
            allParks = inrow*incol;
            continue;
        }
        if (cnt == allParks + 6 + 1)
        {
            infile >> carRows;
            infile.get();
            incarRows = std::stoi(carRows);
            string *pstrcar = new string[incarRows];
            for (int i = 0; i < incarRows; i++)
            {
                getline(infile, pstrcar[i]);
            }
            for (int r = 0; r < NumRobots; r++)
            {

                for (int i = r; i < incarRows; i=i+NumRobots)
                {
                        carstr[r] = carstr[r] + pstrcar[i] + "\n";
                }
            }
            delete[] pstrcar;
            break;
        }

        infile >> stmp;

    }
    cout << row<<" "<<col<<endl;
    cout << incarRows << endl;
    for(int i=0;i<NumRobots;i++)
        cout << carstr[i];
    delete[] carstr;
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值