// Last edited on 2000-09-03 04:08:00 by stolfi // Critério de parada padrão public class CriterioDeParadaPadrao extends CriterioDeParada { private Nodo[] destino; // Destinos almejados, ou null. private int nRestam; // Número de destinos que resta encontrar private TipoDeServico tipo; // Tipo dos serviços desejados. private double custoMax; // Custo máximo aceitável. private int numDesejado; // Número desejado de respostas. private double ultimoCusto; // Custo do último nó examinado. private double numEncontrado; // Número de nós aceitáveis já vistos. // Construtores public CriterioDeParadaPadrao(Nodo[] dest, int nDes) // Neste critério, apenas os nós de destino indicados são aceitáveis. // A busca termina quando foram vistos "nDes" nós aceitáveis. { this.nRestam = dest.length; this.destino = new Nodo[nRestam]; for (int i = 0; i < nRestam; i++) { this.destino[i] = dest[i]; } this.numDesejado = nDes; this.tipo = null; this.custoMax = Double.MAX_VALUE; this.numEncontrado = 0; this.ultimoCusto = -1.0; } public CriterioDeParadaPadrao(TipoDeServico tipo, double cMax, int nDes) // Neste critério, um nó é aceitável se ele é um nó de serviço // do "tipo" indicado, e seu custo é menor ou igual a "cMax". A // busca termina quando foram vistos "nDes" nós aceitáveis. { this.nRestam = 0; this.destino = null; this.custoMax = cMax; this.tipo = tipo; this.numDesejado = nDes; this.numEncontrado = 0; this.ultimoCusto = -1.0; } public final boolean aceitavel(Nodo u) { this.ultimoCusto = u.custoTot; if (u.custoTot > this.custoMax) { return false; } else { boolean r = false; if ((tipo != null) && (u instanceof NodoServico)) { Servico s = ((NodoServico) u).servico; r = r || (s.tipo() == tipo); } if ((! r) && (nRestam > 0)) { for (int i = 0; (i < nRestam) && (!r); i++) { if (u == this.destino[i]) { r = true; nRestam--; this.destino[i] = this.destino[nRestam]; } } } if (r) { numEncontrado++; } return r; } } public final boolean satisfeito() { return (this.numEncontrado >= this.numDesejado) || (this.ultimoCusto >= this.custoMax); } }