📄 taskhandler.java
字号:
package MRL.Police;import yab.agent.*;import yab.agent.object.*;import java.util.*;public class TaskHandler implements PoliceConstantsAndConditions{ private DisasterSpace world; private EPoliceForce self; public TaskHandler(EPoliceForce self){ this.world = self.world; this.self = self; freePolices = self.freePolices; initTasks(); } private EPoliceForce self() {// return (EPoliceForce) world.self; return self; } private int time(){ return world.time(); } private final Map <PoliceForce , ArrayList[] > polTaskTimeFinishedTimeMap = new HashMap(); // Center Assigned Tasks&Times&FinishedTime private final Map <PoliceForce , Integer []> currentPolTaskTimeMap = new HashMap(); private int myCurrentAssignedTask = -1 ; private int myCurrentAssignedTaskTime = -1; private int myCurrentDecidedTaskTime = 0; private int myCurrentDecidedTask = 0; private final List freePolices; private void initTasks(){ PoliceForce pf; for(Iterator it = freePolices.iterator();it.hasNext();){ pf = (PoliceForce) it.next(); initPF(pf); } } private void initPF(PoliceForce pf){ ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks , times , finishedTime; taskTimeFinishedTimeMap = new ArrayList [3]; tasks = new ArrayList(); times = new ArrayList(); finishedTime = new ArrayList(); taskTimeFinishedTimeMap[0]=tasks ; taskTimeFinishedTimeMap[1]=times ; taskTimeFinishedTimeMap[2]=finishedTime ; polTaskTimeFinishedTimeMap.put(pf,taskTimeFinishedTimeMap); } public int getLastPoliceTask(PoliceForce pf){ ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks; int indx ; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); tasks = taskTimeFinishedTimeMap[0]; indx =tasks.size() -1; return ((Integer)tasks.get(indx)).intValue(); } public int getLastPoliceTaskStartTime(PoliceForce pf){ ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks , times; int indx ; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); tasks = taskTimeFinishedTimeMap[0]; times = taskTimeFinishedTimeMap[1]; indx =tasks.size() -1; return ((Integer)times.get(indx)).intValue(); } public int getLastPoliceTaskFinishedTime(PoliceForce pf){ ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks ,finishedTime; int indx ; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); tasks = taskTimeFinishedTimeMap[0]; finishedTime = taskTimeFinishedTimeMap[2]; indx =tasks.size() -1; if(indx >= finishedTime.size()) return -1; return ((Integer)finishedTime.get(indx)).intValue(); } public void updateTasks(){ PoliceForce pf;// RealObject self = self(); int curTask , curTaskStTime ,tTask; for(Iterator it = freePolices.iterator();it.hasNext();){ pf = (PoliceForce) it.next(); if(! polTaskTimeFinishedTimeMap.containsKey(pf)) initPF(pf); if(isLastTaskAssignedByCenterDone(pf)){ currentPolTaskTimeMap.remove(pf); }else{ curTask = getCurrentPoliceTaskAssignedByCenter(pf); tTask = getLastPoliceTask(pf); if(curTask != tTask){// System.err.println(self() + " Error , Tasks Doesnt Match For : " + pf + " . Current Task : " + curTask + " , Last Task : " + tTask);// System.out.println(self() + " Correctint Task For : " + pf); curTask = tTask; curTaskStTime = getLastPoliceTaskStartTime(pf); setCurrentTask(pf,curTask,curTaskStTime); } } } } private void setCurrentTask(PoliceForce pf , int task , int time){ currentPolTaskTimeMap.remove(pf); Integer [] taskTime = new Integer[2]; Integer ctask = new Integer(task) , ctime = new Integer(time); taskTime[0] = ctask; taskTime[1] = ctime; currentPolTaskTimeMap.put(pf,taskTime); } public int getCurrentPoliceTaskAssignedByCenter(PoliceForce pf){ Integer [] taskTime = currentPolTaskTimeMap.get(pf); if(taskTime == null) return -1; return taskTime[0]; } public int getCurrentPoliceTaskAssignedByCenterStartTime(PoliceForce pf){ Integer [] taskTime = currentPolTaskTimeMap.get(pf); if(taskTime == null) return -1; return taskTime[1]; } public List getFreePolicesInTask(int task){ List res = new ArrayList(); Integer [] taskTime; int ptask; PoliceForce pf; for(Iterator it = currentPolTaskTimeMap.keySet().iterator();it.hasNext();){ pf = (PoliceForce) it.next(); taskTime = currentPolTaskTimeMap.get(pf); ptask = taskTime[0]; if(ptask == task) res.add(pf); } return res; } public int getFreePolicesInTaskCount(int task){ int res = 0; Integer [] taskTime; int ptask; PoliceForce pf; for(Iterator it = currentPolTaskTimeMap.keySet().iterator();it.hasNext();){ pf = (PoliceForce) it.next(); taskTime = currentPolTaskTimeMap.get(pf); ptask = taskTime[0]; if(ptask == task) res++; } return res; } public List getWithoutTaskFreePolices(){ List res = new ArrayList(freePolices); res.removeAll(currentPolTaskTimeMap.keySet()); return res; } public int getWithoutTaskFreePolicesCount(){ int res = freePolices.size(); res -= currentPolTaskTimeMap.keySet().size(); return res; } public boolean isLastTaskAssignedByCenterDone(PoliceForce pf){ ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks , times, finishedTime; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); if(taskTimeFinishedTimeMap == null){ initPF(pf); taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); } tasks = taskTimeFinishedTimeMap[0]; times = taskTimeFinishedTimeMap[1]; finishedTime = taskTimeFinishedTimeMap[2]; return (finishedTime.size() == tasks.size()); } public void setTaskAssignedByCenterFinished(PoliceForce pf , int finishTime){ if(isLastTaskAssignedByCenterDone(pf)){ System.err.println(self() + " , Task Is Already Done For : " + pf + " In : " + getLastPoliceTaskFinishedTime(pf) + " , Time : " + time()); return; } ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks , times, finishedTime; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); finishedTime = taskTimeFinishedTimeMap[2]; finishedTime.add(new Integer(finishTime)); currentPolTaskTimeMap.remove(pf); if(!isLastTaskAssignedByCenterDone(pf)){ System.err.println(self() + " , Error , Task Didn't Set Finished For : " + pf); return; } if(pf == self()){ myCurrentAssignedTask =-1; myCurrentAssignedTaskTime = -1; } } public void setNewTaskAssignedByCenter(PoliceForce pf , int task){ if(!isLastTaskAssignedByCenterDone(pf)){ System.err.println(self() + " , Previous Task Is Not Done For : " + pf + " , Assign Time : " + getLastPoliceTaskStartTime(pf) + " , Time : " + time()); return; } ArrayList [] taskTimeFinishedTimeMap; ArrayList tasks , times, finishedTime; taskTimeFinishedTimeMap = polTaskTimeFinishedTimeMap.get(pf); tasks = taskTimeFinishedTimeMap[0]; times = taskTimeFinishedTimeMap[1]; tasks.add(new Integer(task)); times.add(new Integer(time())); if(isLastTaskAssignedByCenterDone(pf)){ System.err.println(self() + " , Error , Task Didn't Set For : " + pf); return; } if(pf == self()){ setNewAssignedTaskToMe(task,time()); // System.out.println(self() + " , Task Assigned : " + task + " , In Time : " + time()); } anyTaskAssigned = true; } private void setNewAssignedTaskToMe(int task , int time){ myCurrentAssignedTask = task; myCurrentAssignedTaskTime = time; myCurrentDecidedTask = -1; myCurrentDecidedTaskTime = -1; } public boolean isMyLastCenterAssignedTaskDone(){ return isLastTaskAssignedByCenterDone(self()); } public void setNewDecidedTaskToMe(int task){ if(! isMyLastCenterAssignedTaskDone()){ // System.err.println(self() + " , Prev Task Assigned By Center Is'nt Done ."); return; } myCurrentDecidedTask = task; myCurrentDecidedTaskTime = time(); myCurrentAssignedTask = -1; myCurrentAssignedTaskTime = -1; } public int myCurrentTask(){ if(myCurrentAssignedTask != -1) return myCurrentAssignedTask; else return myCurrentDecidedTask; } public int myCurrentTaskTime(){ if(myCurrentAssignedTask != -1) return myCurrentAssignedTaskTime; else return myCurrentDecidedTaskTime; } public void setTaskAssignedByCenterFinishedForMe(){ setTaskAssignedByCenterFinished(self(),time()); } public boolean isCurrentTaskTimedout(){ return time() - myCurrentTaskTime() > TASK_TIMEOUT_PERIOD; } private boolean anyTaskAssigned = false; public boolean isAnyTaskAssignedByCenter(){ return anyTaskAssigned; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -