星球大战仿真:
仿真的理想:通过模拟,调整降落指挥系统应能使战机坠毁量最少,等候的战机尽快减少,先到的战机应优先降落。通过改变不同参数例如战机(数量,距离,燃料..),或指挥系统参数(调度算法或方式改变)统计战机数量或拥挤程度。再或者通过这些统计数据得出不同范围船坞数量与战机数量最佳比例....
系统简介:进入两个调度系统选择,一个按战机燃油量越少优先级就越高,另一个先到的优先级就越高。
战机:速度、燃料可设置(目前两种战机燃料设为相等),位置从四面八方随机进入,进入到一列等候,大战机加入大战机的等候队列,队列满则继续等待(队列大小可以改变),小战机加入小战机的队列,队列满则继续等待,各自在队列按优先级排列。
一个大船坞:从大战机队列取出大战机,如果没有就取小战机队列的,
四个小船坞:只取小战机队列,
船坞空了就允许战机进入加满燃料然后飞回原来位置, 空中飞行的战机燃料空了就爆炸。
1、模型
飞船船坞:名称,型号,位置,燃料等
public class FighterGround
{
private Positionposition;
private Stringname;
private Fighterfighter;//停靠的战机
private int rangyou=1000;
private int size;
private boolean isOpen=true;//是否开启船坞
战机:名称,型号,位置,燃料等
public class Fighter extends JLabelimplements Comparable<Fighter>
{
private int speed = 1;// 移动速度
private Iconicon = new ImageIcon("horse2.gif");
private Positionposition;//初始时位置
private int rangyou=2000;
private Stringname;
private int xinghao;//战机型号
private Stringstatus="flying";
private int flyin=0;//飞进等候队列的顺序
private int fighterGroundNum=0;//标示哪个船坞允许降落
调度系统就是战机在队列的优先级
目前两种
public int compareTo(Fighterfighter)//1按燃油多少
{
return this.rangyou >fighter.getRangyou() ? 1 : this.rangyou <fighter.getRangyou() ?-1
: 0;
}
public int compareTo(Fighterfighter)//2先进先出
{
return this.getFlyin() >fighter.getFlyin() ? 1 : this.getFlyin() <fighter.getFlyin() ? -1
: 0;
}
位置:x,y,z
队列: 大战机队列priorityBigFighterQueue小战机队列 PriorityBlockingQueue
2、编程(java)
根据模型编程,五个船坞由五条线程启动、战机也是由线程启动,战机线程由线程池管理,主函数初始化各种参数,由线程池启动战机线程,还有船坞线程,多个战机线程与五个船坞线程相当于两个进程,两个进程间通过共享内存方式通信,战机有五个状态(flying flyin canpark park flyout)分别是飞行中、飞进队列、允许停靠、正在停靠、飞走离开。通过判断战机状态来进行调度操作。
船坞发现自己属性private Fighterfighter;//停靠的战机
为空时就马上从队列中取出战机(大船坞先从大船坞队列取,没有则从小船坞队列取),判断是否死亡,不死亡就把它状态改为canpark,并设定战机停靠的是哪个船坞,然后战机线程那边从远方飞到等候队列位置,发现自己状态从flying变为canpark就会飞到允许它停靠的船坞,然后把自己状态改为park停靠中,然后船坞给他加燃料加满到初始值,就飞走。再把状态改为flyout,然后船坞把自己停靠的战机设为null,接着又发现自己空了重复上述步骤。。。飞机飞行途中死亡就运行完一次了这线程,然后线程池又可以利用这线程而不用new了。
其中线程池控制了战机飞进队列的最大限度,里面各种参数都能提供接口让外部输入改变,比如线程池大小、船坞战机各自参数,数量。其中调度算法可通过继承战机类来扩展,可通过改变compareTo方法实现
源码连接:http://code.taobao.org/svn/FlyModal/