调节红绿灯 管理十字路口
数字职场
本期挑战题目
一个十字路口,假设在每一个方向每秒钟随机出现1~10辆车,如何控制交通信号灯才可以使通行状况最好呢?
本期知识:规则控制
知识运用:计费软件、管理软件等
本期题目:交通高峰时期,车辆熙熙攘攘,十字路口如果没有红绿灯,就会造成大塞车,你能编一个小软件管制十字路口的交通吗?
仔细看题,就会发现题目的意思是要智能管理交通信号灯。管理交通信号灯是大城市的重要问题,如果管理不善,就有可能造成上下班高峰期堵车。如何智能管理交通信号灯呢?这就需要用到规则控制!智能控制交通信号灯,常见的规则如下:
1. 交替变化规则:例如南北向和东西向信号灯的交替变化。
2. 高峰期规则:针对高峰期的车辆规律动态控制不同方向的信号灯时长,例如南北向压力较大时,则南北向的通行时间增加到90秒,而东西向的通行时间减少到40秒。
3. 智能变换:根据当前采集到的流量信息动态变化不同方向上的时长。
这些规则的合理使用、搭配使用,就能充分利用有限的道路资源,使得城市的生活更加美好。下面我们就来编程实现智能管理交通信号灯吧。
根据方向进行智能控制
例如在一个普通的十字路口,东西向和南北向通行,每个方向上的等待时间都是60秒,那么东西向如果显示绿灯的剩余时间是45秒的话,则南北向红灯的剩余时间也是45秒,然后在时间变化为0时实现红绿灯的切换。按照这种规则,程序代码如下:
int time = 60; //时间
boolean direction = false; //false代表南北向绿灯,true代表东西向绿灯
while(true){//信号灯变化循环
//输出信息
if(direction){
System.out.println("东西向绿灯剩余" + time +
"秒,南北向红灯剩余" + time + "秒");
}else{
System.out.println("南北向绿灯剩余" + time +
"秒,东西向红灯剩余" + time + "秒");
}
//延时1秒
try{
Thread.sleep(100);
}catch(Exception e){}
if(time > 0){
time--;
}else{//变换方向
direction = !direction;
time = 60;
}
}
根据高峰期进行智能控制
上面的代码只考虑了一种情况,但在实际使用中还要考虑高峰期的交通控制,例如在繁忙时段中,各个方向需要等待的时间较长,而在空闲时段之间,由于交通压力小,则各个方向上的等待时间缩短。假设繁忙时段的延迟时间是60秒,而空闲时段的延迟时间为40秒,程序代码如下:
int time = 60; //时间
boolean direction = false; //false代表南北向绿灯,true代表东西向绿灯
int sepTime = 60; //间隔时间
while(true){//信号灯变化循环
//输出信息
if(direction){
System.out.println("东西向绿灯剩余" + time +
"秒,南北向红灯剩余" + time + "秒");
}else{
System.out.println("南北向绿灯剩余" + time +
"秒,东西向红灯剩余" + time + "秒");
}
//延时1秒
try{
Thread.sleep(100);
}catch(Exception e){}
if(time > 0){
time--;
}else{//变换方向
direction = !direction;
time = sepTime;
}
//每次判断时间段
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY); //获得小时数
if(hour >= 7 && hour < 22){
sepTime = 60;
}else{
sepTime = 40;
}
}
实际应用
在实际的项目开发中,到处充满着规则控制,例如在电信的计费系统中,就要根据各种套餐的规则计算用户的通话或其他费用;在每年年底的“送话费”活动中也需要根据用户续费的金额和周期的长短,每月扣除一定的费用;还有各大运营商都在做的“存话费送手机”活动中,都要根据用户当月的消费金额决定是否达到最低消费,如果未达到则在用户的账户中扣除一定的费用从而达到最低消费金额。
在各种管理软件中,对于用户权限的管理也存在一系列的规则,例如某个用户组中的用户具备哪些权限,可以实现哪些操作,这些规则都需要在实际的项目开发中通过编程来实现。
露一手
对于上期的题目,很多编程爱好者踊跃参与,其中来自北京的冯磊,表现非常耀眼,他的程序考虑周到、高效,关键代码如下所示。我们将给予北京的冯磊现金奖励。
public static void main(String[] args) {
int yearMoney = 500;//首年没有存入现金
float yearMoneyRateSum = 0.0f;//当年的利率总钱数 不够一年为0 没够一年增长2.25%
float yearMoneySum = 0.0f; //每年的总资产
float totalAssets = 0.0f;
System.out.println("===========存款计划===========");
for(int i = 1; i <= 20; i++){
yearMoneySum = totalAssets + yearMoney * 12; //一年中每月存入的现金和
yearMoneyRateSum = (float) (yearMoneySum * 0.0225); //计算年利息(一年期存款利率2.25%)
totalAssets = yearMoneySum + yearMoneyRateSum; //总资产
System.out.println("--------------------------
----");
System.out.println("第" + i + "年总存入现金为:" + yearMoneySum);
System.out.println("年利息为:" + yearMoneyRateSum);
System.out.println("总资产为:" + totalAssets);