/** * Agrega al ClienteCap2 <code>c</code> los dos cliente mas cercanos. * * <p>El método se encarga invocar a <code>setClieteMasCercano1</code>, <code>setClieteMasCercano2 * </code> de <code>ClienteCap2</code> * * @param c <code>ClienteCap2</code> donde contiene toda la información del problema a resolver. * @return Devuelve <code>c</code> con la información de los dos clientes mas cercanos. */ private ClienteCap2 addClientesMasCercanos(ClienteCap2 c) { Iterator<ClienteCap2> it = this.clientes.iterator(); int distanciaMasCercano1 = Integer.MAX_VALUE; int distanciaMasCercano2 = Integer.MAX_VALUE; while (it.hasNext()) { ClienteCap2 clientetmp = it.next(); if ((Distancia.getInstancia().getDistancia(clientetmp.getNodo(), c.getNodo()) < distanciaMasCercano1) && (clientetmp.getNodo().getId() != c.getNodo().getId())) { c.setClieteMasCercano1(clientetmp); distanciaMasCercano1 = Distancia.getInstancia().getDistancia(clientetmp.getNodo(), c.getNodo()); } else if ((Distancia.getInstancia().getDistancia(clientetmp.getNodo(), c.getNodo()) < distanciaMasCercano2) && (clientetmp.getNodo().getId() != c.getNodo().getId())) { c.setClieteMasCercano2(clientetmp); distanciaMasCercano2 = Distancia.getInstancia().getDistancia(clientetmp.getNodo(), c.getNodo()); } } return c; }
/** * Calcula el valor de <code>mu</code>. * * @param c Cliente. * @param dep Colección de depósitos. */ private int calcularMu(ClienteCap2 c, Collection<Deposito> dep) { /*Deposito masCercano=null; if(dep.size()>0) { masCercano=dep.iterator().next(); } else { return 0; } int distanciaMasCercano=Integer.MAX_VALUE; Iterator<Deposito> it=dep.iterator(); while(it.hasNext()) { Deposito n=it.next(); if(n.getCapacidadLibre()>=c.getNodo().getDemanda()) { if(Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo())<distanciaMasCercano) { masCercano=n; distanciaMasCercano=Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()); } } } int sumatoriaDistancias=0; Iterator<Deposito> it2=dep.iterator(); while(it2.hasNext()) { Deposito n=it2.next(); if(n.getCapacidadLibre()>=c.getNodo().getDemanda()) { if(n.getNodo().getId()!=masCercano.getNodo().getId()) { sumatoriaDistancias=sumatoriaDistancias+Distancia.getInstancia().getDistancia(n.getNodo(),c.getNodo()); } } } c.setMasCercano(masCercano); return sumatoriaDistancias-distanciaMasCercano;*/ Deposito masCercano = null; int distanciaMasCercano = Integer.MAX_VALUE; Iterator<Deposito> it = dep.iterator(); while (it.hasNext()) { Deposito n = it.next(); if (n.getCapacidadLibre() >= c.getNodo().getDemanda()) { if (Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()) < distanciaMasCercano) { masCercano = n; distanciaMasCercano = Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()); } } } if (masCercano != null) { int sumatoriaDistancias = 0; Iterator<Deposito> it2 = dep.iterator(); while (it2.hasNext()) { Deposito n = it2.next(); if (n.getCapacidadLibre() >= c.getNodo().getDemanda()) { if (n.getNodo().getId() != masCercano.getNodo().getId()) { sumatoriaDistancias = sumatoriaDistancias + Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()); } } } c.setMasCercano(masCercano); return sumatoriaDistancias - distanciaMasCercano; } else { int distanciaMasCercano2 = Integer.MAX_VALUE; Iterator<Deposito> it2 = dep.iterator(); while (it2.hasNext()) { Deposito n = it2.next(); if (Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()) < distanciaMasCercano2) { masCercano = n; distanciaMasCercano2 = Distancia.getInstancia().getDistancia(n.getNodo(), c.getNodo()); } } c.setMasCercano(masCercano); return 0; } }
/** Calcula los nodos que son enajendados. */ private void calcularEnagenamiento() { Iterator<Deposito> itd1 = depositos.iterator(); this.enajenados = new ArrayList<Enajenado>(); while (itd1.hasNext()) { Deposito dep1 = itd1.next(); Iterator<Cliente> itc1 = dep1.getAsignados().iterator(); while (itc1.hasNext()) { Cliente clientebase = itc1.next(); Iterator<Deposito> it4 = depositos.iterator(); while (it4.hasNext()) { boolean encontre1 = false; boolean encontre2 = false; Deposito dep2 = it4.next(); if (dep1.getNodo().getId() != dep2.getNodo().getId()) { Iterator<Cliente> it5 = dep2.getAsignados().iterator(); while (it5.hasNext()) { Cliente cliente = it5.next(); if (((ClienteCap2) clientebase).getClieteMasCercano1().getNodo().getId() == cliente.getNodo().getId()) encontre1 = true; if (((ClienteCap2) clientebase).getClieteMasCercano2().getNodo().getId() == cliente.getNodo().getId()) encontre2 = true; } if (encontre1 && encontre2) { this.enajenados.add(new Enajenado(((ClienteCap2) clientebase), dep1, dep2)); break; } } } } } // limpio lista de enegenados por la distancia al deposito. int distCaC1, distCaC2, distDep; Iterator<Enajenado> itena = this.enajenados.iterator(); ArrayList<Enajenado> asacar = new ArrayList<Enajenado>(); while (itena.hasNext()) { Enajenado ena = itena.next(); distCaC1 = Distancia.getInstancia() .getDistancia( ena.getCliente().getClieteMasCercano1().getNodo(), ena.getCliente().getNodo()); distCaC2 = Distancia.getInstancia() .getDistancia( ena.getCliente().getClieteMasCercano2().getNodo(), ena.getCliente().getNodo()); distDep = Distancia.getInstancia() .getDistancia(ena.getCliente().getNodo(), ena.getDeposito().getNodo()); System.out.println( "Clientes mas cercanos a " + ena.getCliente().getNodo().getId() + " ( " + ena.getDeposito().getNodo().getId() + " ). c 1 y c2 " + ena.getCliente().getClieteMasCercano1().getNodo().getId() + " ," + ena.getCliente().getClieteMasCercano2().getNodo().getId() + "(" + ena.getDepositoDestino().getNodo().getId() + ")"); if (distCaC1 + distCaC2 > distDep) asacar.add(ena); // this.enajenados.remove(ena); else ena.setMu(distDep - (distCaC1 + distCaC2)); } Iterator<Enajenado> itsacar = asacar.iterator(); while (itsacar.hasNext()) { this.enajenados.remove(itsacar.next()); } }