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

📄 firebrigadeagent.java

📁 2004年robotcup世界冠军源代码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
package MRL.FireBrigade;import java.net.*;import java.util.*;import java.util.List;import java.awt.*;import yab.agent.*;import yab.agent.object.*;import MRL.Utilities.*;import MRL.Utilities.Partitioning.Partition;import MRL.Utilities.MessageManagement.AgentMessageManager;import MRL.Utilities.MessageManagement.AgentNoStationMessageManager;// Authors : Maziar Sharbafi & Saeed Ansaripublic class FireBrigadeAgent extends AbstractFireBrigadeAgent {    private ArrayList<Building> fires = new ArrayList<Building>();    private ArrayList<FireSite> fireSites = new ArrayList<FireSite>();    private FireSite target = null; //addedf by saeed    private Building target_Building = null;    private int myWaitingTime;    private boolean amISearching = false;    private List<FireBrigade> unBuriedAgents = new ArrayList<FireBrigade>();    private MotionlessObject currentPosition;    private MotionlessObject lastPosition;    private int lastMoveTime = 0;    protected static final Condition            BURNING_CND = FIERYNESS_PRP.gte(1).and(FIERYNESS_PRP.lte(8));    protected static final Condition            ACCESSABLE_BUILDINGS_TO_GO = (FIERYNESS_PRP.gte(4).and(            FIERYNESS_PRP.lte(8))).or(FIERYNESS_PRP.eq(0));//    protected EFireBrigade self() {//        return super.self();    //To change body of overridden methods use File | Settings | File Templates.//    }    //saeed 85-2-3    public FireBrigadeAgent(InetAddress address, int port) {        super(address, port);        world.setBuildingConnections();        Collections.sort(world.fireBrigades, Util.idComparator);        partition();        if (world.fireStations.isEmpty())            messageManager = new AgentNoStationMessageManager(socket(), world);        else            messageManager = new AgentMessageManager(socket(), world);        socket().akAcknowledge(self().id);    }    protected void partition() {        int partIndx = world.fireBrigades.indexOf(self());        int totParts = world.partitioner.getPartitions().size();        if (partIndx >= totParts)            partIndx = random.nextInt(totParts);        Partition part = world.partitioner.getPartition(partIndx);        world.setSearchingPartition(part);    }    protected void hear(RealObject sender, String msg) {        //do nothing;    }    protected void hearTellBin(RealObject sender, byte[] message) {        if (sender.id != self().id)//            if ( (messageManager instanceof AgentMessageManager && sender instanceof FireStation )//                    || messageManager instanceof AgentNoStationMessageManager)            messageManager.importMessage(message, time(), sender);    }    protected void hearTell(RealObject sender, String msg) {        //do nothing    }    protected void prepareForAct() {        super.prepareForAct();        fires.clear();        fires = BURNING_CND.extract(world.buildings);        updatePositionSettings();        updateFireSites();        setValueOfSites(); // added by saeed        messageManager.sendMessages();    }    private void updatePositionSettings() {        if (currentPosition == null) {            currentPosition = self().motionlessPosition();            lastPosition = currentPosition;        } else {            lastPosition = currentPosition;            currentPosition = self().motionlessPosition();        }        if (currentPosition != lastPosition)            lastMoveTime = time();    }    private boolean firstTime = true;    private boolean sitereignit = true;    protected void act() throws ActionCommandException {        super.act();        areSitesFinished();        moveToRefugeIfDamagedOrTankIsEmpty();        extinguishLastPutOutSite();//        extinguishPutOutBuildings();        moreExtinguish();//        selectReachableSites();//        System.out.println("amIsearching self " + self().id + "  " + amISearching );        selectFireSite();        selectTarget();        extinguishTarget();        moveForExtinguish();//        if (target == null) System.err.println("null self " + self().id + " time " + time() );//        System.out.println("amIseraching true before " + self().id + " " + time() );        amISearching = true;//        System.out.println("amIseraching true after " + self().id + " " + time() );        searchCivilians(true);        checkAndReportCivilians();        restAtRefuge();    }    protected void updateFireSites() {        ArrayList newFires = new ArrayList();        for (Iterator it = world.buildings.iterator(); it.hasNext(); ) {            Building build = (Building) it.next();            if ((build.time() > time() - 2 || build.hearTime() > time() - 2) &&                build.fieryness() > 0)                newFires.add(build);        }        for (Iterator it = fireSites.iterator(); it.hasNext(); ) {            FireSite fs = (FireSite) it.next();            fs.updateCauseFieriness();        }        for (Iterator it = newFires.iterator(); it.hasNext(); ) {            Building fire = (Building) it.next();            boolean isForPriviousSites = false;            ArrayList sitesContainThis = new ArrayList();            for (int j = 0; j < fireSites.size(); ++j) {                int test = ((FireSite) fireSites.get(j)).addFire(fire);                if (test != -1) {                    isForPriviousSites = true;                    sitesContainThis.add(new Integer(j));                }            }            if (!isForPriviousSites) {                fireSites.add(new FireSite(fire));            }            if (sitesContainThis.size() > 0) {                FireSite firstSite = (FireSite) fireSites.get(((Integer)                        sitesContainThis.get(0)).intValue());                for (int j = 1; j < sitesContainThis.size(); ++j) {                    int idx = ((Integer) sitesContainThis.get(j)).intValue();                    firstSite.mergeWith((FireSite) fireSites.get(idx));                }                for (int j = sitesContainThis.size() - 1; j > 0; --j) {                    int idx = ((Integer) sitesContainThis.get(j)).intValue();                    fireSites.remove(idx);                }            }        }    }    //added by saeed    private void moveToRefugeIfDamagedOrTankIsEmpty() throws            ActionCommandException {        int requiredWater = 10000;        if (target != null) {            Building nearestRefuge = (Building) distancePrp.min(world.refuges);            if (self().distance(nearestRefuge) <= 140000) {                if (target.getTotalArea() <= 9050)                    requiredWater = 5000;                else                    requiredWater = 15000;            }        }        int fbCount = 0;        if (self().motionlessPosition() instanceof Refuge) {            for (int i = 0; i < world.fireBrigades.size(); i++) {                FireBrigade fb = (FireBrigade) world.fireBrigades.get(i);                if (fb.motionlessPosition() == self().motionlessPosition() &&                    fb.isVisible())                    fbCount++;            }            requiredWater = 16000 - fbCount * 1000;            requiredWater = Util.max(requiredWater, 10000);            if (self().waterQuantity() < requiredWater)                rest();        }        if ((self().damage() > 0 && self().hp() < 5000) ||            self().waterQuantity() == 0) {            restAtRefuge();        }    }    private void setValueOfSites() {        for (Iterator it = fireSites.iterator(); it.hasNext(); ) {            FireSite site = (FireSite) it.next();            site.updateSite(world);            calculateVictimsAroundSite(site);            setValueForSelf(site);        }    }    boolean areSitesFinished = true;    public void selectFireSite() {        if (!fireSites.isEmpty() && firstTime) {            firstTime = false;            amISearching = false;//            System.err.println("set to false " + self().id + " " + time() );        }        if (areSitesFinished) {            target = null;            return;        }        if (!reigniteSites.isEmpty()) {            Collections.sort(reigniteSites, valueComparator);            FireSite igniteSite = null;//            world.sortByID(world.fireBrigades);            sortAgentDistanceToSite(reigniteSites.get(0));//            int myIndex = world.fireBrigades.indexOf(self());            int myIndex = firebrigadesAssignedToDistance.indexOf(self());            int extraWaiting = 0;            if (world.nodes.size() > 1000 && world.nodes.size() < 1500)                extraWaiting = 1;            else if (world.nodes.size() > 1500)                extraWaiting = 2;            switch (myIndex) {            case 0:                myWaitingTime = 0;                break;            case 1:                igniteSite = reigniteSites.get(0);                if (igniteSite.getTotalArea() <= 15000)                    myWaitingTime = 3;                else                    myWaitingTime = 2;                if (amISearching)                    myWaitingTime = 0;                break;            case 2:                igniteSite = reigniteSites.get(0);                if (igniteSite.getTotalArea() <= 25000)                    myWaitingTime = 6;                else                    myWaitingTime = 4;                if (amISearching)                    myWaitingTime = 0;                break;            case 3:                if (reigniteSites.size() == 1) {                    igniteSite = reigniteSites.get(0);                    if (igniteSite.getTotalArea() <= 35000)                        myWaitingTime = 8 + extraWaiting;                    else                        myWaitingTime = 6 + extraWaiting;                }                if (amISearching)                    myWaitingTime = 0;                break;            case 4:                if (reigniteSites.size() == 1) {                    igniteSite = reigniteSites.get(0);                    if (igniteSite.getTotalArea() <= 45000)                        myWaitingTime = 10 + extraWaiting;                    else                        myWaitingTime = 8 + extraWaiting;                } else {                    target = reigniteSites.get(1);                    return;                }                if (amISearching)                    myWaitingTime = 0;                break;            case 5:                if (reigniteSites.size() == 1) {                    igniteSite = reigniteSites.get(0);                    if (igniteSite.getTotalArea() <= 50000)                        myWaitingTime = 12 + extraWaiting;                    else                        myWaitingTime = 10 + extraWaiting;                } else {                    target = reigniteSites.get(1);                    return;                }                if (amISearching)                    myWaitingTime = 0;                break;            case 6:                if (reigniteSites.size() == 1) {                    igniteSite = reigniteSites.get(0);                    if (igniteSite.getTotalArea() <= 45000)                        myWaitingTime = 13 + extraWaiting;                    else                        myWaitingTime = 11 + extraWaiting;                } else {                    target = reigniteSites.get(1);                    return;                }                if (amISearching)                    myWaitingTime = 0;                break;            case 7:                if (reigniteSites.size() == 1) {                    igniteSite = reigniteSites.get(0);

⌨️ 快捷键说明

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