Сомнительное исключение в алгоритме виртуального графа

Хорошо, в этом упражнении в методе getWeightToEnd () есть ошибка. Я хотел бы знать, почему эта ошибка происходит, и что я мог сделать, чтобы исправить это. Ниже я прикрепил определенный метод, весь мой код и ловушку возникающего исключения.

  public double getWeightToEnd(EstadoNave actual, EstadoNave endVertex, Function<EstadoNave, Double> goalDistance,
    Set<EstadoNave> goalSet) {
// TODO
 //double r = 0;
    if (actual == null || endVertex == null)

        //revisar este método

        throw new IllegalArgumentException("El vértice actual y final no pueden ser null");


    // TODO
    double r =actual.getDistancia(endVertex);



    return r;
       }


  }

OBJETOHANGAR:

    public class ObjetoHangar implements Comparable<ObjetoHangar>{

String nombre;
List<String> caracteristicas;
private Float danyo;
private Float peso;

public ObjetoHangar(String id, List<String> caracteristicas, Float peso, Float danyo) {
    this.nombre = id;
    this.caracteristicas = caracteristicas;
    this.peso = peso;
    this.danyo = danyo;

}

public ObjetoHangar(String id, List<String> caracteristicas, Float peso) {
    this.nombre = id;
    this.caracteristicas = caracteristicas;
    this.peso = peso;
    this.danyo = 0f;

}

public String getNombre(){
    return nombre;
}

public Float getDanyo() {
    return danyo;
}
public List<String> getCaracteristicas(){
    return caracteristicas;
}

public void setDanyo(Float danyo) {
    this.danyo = danyo;
}

public Float getPeso() {
    return peso;
}

public void setPeso(Float peso) {
    this.peso = peso;
}

public String toString() {
    return "Arma [id=" + nombre + ", peso=" + peso + ", daño=" + danyo + "]";
}





@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((caracteristicas == null) ? 0 : caracteristicas.hashCode());
    result = prime * result + ((danyo == null) ? 0 : danyo.hashCode());
    result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
    result = prime * result + ((peso == null) ? 0 : peso.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof ObjetoHangar))
        return false;
    ObjetoHangar other = (ObjetoHangar) obj;
    if (caracteristicas == null) {
        if (other.caracteristicas != null)
            return false;
    } else if (!caracteristicas.equals(other.caracteristicas))
        return false;
    if (danyo == null) {
        if (other.danyo != null)
            return false;
    } else if (!danyo.equals(other.danyo))
        return false;
    if (nombre == null) {
        if (other.nombre != null)
            return false;
    } else if (!nombre.equals(other.nombre))
        return false;
    if (peso == null) {
        if (other.peso != null)
            return false;
    } else if (!peso.equals(other.peso))
        return false;
    return true;
}

@Override
public int compareTo(ObjetoHangar o) {
    int res = 0;

    if(this.getPeso() > o.getPeso()){
        res = 1;
    } else{
        res = -1;
    }

    return res;
}

}

// ESTADOHANGAR

    public class EstadoNave implements VirtualVertex<EstadoNave, SimpleEdge<EstadoNave>> {

static List<ObjetoHangar> hangar;
private List<ObjetoHangar> armas_seleccionadas;
private int arma_i;
private List<String> requisitos; //lista de requisitos en el momento

public static EstadoNave create(){
    return new EstadoNave();
}
public EstadoNave() {
    //TODO
    armas_seleccionadas= new ArrayList<ObjetoHangar>();
    arma_i=0;
    requisitos=new ArrayList<String>();
}

public EstadoNave(List<ObjetoHangar> armas_seleccionadas, int arma_i, List<String>requisitos) {
    // TODO
    super();
    this.armas_seleccionadas=armas_seleccionadas;
    this.arma_i=arma_i; //tengo que añadir a estos constructores los requisitos/necesidades
    this.requisitos=requisitos;


}
public List<ObjetoHangar> getArmasSeleccionadas(){
    return armas_seleccionadas;
}


@Override
public boolean isValid() {//está bien
    // TODO
    return true;
}

@Override
public Set<EstadoNave> getNeighborListOf() {
    Set<EstadoNave> ret = Sets.newHashSet();

    // TODO
    if(arma_i<hangar.size()){
        EstadoNave es= new EstadoNave(armas_seleccionadas, arma_i+1, requisitos);
        es.armas_seleccionadas.add(hangar.get(arma_i));
        ret.add(es);
        EstadoNave esn= new EstadoNave(armas_seleccionadas, arma_i+1, requisitos);
        ret.add(esn);
    }

    return ret;
}

@Override
public Set<SimpleEdge<EstadoNave>> edgesOf() {
    // TODO
    Set<EstadoNave>vecinos= getNeighborListOf();
    Set<SimpleEdge<EstadoNave>> ret= new HashSet<>();
    for(EstadoNave vecino:vecinos){
        SimpleEdge<EstadoNave> arista=SimpleEdge.<EstadoNave>create(this, vecino);
        ret.add(arista);
    }
    return ret;


}

@Override
public boolean isNeighbor(EstadoNave e) {
    // TODO
    return getNeighborListOf().contains(e);
}

public Integer getDistancia(EstadoNave e){ 
    List<ObjetoHangar> armasprobables= new ArrayList<ObjetoHangar>();
    int i;
    int j;
    for(i=0;i<armasprobables.size();i++){
        ObjetoHangar arma_analizada=armasprobables.get(i);
        for(j=0;i<arma_analizada.getCaracteristicas().size();j++){
            if(requisitos.contains(arma_analizada.getCaracteristicas().get(j))){
                armasprobables.add(arma_analizada);
            }

        }
    }
    //coger mínimo de armasprobables. De todas las armas que he guardado tengo que escoger la que pese menos
    return (int)armasprobables.stream().filter(x->x.getPeso()!=null).mapToDouble(x->x.getPeso()).min().orElse(0);
}
@Override
public String toString() {
    return "EstadoNave [armas_seleccionadas=" + armas_seleccionadas + ", arma_i=" + arma_i + ", requisitos="
            + requisitos + "]";
}

}

GRAPHONE

      public class GrafoNave extends UndirectedSimpleVirtualGraph<EstadoNave, SimpleEdge<EstadoNave>>
             implements AStarGraph<EstadoNave, SimpleEdge<EstadoNave>> {

         public static GrafoNave create(EdgeFactory<EstadoNave,SimpleEdge<EstadoNave>> edgeFactory){
    return new GrafoNave(edgeFactory);
}

      public GrafoNave(EdgeFactory<EstadoNave, SimpleEdge<EstadoNave>> edgeFactory) {
    super(edgeFactory);
}

@Override
public double getEdgeWeight(SimpleEdge<EstadoNave> e) {
    // TODO 
    return 0;

}

@Override
public double getVertexWeight(EstadoNave vertex) {//tengo que ir recorriendo las armas de la lista de armas_seleccionadas
    //y devolver la suma de los pesos
    // TODO
    double sumapesos = 0;
    int i;
    for(i=0;i<vertex.getArmasSeleccionadas().size();i++){
        sumapesos=vertex.getArmasSeleccionadas().get(i).getPeso();
    }

    return sumapesos;
}

@Override
public double getVertexWeight(EstadoNave vertex, SimpleEdge<EstadoNave> edgeIn, SimpleEdge<EstadoNave> edgeOut) {
    // TODO
    return 0;
}


@Override
public double getWeightToEnd(EstadoNave actual, EstadoNave endVertex, Function<EstadoNave, Double> goalDistance,
        Set<EstadoNave> goalSet) {
    // TODO
     //double r = 0;
        if (actual == null || endVertex == null)

            //revisar este método

            throw new IllegalArgumentException("El vértice actual y final no pueden ser null");


        // TODO
        double r =actual.getDistancia(endVertex);



        return r;
}


      }

CLASETEST

             public class TestViajeInterestelar {
               public static EstadoNave pInicial;

//public static EstadoNave pObjetivo;

public static void main(String[] args) {

    // TODO: Inicializa el problema hangar y requisitos
    //A) REQUISITOS
    List<String> requisitos= Lists.newArrayList("Laser", "Ligera", "Paralizante",
            "Cuerpo-Cuerpo");
    //B)HANGAR
    List<ObjetoHangar> hangar= new ArrayList<ObjetoHangar>();
    ObjetoHangar arma1= new ObjetoHangar("P-90", Lists.newArrayList("Laser", "Ligera"), 150f, 750f);
    ObjetoHangar arma2= new ObjetoHangar("P-90", Lists.newArrayList("Laser", "Ligera"), 250f, 650f);
    ObjetoHangar arma3= new ObjetoHangar("Disruptor kull", Lists.newArrayList("Paralizante", "Ligera"),
            250f, 500f);
    ObjetoHangar arma4= new ObjetoHangar("Zat", Lists.newArrayList("Laser", "Paralizante", "Cuerpo-Cuerpo"),220f,350f);
    hangar.add(arma1);
    hangar.add(arma2);
    hangar.add(arma3);
    hangar.add(arma4);
    // TODO: Crear estado inicial vacio

    pInicial=EstadoNave.create();

    // TODO: Generar function
    Function<EstadoNave, Double> function = (e -> {
        if (requisitos.stream().allMatch(req ->
         e.getArmasSeleccionadas().stream().anyMatch(arma ->
         arma.caracteristicas.contains(req)))) {
        return 0.0;
        } else {
        return Double.MAX_VALUE; //aquí también tengo que revisar
        }
        });

    System.out.println(pInicial);
   // System.out.println(function);

    // TODO: Crear grafo AStart
    AStarGraph<EstadoNave,SimpleEdge<EstadoNave>> graph = GrafoNave.create(SimpleEdge::create);

    // TODO: Crear Algoritmo AStar y le pasamos el grafo, el estado inicial
    // y el function
    AStarAlgorithm<EstadoNave,SimpleEdge<EstadoNave>> alg = Algoritmos.createAStar(graph, pInicial, function);

    if (alg.getPath() == null) {
        System.out.println("No se encuentra solución");
    } else {
        System.out.println(
                "Danyo: " + alg.getPathLength() + ":" + alg.getPath().getEndVertex().getArmasSeleccionadas());
    }
}

} Вложение фиксирует исключение, которое возникает при выполнении кода следующим образом: introducir la descripción de la imagen aquí

-1
задан 07.01.2017, 19:01
0 ответов

Относительно решения (состоя в том, что ты говоришь, что там - ошибка):

return (int) armasprobables.stream().mapToDouble(x->x.getPeso()).min().getAsDouble();

Это может производить тебе 2 различные ошибки:

  1. java.util.NoSuchElementException: No value present если armasprobables будь пустым.
  2. java.lang.NullPointerException если getPeso() возврати null для оружия в списке.

Он тебе коснется решать, что ты хочешь сделать в этих ситуациях.

Например, если список пустой, возможно захоти возвратить какую-то стоимость как 0. Ты можешь делать это используя метод orElse() вместо getAsDouble():

return (int) armasprobables
    .stream()
    .mapToDouble(x -> x.getPeso())
    .min()
    .orElse(0); // devuelve el mínimo, o 0 si la lista está vacía.

И относительно песо, которые в null, возможно захоти проигнорировать их. Ты можешь делать это выдавая stream с filter() чтобы игнорировать песо, которые в null:

return (int) armasprobables
    .stream()
    .filter(x -> x.getPeso() != null) // ignora pesos a null
    .mapToDouble(x -> x.getPeso())
    .min()
    .orElse(0); // devuelve el mínimo, o 0 si la lista contiene solo nulls o está vacía.

Редактирование

Сейчас, когда ты существуешь включая больше информации относительно ошибки + stack наметила, остается ясным, что за ошибкой не последует где indicastes.

Ошибка и stack наметил - блики. Ошибка происходит в классе GrafoNave в методе getWeightToEnd() в следующей части:

if (actual == null || endVertex == null)

            //revisar este método

            throw new IllegalArgumentException("El vértice actual y final no pueden ser null");

... уже разум очевидный. Одна из переменных actual или endVertex будь в null. Сообщение больше, чем просвет.

То есть никогда не удается работать методу getDistancia().

Он тебе коснется спорить почему actual или endVertex они в null и упорядочивать это. Как только ты это сделал, сейчас да, будет работать метод getDistancia() и возможно, что то, что я прокомментировал тебе более наверху, подает тебя.

2
ответ дан 03.12.2019, 17:50