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
公交调度-车次链编制贪心算法
最新推荐文章于 2024-09-22 11:42:19 发布
这段代码展示了如何使用贪心算法解决公交调度问题。首先,根据车次到达时间进行排序,然后通过贪心策略搜索最长的车次链。代码包括读取上行和下行车次数据,以及创建固定行车计划的函数。
摘要由CSDN通过智能技术生成