基于约束

时间:2018-02-21 21:28:12

标签: r routing bigdata

我正在开发一个名为dbus的数据框,用于描述某些时间段内公共巴士的固定路由。数据帧的一小部分如下所示。此数据框的含义非常简单:列Stop.Name标记总线将访问的所有公共汽车站,其顺序与特定日期期间数据集中显示的顺序相同。

    Date        DOW        Trip.Time      Stop.Name    
   <chr>        <chr>      <chr>          <chr>                 
 1 01-OCT-2016  Saturday  05:55           Davis CTA St             
 2 01-OCT-2016  Saturday  05:55           Benson / Davis            
 3 01-OCT-2016  Saturday  05:55           Davis / Maple             
 4 01-OCT-2016  Saturday  05:55           Davis / Oak               
 5 01-OCT-2016  Saturday  05:55           Davis Ridge
 6 01-OCT-2016  Saturday  05:55           Davis Asbury             
 7 02-OCT-2016  Sunday    05:55           Asbury Church           
 8 02-OCT-2016  Sunday    05:55           Church Wesley             
 9 02-OCT-2016  Sunday    05:55           Church Ashla
10 02-OCT-2016  Sunday    05:55           Church Florence   
11 02-OCT-2016  Sunday    06:55           Church Britt            
12 02-OCT-2016  Sunday    06:55           Asbury Road           
13 02-OCT-2016  Sunday    06:55           Church Wesley             
14 02-OCT-2016  Sunday    06:55           Bryan St
15 02-OCT-2016  Sunday    05:55           Church Florence
16 02-OCT-2016  Sunday    05:55           Church Ashla

我的目标:写一个 R代码来重新构建路由矩阵A,最好只基于一列:stop.name(所以,忽略其余列)。路由矩阵A =(a_ {ij})(i,j是停靠点的索引)将包含1和0的条目,但基于以下规则:

  1. 如果在stop i和j之间存在路径(间接路径正常),则a_(ij)= 1。否则,a_(ij)= 0.
  2. 矩阵的每一行都标记为两种类型中的一种:i_ON或i_OFF。例如,第1行将被标记为(Davis CTA St)_ON,这意味着只有第1行的条目和带有标签&#34的列; Davis CTA St j&#34;其中j是连接到Davis CTA St的另一个公共汽车站的名称(因此,j将是Benson / Davis,Davis / Maple,Davis / Oak,......,Davis Asbury)等于1.第1行的其余条目= 0。
  3. 根据定义,a_(ij)和a_(ji)可能不相等。例如,在01-OCT-2016期间,没有办法从Davis / Maple转到Davis CTA St(即,在该特定日期期间数据集中没有显示循环)。另一方面,02-OCT-2016期间存在循环。
  4. 矩阵的列由数据集中显示的所有 CONNECTED 对(也必须包含间接连接的对)表示。
  5. 我的启发式算法:首先,我创建一个零行数矩阵A,其中行x列=(2 *停止数)x(所有连接的唯一对停止)(对于上面的数据集,我有78个可能的对中有13个唯一停止和63个连接对。我只能想出主要通过连接对的数量仅检查)。所以A的大小 26 * 63 。现在,对于A的每一行,我想根据规则2将相应的条目更改为1.预期的输出将是

    A = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0.... 0
          0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.... 0 ----> All zeros since the 
                                        bus does not go INTO Davis CTA St
          0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1.... 0
    
    
         0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...1 1]` ---> Last 5 entries = 
        1s since the bus goes from Church Florence to Church Ashla, which is 
        connected to 4 other bus stops
    

    其中列 1 - &gt; 63 是(间接/直接)连接的公共汽车站的集合:{Davis CTA St - &gt; Benson / Davis,Davis CTA St - &gt; Davis Maple,Davis CTA St - &gt;戴维斯/橡树,...,佛罗伦萨教堂 - &gt; Ashbury Road}。行1 - >; 26将被标记为Davis CTA St_ON,Davis CTA St_Off,Benson / Davis ON,Benson / Davis OFF,......,Bryan St OFF。

    请注意,查看上面的路由矩阵A,规则2&amp; 4 可以编码为以下规则:如果连接了停止i和j,并且连接了停止j和k,则我连接到j。这意味着对于行i_IN,如果条目对应于列ijjk为1,则列ik中的条目= 1(因此,{{1}这里的陈述就够了)。这意味着要有效地填写每一行,我们必须首先获得一组直接连接,唯一对的公交车站。然后,使用上面的IF语句从另一组中获取间接连接的对的集合。一旦我们获得这两个集合,对于每个IFi_IN行,我们只检查这两个集合中的一个(取决于IN或OUT行状态),并填写出现的每个列下的条目在该集合中1. i_OUTi_IN行的其余条目保持为零。

    我的问题:基于上面的启发式算法,我仍然在努力制作有效的代码。特别是,如何在R中编写有效的代码来执行以下任务:

    1. 浏览列i_OUT的每一行,记录所有直接连接的,唯一的对停靠点(因此,不允许对重复)。
    2. 列出所有间接连接的对而不会过度使用R,因为我的数据集是6M +行?
    3. 我如何编写用于填充我们的巨型路由矩阵的右列上的1s的规则,假设所有奇数行(行1,3,5,...)对应于状态&#34; i_IN& #34;,而所有偶数行(行2,4,6,...)对应于状态&#34; i_OUT&#34;。
    4. 鉴于所有信息,有人可以帮助我完成上述任何任务,即使只是上面的数据框架吗?我被困在任务1上,因为我看不出如何防止重复发生; p任务2很难,因为Stop.Name循环需要永远。没有那些2,任务3是不可能解决的; p

0 个答案:

没有答案