⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trafficcontrol.java

📁 主要功能:对五条道路的车辆进行控制
💻 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 + -