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

📄 ambulancecenteragent.java

📁 2004年robotcup世界冠军源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package MRL.Ambulance;/** * Creat By Omid AmirGhiasvand: * 3 Apr 2006 * * Last Edit: * 2006-06-12 * 3:38 am * */import java.net.*;import yab.agent.*;import yab.agent.object.*;import MRL.Utilities.MessageManagement.CenterMessageManager;import java.util.*;public class AmbulanceCenterAgent extends AbstractAmbulanceCenterAgent {    private CenterMessageManager messageManager;    public AmbulanceCenterAgent(InetAddress address, int port) {        super(address, port);        messageManager = new CenterMessageManager(socket(), world);        socket().akAcknowledge(self().id);    }    protected void hear(RealObject sender, String msg) {    }    protected void hearTell(RealObject sender, String msg) {    }    protected void hearTellBin(RealObject sender, byte[] message) {        if (!(sender instanceof AmbulanceCenter)) {            messageManager.importMessage(message, time(), sender);        }    }    //////////////////////////////////////////////////////////////////////////////    private HashSet freeAmbulances = new HashSet();    private ArrayList civilianVictimSet = new ArrayList();    private ArrayList agentVictimSet = new ArrayList();    private ArrayList buridAT = new ArrayList();    private ArrayList buridPF = new ArrayList();    private ArrayList buridFB = new ArrayList();    private ArrayList targetSet = new ArrayList();    private ArrayList agentTargetSet = new ArrayList();    private HashSet tempBuriedAgentSet = new HashSet();  ////?????????    private HashSet noNeedRescue = new HashSet();    private HashSet noNeedRescueAgent = new HashSet();    private Humanoid lastTarget;      protected void prepareForAct() {          super.prepareForAct();          updateAmbulances();          checkAgentTargetSet();          checkTargetSet();          rescueVictim();          messageManager.sendMessages();      }      private void updateAmbulances()      {         freeAmbulances.clear();         for (Iterator it = world.ambulanceTeams.iterator() ; it.hasNext();)         {            AmbulanceTeam at = (AmbulanceTeam)it.next();           if (at.buriedness()==0)           {               if (at.myAssignedTarget == null)               {                   freeAmbulances.add(at);                   at.setTimeToGetFree(0);               }               else               {                   updateTimeToGetFree(at);               }           }         }      }      /**       *       *   ?????????????????????????????????????????????????????????????????????       */      private void updateTimeToGetFree(AmbulanceTeam at )      {          if (at.myAssignedTarget!=null)          {                      at.setTimeToGetFree((int) java.lang.Math.ceil(at.myAssignedTarget.                      buriedness() /at.myAssignedTarget.ambulanceAssigned.size())+3);          }      }      public void act() throws ActionCommandException      {          super.act();          if (time()==3)          System.out.println("  MRL MRL MRL MRL MRL MRL MRL MRL MRL MRL MRL  ");      }      private void checkAgentTargetSet()      {          if (agentTargetSet.isEmpty()|| freeAmbulances.isEmpty())              return;          updateAgentTargetSet();          if (agentTargetSet.isEmpty())              return;          for (Iterator it = agentTargetSet.iterator();it.hasNext();)          {              Humanoid tar = (Humanoid)it.next();              if (tar.ambulanceAssigned.size() <3 && tar.buriedness()>=12)                  assingAmbulancesToBuridAgent(tar);          }      }      private void updateAgentTargetSet()      {          HashSet finishedTarget = new HashSet();         for (Iterator it = agentTargetSet.iterator() ; it.hasNext();)         {            Humanoid hum  = (Humanoid )it.next();            if (hum.buriedness()<=3*hum.ambulanceAssigned.size())               finishedTarget.add(hum);         }         agentTargetSet.removeAll(finishedTarget);         noNeedRescueAgent.addAll(finishedTarget);      }////////////////////////////////////////////////////////////////////////////////////////////      private void checkTargetSet()      {          if (targetSet.isEmpty()|| freeAmbulances.isEmpty())              return;         updateTargetSet();         if (lastTarget!= null)         {            updateHumanoidProperty(lastTarget);            if (lastTarget.ambulanceAssigned.size()<lastTarget.getNoOfAmbulanceThatNeededToRescueMe())            {                 assignAmbulance(lastTarget);            }         }         if (freeAmbulances.isEmpty())              return;          for(Iterator it = targetSet.iterator(); it.hasNext();)          {              Humanoid tar = (Humanoid)it.next();                  updateHumanoidProperty(tar);                  if (tar.ambulanceAssigned.size() <tar.getNoOfAmbulanceThatNeededToRescueMe())                    {                        assignAmbulance(tar);                    }          }      }      private void updateTargetSet()      {          HashSet finishedTarget = new HashSet();          for (Iterator it = targetSet.iterator() ; it.hasNext();)          {              Humanoid hum  = (Humanoid )it.next();              if (hum.buriedness()<=3*hum.ambulanceAssigned.size())                  finishedTarget.add(hum);          }          targetSet.removeAll(finishedTarget);          noNeedRescue.addAll(finishedTarget);      }      private void assignAmbulance(Humanoid target)      {          if (freeAmbulances.isEmpty())              return;          while(target.getNoOfAmbulanceThatNeededToRescueMe()>target.ambulanceAssigned.size() &&                 !freeAmbulances.isEmpty()  )          {             AmbulanceTeam at =selectAmbulanceToAssign(target);              if (at==null)              {                  break;              }              else              {                 messageManager.reportTarget(at,target);                 at.myAssignedTarget=target;                 freeAmbulances.remove(at);                 target.ambulanceAssigned.add(at);                 at.setTargetAssignmentTime(time());              }          }      }///////////////////////////////////////////////////////////////////////////////////////////      private AmbulanceTeam selectAmbulanceToAssign(Humanoid tar)      {          if (freeAmbulances.isEmpty() )            return null;          List res = new ArrayList();          for (Iterator it = freeAmbulances.iterator() ; it.hasNext();)          {              AmbulanceTeam at = (AmbulanceTeam)it.next();              if (isAccesibleFromTo(at,tar.motionlessPosition())){                  res.add(at);              }//              else//                 System.out.println("** AT :"+at.id +"  CAN'T ACCESS TARGET :"+tar.id + "   IN TIME:"+time());          }          if(res.isEmpty())              return null;          else{              List poses = POSITION_PRP.collect(res);              Route rt = Router.get(tar.motionlessPosition(),poses,MOVING_COST_FUNCTION);              MotionlessObject mo = rt.end;              res = POSITION_PRP.equal(mo).extract(res);              return (AmbulanceTeam) res.iterator().next();          }      }      private void rescueVictim()      {         if (!freeAmbulances.isEmpty())         {             updateBuridAgent();             rescueAgentsTargets();             updateBuridCivilian();             rescueCivilianTargets();         }      }      private void updateBuridAgent()      {          if (world.buriedAgents.isEmpty())              return;          agentVictimSet.clear();          agentVictimSet.addAll(world.buriedAgents);          agentVictimSet.removeAll(agentTargetSet);          agentVictimSet.removeAll(noNeedRescueAgent);      }      private void updateBuridCivilian()      {          civilianVictimSet.clear();          for (Iterator it = world.civilians.iterator();it.hasNext();)          {              Humanoid hum = (Humanoid)it.next();              if (hum.position()==null)                  continue;               if ((hum.motionlessPosition() instanceof Building) && hum.assigned==false )               {                    Building bld = (Building)hum.motionlessPosition();                     if ((hum.needRescue()|| hum.needLoad() )&& !bld.isBurned() &&(!bld.isBurning()|| hum.buriedness()<5 ))                         {                             updateHumanoidProperty(hum);                         //   if  (hum.getTimeToDead()< 600-time())                             civilianVictimSet.add(hum);                         }               }          }       civilianVictimSet.addAll(tempBuriedAgentSet);       civilianVictimSet.removeAll(noNeedRescue);       civilianVictimSet.removeAll(targetSet);       Collections.sort(civilianVictimSet,timeToDeadComparator);//       System.out.println(" ");//       System.out.println("   TIME  FOR UPDATE  >>>>"+ time()+"    Number Of Victim:"+civilianVictimSet.size()+"   Number of Civilian:"+world.civilians.size()          );//       for (Iterator it = civilianVictimSet.iterator() ; it.hasNext();)//       {//           Humanoid hum = (Humanoid)it.next();//           System.out.println("* Civ ID:"+hum.id + "   HP:"+hum.hp()+"   Buridness:"+hum.buriedness()+"  TTD Injured:"+TimeToDeathFromInjury(hum)   +" Real Time To Dead:"+hum.getTimeToDead()  +"    Buridness:"+hum.buriedness()+ "   Is Rescueable:"+isRescueable(hum)+ "   Time:"+hum.hearTime());       //System.out.println(" Injured ID:"+ hum.id +"  Heared Time:"+hum.hearTime() +"  Time:"+hum.time() +"  HP:"+hum.hp() + "  Buridness:"+hum.buriedness()  );////       }      }      private Comparator timeToDeadComparator = new Comparator() {          public int compare(Object o1, Object o2) {              Humanoid h1 = (Humanoid) o1;              Humanoid h2 = (Humanoid) o2;              if (h1.getTimeToDead() > h2.getTimeToDead())                  return 1;              if (h1.getTimeToDead() == h1.getTimeToDead())                  return 0;              return -1;          }      };      private void updateHumanoidProperty(Humanoid hum) {          int timeToDeadFromFire = 301;          int timeToDeadFromInjured = 301;          hum.calDistanceToNearestFire(world.burningBuildings);          if (time() < 48) {              timeToDeadFromInjured = hum.lifespan();          } else {              timeToDeadFromInjured = TimeToDeathFromInjury(hum);          }          timeToDeadFromFire = TimeToDeathFromFire(hum);          if (timeToDeadFromFire < timeToDeadFromInjured &&              hum.distanceToNearestFireSite < 30000 && world.burningBuildings.size()>=8) {              hum.setTimeToDead(timeToDeadFromFire);          } else {              hum.setTimeToDead(timeToDeadFromInjured);          }          hum.updateNoOfAmbulanceThatNeededToRescueMe(world.ambulanceTeams.size());      }      private void rescueAgentsTargets()      {          if (agentVictimSet.isEmpty()|| freeAmbulances.isEmpty())              return;          Humanoid agentTarget = (Humanoid)selectAgentTargets(agentVictimSet);          if (agentTarget!= null)          {            assingAmbulancesToBuridAgent(agentTarget);            agentTargetSet.add(agentTarget);            agentVictimSet.remove(agentTarget);            rescueAgentsTargets();          }          else          {              return;          }      }    private Humanoid selectAgentTargets(ArrayList victimAgent)    {       Humanoid target;       buridAT.clear();       buridFB.clear();       buridPF.clear();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -