logger.log(Level.INFO, "Detailed estimate for: " + ce);
    public boolean planTask() {	ReadOnlyWorld w = aiClient.getWorld();	// don't bother to do anything at all unless we have at least	// MIN_BALANCE in the bank	BankAccount ba = (BankAccount) w.get(KEY.BANK_ACCOUNTS, 0,	       	aiClient.getPlayerPrincipal());	if (ba.getCurrentBalance() < MIN_BALANCE) 	    return false;		initialise();		if (shouldRebuildCache) {	    rebuildCache();	    shouldRebuildCache = false;	    dumpTop10();	}	/* Calculate a detailed estimate for the best route */	if (cityDistances.isEmpty())	    return false;	CityEntry ce = (CityEntry) cityDistances.get(0);	if (! ce.detailedEstimate) {	    doDetailedCostEstimation(ce);	    logger.log(Level.INFO, "Detailed estimate for: " + ce);	}	if (! ce.detailedEstimate) {	    // no route was possible - ditch this route, and bail out - we	    // will try again next time	    cityDistances.remove(0);	    return false;	}	// are we better than the last route?	Collections.sort(cityDistances);	ce = (CityEntry) cityDistances.get(0);	if (ce.detailedEstimate) {	    // this route must be the best one	    logger.log(Level.INFO, "The best route is:" + ce);	    taskPlan = ce;	    return true;	}	return false;    }