公交调度-车次链编制贪心算法

这段代码展示了如何使用贪心算法解决公交调度问题。首先,根据车次到达时间进行排序,然后通过贪心策略搜索最长的车次链。代码包括读取上行和下行车次数据,以及创建固定行车计划的函数。
摘要由CSDN通过智能技术生成
  1 package cn.edu.karel.work.public_transit_problem;
  2 
  3 import java.io.File;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 

 18 public class GreedSolute {
 19     /** 发车时刻表数据 */
 20     static File forward = new File("D:/mycode/Eclipse/Bus Scheduel Problem/scheduel1/ForwardScheduel/start time.txt");
 21     static File backward = new File("D:/mycode/Eclipse/Bus Scheduel Problem/scheduel1/BackScheduel/start time.txt");
 22     static int sum = 0;
 23     
 24     public static void main(String[] args) throws IOException{
 25         /** 创建时刻表 */
 26         Scheduel scheduel = new Scheduel();
 27         inputForward(scheduel);
 28         inputBackward(scheduel);
 29         
 30         /** 固定行车计划 */
 31         ArrayList<TrainsitChain> chain = creatFixedPlan(scheduel);
 32         
 33         /** 可变行车计划 */
 34         //chain = creatVariablePlan(scheduel,chain);
 35     }
 36     
 37     /**
 38      * 将发车时刻表中的所有车次按照 FIFO规则排序
 39      * 
 40      * @param scheduel 发车时刻表
 41      * @return list 排序后的车次序号列表
 42      */
 43     public static ArrayList<Integer> sortScheduel(Scheduel scheduel){
 44         /** 排序后的车次序号列表 */
 45         ArrayList<Integer> list = new ArrayList<Integer>();
 46         
 47         int i = 0;
 48         int j = 0;
 49         int k = 0;
 50         while(i<scheduel.tranListForward.size() && j<scheduel.tranListBack.size())
 51         {
 52             if(scheduel.tranListForward.get(i).arriveTime <= scheduel.tranListBack.get(j).arriveTime)
 53             {
 54                 list.add(k, scheduel.tranListForward.get(i).id);
 55                 i++;
 56             }
 57             else
 58             {
 59                 list.add(k, scheduel.tranListBack.get(j).id);
 60                 j++;
 61             }
 62             k++;
 63         }
 64         while(i<scheduel.tranListForward.size())
 65         {
 66             list.add(k++, scheduel.tranListForward.get(i++).id);
 67         }
 68         while(j<scheduel.tranListBack.size())
 69         {
 70             list.add(k++, scheduel.tranListBack.get(j++).id);
 71         }
 72         return list;
 73     }
 74     
 75     /** 
 76      * 贪心算法搜索出剩余车次中最长的车次链
 77      * 
 78      * @param list 按照FIFO规则排序后的车次的列表
 79      * @param scheduel 用于搜索车次链的发车时刻表
 80      * @return chain 搜索到的车次链
 81      */
 82     public static TrainsitChain searchChain(ArrayList<Integer> list,Scheduel scheduel){
 83         TrainsitChain chain = new TrainsitChain();
 84         
 85         /** 以当前剩余车次中的第一个车次为该车次链的首个车次*/
 86         int index = list.get(0);
 87         int len = scheduel.tranListForward.size();
 88         if(index >= len ){
 89             index -= len;
 90             chain.addTransit(scheduel.tranListBack.get(index));
 91         }else{
 92             chain.addTransit(scheduel.tranListForward.get(index));
 93         }
 94         list.remove(0);
 95         
 96         /**遍历当前剩余车次搜索到最长车次链 */
 97         int i=0;
 98         while(i<list.size())
 99         {
100             int next = list.get(i);
101             int l = chain.theChain.size();
102             /** 判断该车次是上行还是下行 */
103             if(next >= len)
104             {
105                 next -= len;
106                 if(scheduel.tranListBack.get(next).getStartTime() >= chain.end){
107                     /** 车次链上前后辆车次行驶方向不同 */
108                     if(chain.theChain.get(l-1).isForward){
109                         chain.addTransit(scheduel.tranListBack.get(next));
110                         list.remove(i);
111                     }
112                     else
113                         i++;
114                 }
115                 else
116                     i++;
117             }
118             else{
119                 if(scheduel.tranListForward.get(next).getStartTime() >= chain.end)
120                 {
121                     if(!chain.theChain.get(l-1).isForward){
122                         chain.addTransit(scheduel.tranListForward.get(next));
123                         list.remove(i);
124                     }
125                     else
126                         i++;
127                 }
128                 else
129                     i++;
130             }
131         }    
132         return chain;
133     }
134     
135     /**
136      * 读取上行数据
137      * @throws IOException 
138      */
139     public static void inputForward(Scheduel scheduel) throws IOException{
140         try{
141             int i = 0;
142             FileInputStream fis = new FileInputStream(forward);
143             InputStreamReader isr = new InputStreamReader(fis);
144             @SuppressWarnings("resource")
145             LineNumberReader lnr = new LineNumberReader(isr);
146             String s = null;
147             while ((s = lnr.readLine()) != null) {
148                 int data = Integer.parseInt(s.trim());
149                 Transit t = new Transit();
150                 t.setID(i);
151                 t.setStartTime(data);
152                 t.setArriveTime(data+Transit.RUN_FOWARD_TIME);
153                 t.setForward(true);
154   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值