zoukankan      html  css  js  c++  java
  • 火车调度问题

      火车是人类生产生活中重要的交通工具。火车在铁路行行驶,铁路上的某些地方设有火车站。火车站上往往设有一些从主干线上分叉出去的铁路支路,供火车停靠,以便上下客或者卸载货物。铁路支路有一定的长度,火车也有一定的长度,且每列火车的长度相等。

    假设某东西向的铁路上,有一小站。该站只有一条铁路支路可供火车停靠,并且该铁路支路最多能够容纳M辆火车(M<=3)。为了火车行驶的畅通,该站只允许火车自东方进站,自西方出站。且先进站的火车必须先出站。否则,站内火车将发生堵塞。

    该火车站任务繁忙,每天都有N辆(N<=250)自东方驶向西方的火车要求在预定时刻进站,并在站内做一定时间的停靠。为了满足每辆进站火车的要求,小站的调度工作必须井井有条地展开。在小站每天的工作开始前,工作人员必须阅读所有火车的进站申请,并决定,究竟接受哪些火车的申请。而对不能满足要求的火车,小站必须提前通知他们,请他们改变行车路线,以免影响正常的铁路运输工作。由于火车进站的用时可以忽略不计,小站允许几辆火车同时进站和出站。且小站工作人员可以任意安排这些进站火车的先后排列次序。小站的工作原则是尽量多地满足申请火车的要求。

    你的任务是,帮助工作人员考察某天所有火车的进站申请,并决定最多能满足多少火车的要求,以及这些火车的编号。

    问题分析:

    这个问题是一个最优化问题,也就是求小站能够接受火车申请的最大值。

    极端情况:

    第一列申请进站的火车要求停靠一天,那么如果这个请求被接受,小站最多能为一辆火车服务。

    如果每M辆火车要求同时进站和同时出站,并且前面的M辆出站时间等于后面的M辆火车的进站时间,那么小站能满足所有N辆火车的进站申请。

    条件:

    1、对于同时进站的火车允许任意安排次序。

    2、站内火车先进先出。

    3、对于要求同时出站的火车,也可以任意安排次序。


     

    对于这个问题的极值求解,主要思路是求最小值。因为火车是有顺序的进站,所以,可以看做一个有向图的最小值问题。


    上图说明了几种情况。有向图的源点是不确定的,因为有可能同时有几辆火车提出第一个申请;也有可能第一个提出请求的火车不属于最优算法的集合。

    所以这个算法需要把每一个顶点都作为源点,然后进行逐个淘汰。

    1、每条边赋予1值作为权,顶点越多,弧就越多,表示被接受的火车越多,这个值越大。每个顶点的权为0。

    2、最后的图是一个只有一个源和一个结束顶点,并且中间所有顶点的出度和入度必须均为1的图。


    3、以每一个顶点为源点建立一个有向图,每两个顶点,只要这两个顶点之间可达(例如列车1的请求被接受以后,2,3,4的请求都可以被接受),那么他们之间存在一条弧,每条弧拥有初始权1。

    4、图中顶点按照时间线进行从左到右的分布(根据进站请求发生的时间)。

    5、我们按照一定的方法,从每个图中消去尽可能少的弧(不合理的),最终得到最小值。

    6、消去弧的方法是,计算每个顶点的权,其权是它的一个前驱顶点的权,加上他们之间弧的权。如果这个顶点有多个入度,那么就保留一个最大值,删除其它的进入弧。

    例如,以第一个图为例,用时间线进行扫描。1没有入度弧,权不变,保持0。

    2有一个入度弧,是从1过来的,那么就加1,变成1。

    3有两个入度弧,从1过来的0+1,权为1;从2过来的1+1,变为2。所以删除1到3的弧,保留权大的路径。

    4有三个入度弧,从1来得,0+1 = 1,从2来的,1+1=2,丛3来的2+1=3。

    所以保留从3到4的弧。

    最后得到调度顺序:1-2-3-4。整个图的权为最终4上的权,3。

    7、最终比较所有图的权,取值最大的图。并得到调度顺序和列车编号。

    8、每个图包含顶点数目不一定相同,选择一个源点,那么用时间线扫描,只能接纳其它满足条件的顶点。要考虑车站最多同时容纳的列车数量。


    对于满足条件的路径大于车站容量的情况,需要把不能容纳的路径的权标志为无穷大(例如1000)。例如,1进站,2,3,4同时请求,假如5部在冲突区域,只能容纳3辆车的时候需要把2,3,4中的一个排除。

    算法分析:

    这个算法具有比较高的时间和空间复杂度,不是一个质量很高的算法。

  • 相关阅读:
    C# Stream篇(—) -- Stream基类-----转载
    C# Stream篇(三) -- TextWriter 和 StreamWriter---转载
    C#文件过滤器filter---转载
    微信列表展示与详情页
    关于微信表单添加与图片上传
    登录的php代码 接口开发
    文章列表与点赞的一些功能实现 以及详情页点赞、取消赞操作
    Linux 简单命令总结
    微信小程序实现登录功能 (第一种模式)
    201509-1 数列分段 Java
  • 原文地址:https://www.cnblogs.com/worldreason/p/1188661.html
Copyright © 2011-2022 走看看