📄 trafficcontrol.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package fivestarcross;import java.util.ArrayList;/** * * @author Dante */public class TrafficControl implements Runnable{ public ArrayList<int [][]> alltrafficLight=new ArrayList<int [][]>();//所有的汽车交通灯情况 public ArrayList<int []> allpeopleTrafficLight=new ArrayList<int []>();//所有的行人交通灯情况 public int [][] trafficLight; //0、绿灯 1、黄灯 2、红灯 public int [] peopleTrafficLight;//0、绿灯 1、红灯 public int [][] initialTrafficLight = new int [5][5]; //0、绿灯 1、黄灯 2、红灯 public int [] initialPeopleTrafficLight = new int[]{1,1,1,1,1};//0、绿灯 1、红灯 public float [][] traffic; public int player=2;//运行状态 //交通灯相位 public ArrayList<ArrayList<VexNode>> Phase = new ArrayList<ArrayList<VexNode>>(); //交通灯相位权值 public ArrayList<Integer> PhaseWeight = new ArrayList<Integer>(); public float Avgtraffic;//总车流量 public int onetime;//一个时间单位 public int AvgWeight = 45;//平均相位权值,时间单位的倍数,根据实际情况定义 public TrafficControl(int onetime,float [][] traffic ){ this.onetime=onetime; this.traffic=traffic; FiveJunction fivejunct = new FiveJunction(traffic); runTrafficControl(fivejunct.traffic_graph); computetrafficLight(); resetTrafficLight(); } public TrafficControl(int onetime){ this.onetime=onetime; traffic = new float [5][5]; traffic[0][0]=0.0f; traffic[0][1]=270.0f; traffic[0][2]=30.0f; traffic[0][3]=240.0f; traffic[0][4]=350.0f; traffic[1][0]=478.0f; traffic[1][1]=0.0f; traffic[1][2]=60.0f; traffic[1][3]=300.0f; traffic[1][4]=331.0f; traffic[2][0]=18.0f; traffic[2][1]=40.0f; traffic[2][2]=0.0f; traffic[2][3]=29.0f; traffic[2][4]=10.0f; traffic[3][0]=180.0f; traffic[3][1]=279.0f; traffic[3][2]=30.0f; traffic[3][3]=0.0f; traffic[3][4]=25.0f; traffic[4][0]=363.0f; traffic[4][1]=408.0f; traffic[4][2]=29.0f; traffic[4][3]=60.0f; traffic[4][4]=0.0f; FiveJunction fivejunct = new FiveJunction(traffic); runTrafficControl(fivejunct.traffic_graph); computetrafficLight(); resetTrafficLight(); } public void setPlayer(int play){ player=play; } public void setOnetime(int time){ onetime=time; } public int [][] getTrafficLight(){ return trafficLight; } public int [] getPeopletrafficLight(){ return peopleTrafficLight; } public void resetTrafficLight(){ trafficLight = initialTrafficLight; peopleTrafficLight = initialPeopleTrafficLight; } private void runTrafficControl(ArrayList<VexNode> traffic_graph) { Avgtraffic=0.0f; for(int i=0;i<=4;i++) for(int j=0;j<=4;j++) Avgtraffic=Avgtraffic+traffic[i][j]; Avgtraffic=Avgtraffic/20.0f; int si=traffic_graph.size(); int count = 0; int color =0; int phase; float trafficsum =0.0f; ArrayList<VexNode> newNode = new ArrayList<VexNode>(); for(int i=0;i<si;i++){ int num =traffic_graph.get(i).vexnum; if(num==4||num==5||num==11||num==17||num==23){//AE,BA,CB,DC,ED与任何方向都无冲突,取出来单独处理 traffic_graph.get(i).vexcolor=0;//从颜色1中分离 newNode.add(traffic_graph.get(i)); trafficsum=trafficsum+traffic_graph.get(i).vextraffic; count++; } } Phase.add(newNode); PhaseWeight.add((int)(trafficsum/5/Avgtraffic*AvgWeight)); while(count<si){ color++; trafficsum =0.0f; newNode = new ArrayList<VexNode>(); for(int i=0;i<si;i++){ if(color==traffic_graph.get(i).vexcolor){//分离出color色的节点 newNode.add(traffic_graph.get(i)); trafficsum=trafficsum+traffic_graph.get(i).vextraffic; count++; } } Phase.add(newNode); phase = (int)(trafficsum/newNode.size()/Avgtraffic*AvgWeight); if(phase<AvgWeight/4) phase=AvgWeight/4; PhaseWeight.add(phase); } } public void computetrafficLight(){ int pwsize =PhaseWeight.size(); int onesize; int x,y; //交通灯矩阵的行,列位置 ArrayList<VexNode> onePhase; for(int i=1;i<pwsize;i++){ int [][] trytrafficLight = new int [5][5]; //0、绿灯 1、黄灯 2、红灯 int [] trypeopleTrafficLight = new int [5];//0、绿灯 1、红灯 for(int k=0;k<=4;k++) //行人交通灯初始化为绿灯 trypeopleTrafficLight[k]=0; for(int n=0;n<=4;n++) //汽车交通灯初始化为红灯 for(int m=0;m<=4;m++) trytrafficLight[n][m] = 2; onePhase = Phase.get(i); onesize =onePhase.size(); for(int j=0;j<onesize;j++){ x = onePhase.get(j).vexnum/5; y = onePhase.get(j).vexnum%5; trytrafficLight[x][y] = 0; trypeopleTrafficLight[x] = 1; trypeopleTrafficLight[y] = 1; } onePhase = Phase.get(0); onesize =onePhase.size(); for(int j=0;j<onesize;j++){ //车辆右转情况 如:BA,CB,DC,ED,AE x = onePhase.get(j).vexnum/5; y = onePhase.get(j).vexnum%5; if(trypeopleTrafficLight[x]!=0&&trypeopleTrafficLight[y]!=0) //此道路人行道不通行 trytrafficLight[x][y] = 0; //此道路为绿灯 } alltrafficLight.add(trytrafficLight); allpeopleTrafficLight.add(trypeopleTrafficLight); } } public void run() { int allsize = alltrafficLight.size(); while(true){ for(int i=0;i<allsize;i++){ trafficLight=alltrafficLight.get(i); peopleTrafficLight=allpeopleTrafficLight.get(i); for(int a=0;a<PhaseWeight.get(i)*20;){//相当于睡眠时间为PhaseWeight.get(i)*onetime if(player==0){ //当播放的时候,正常运行 a++; } try{ //当暂停的时候,白白sleep Thread.sleep(onetime/20); }catch(Exception e){ e.printStackTrace(); } } //处理黄灯 int [][] clonetrafficLight = new int [5][5]; //0、绿灯 1、黄灯 2、红灯 for(int p=0;p<=4;p++) for(int q=0;q<=4;q++){ if(trafficLight[p][q]==0&&alltrafficLight.get((i+1)%allsize)[p][q]==2){ clonetrafficLight[p][q]=1; } else{ clonetrafficLight[p][q]=trafficLight[p][q]; } } trafficLight=clonetrafficLight; for(int a=0;a<5*20;){//相当于睡眠时间为5*onetime if(player==0){ //当播放的时候,正常运行 a++; } try{ //当暂停的时候,白白sleep Thread.sleep(onetime/20); }catch(Exception e){ e.printStackTrace(); } } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -