交通灯管理系统


package itheima.com.tracffic;
/**Road类
 * 
 * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
 * 每条路线上随机增加新的车辆,增加到一个集合中保存。
 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
 * 
 * 
 * 
 * **/

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {
private List<String> vechicles = new ArrayList<String>();
//路的名字
private String name = null;

// cunstroctor
public Road(String name) {
this.name = name;
// 用线程池,模拟车辆随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();

pool.execute(new Runnable() {

@Override
public void run() {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < 1000; i++) {
vechicles.add(Road.this.name + "_" + i);
}
}

});
// 用调度池 创建一个定时器,每隔1秒检查灯的状态,若果为绿灯则弄走一辆车
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {

@Override
public void run() {
if(vechicles.size()>0){
boolean lighted=true;
if(lighted){
System.out.println(vechicles.remove(0)
+ " is traversing !");
}
}
}},

 1,//过多长时间开始前面的线程
 1,//时隔多少时间再干前面是事
 TimeUnit.SECONDS);//时间单位

}

}
 package itheima.com.tracffic;
/**等类Lamp
 * 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12个Lamp元素。
 * 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红
 * **/
public enum Lamp {
// 北往南 同方向 南往北
N2S("S2N", "E2W", false),
//北向南
S2N(null, null, false),
// 东往西,同方向西往东
E2W("W2E", "E2S", false), 
//西向东
W2E(null, null, false),
// 东往南,西往北
E2S("W2N", "S2W", false), 
//西往北
W2N(null, null, false),
// 南往西,北往东
S2W("N2E", "N2S", false),
//北往东
N2E(null, null, false),
// 右转弯4个灯,状态为常绿
N2W(null, null, true), W2S(null, null, true), S2E(null, null, true), E2N(
null, null, true);
// 当前灯的状态
private boolean lighted;
// 与当前方向同时为绿的对应方向
private String opposite;
// 当前等变红时,下一个绿灯
private String next;

public boolean isLighted() {
return lighted;
}

private Lamp(String opposite, String next, boolean lighted) {
this.lighted = lighted;
this.opposite = opposite;
this.next = next;
}

/** 当某个灯变绿时,它当前方向对应的方向也该为绿 */
public void light() {
this.lighted = true;
if (opposite != null) {
// 把当前字符串变成枚举
Lamp.valueOf(opposite).light();
}
//返回name()当前枚举对象的名字,(Lamp.name();返回当前枚举的字符串
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}

/** 当某个等变红时它的对应的等也要变红,并把下一个等变绿 **/
public Lamp blackOut() {
// 把绿灯变红灯
this.lighted = false;
// 相对应方向上的的绿灯变红灯
if (opposite != null) {
//Lamp.valueOf(opposite)返回此字符串对应的枚举
Lamp.valueOf(opposite).blackOut();
}
// 把下一个灯变绿灯
Lamp nextLamp = null;
if (next != null) {
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
// 把绿灯返回
return nextLamp;

}

}
package itheima.com.tracffic;
/**
 * 灯控制器
 * 
 * */
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class LampControler {
private Lamp currentLamp;

public LampControler() {
//由东向西开始
this.currentLamp = Lamp.E2W;
currentLamp.light();
// 定时器/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
currentLamp = currentLamp.blackOut();
}

}, 15, 15, TimeUnit.SECONDS);
}

}
import itheima.com.tracffic.LampControler;
import itheima.com.tracffic.Road;
/**
 * 启动线程
 * 
 * */
public class TrafficTest {

/**
 * @param args
 */
public static void main(String[] args) {
String[] road =new String []{"N2S","S2N","E2W","W2E ","E2S","W2N","S2W ","N2E","N2W","W2S","S2E","E2N"};
for(int i=0;i<road.length;i++){
new Road(road[i]);
}
new LampControler();
}

}



在一个有多条分支的多叉路口,有些方向是双向通行,有些方向是单向通行,每个方向的通行时间根据不同时间段自动调节,请设计一个交通信号控制系统。(C和E是单行道)。该控制系统可以根据不同路口情况,配置合适的交通信号灯颜色及控制通行时间。 实现功能 在一个有多条分支的多叉路口,A、B、D是双向通行,C、E是单向通行,每个方向的通行时间根据不同时间段自动调节。请设计一个交通信号控制系统。该控制系统可以根据不同路口情况,配置合适的交通信号灯颜色及控制通行时间。 思路分解 道路遵循右行规则 找到可以行驶的路线(考虑C、E的单向因素) AB、AC、AD BA、BC、BD DA、DB、DC EA、EB、EC、ED 思路分解 基于以上判断出的可以行驶的路线,根据车辆必须右行和同一通行时间段内路线之间不能交叉的原则判断哪些路线不能同时行驶。结果包括以下: (AB BC) (AB BD) (AB DA) (AB EA) (AC DA) (AC BD) (AC DB) (AC EA) (AC EB) (AD EA) (AD EB) (AD EC) (BC EB) (BC DB) (BD DA) (BD EB) (BD EC) (DA EB) (DA EC) (DB EC) 思路分解  把可以同时行驶且不发生碰撞的路线用同一种颜色的交通灯指示  该控制系统需要用多少种颜色的交通灯分配给这些行驶路线? 交通灯颜色越少表示该控制系统的管理效率越高 解决方案  借助于“图”。图中一个顶点表示一条行驶路线,行驶路线相互矛盾用顶点之间的连线(即“边”)来表示。  交通灯控制问题就变等价为:对图的顶点的染色问题,要求对图上的每个顶点染上一种颜色,且有边相连的两个顶点不能染相同的颜色,且总的颜色种类尽可能的少。  或者,如果把图上的一个顶点理解为一个国家,顶点之间的连线表示两个国家有共同的边界,相邻的国家不能涂相同的颜色,则以上交通灯控制问题又能转化为著名的地图着色问题。 解决方案  考虑使用贪心算法  算法主要思想 1. 用一种颜色给尽可能多的顶点着色 (1) 选择某未着色的顶点并用该新颜色上色 (2) 扫描未着色的其他所有顶点,逐个考察它们是否有边与已用该颜色着色的顶点相连,若没有边相连就用该颜色上色。 2. 换一种颜色重复步骤1,直到所有顶点全部着色为止  其中一种可能染色结果,圆圈中的数字标识该路径所选用的交通灯颜色,即:蓝色为1,红色为2,绿色为3,黄色为4。该算法还可能得到其他的次优解。 实现要求  选用适当的数据结构存储上面的图的信息  程序运行后的输出内容,请参考以下格式(以上图为例): 颜色1的信号灯亮时,以下方向通行: AàB BàA AàC AàD DàC EàD 颜色2的信号灯亮时,以下方向通行: BàC BàD EàA 颜色3的信号灯亮时,以下方向通行: DàA DàB 颜色4的信号灯亮时,以下方向通行: EàB EàC 实验步骤 - 建立数据的结构; - 设计子函数; - 利用main函数调用各子函数; - 准备测试数据; - 调试程序,分析运行结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值