public List <Nodo> ResolverCamino(Vector3 posInicial, Vector3 posObjetivo) { Nodo nodoInicial = grid.NodoDeUnPunto(posInicial); Nodo nodoObjetivo = grid.NodoDeUnPunto(posObjetivo); List <Nodo> setAbiertos = new List <Nodo>(); HashSet <Nodo> setCerrados = new HashSet <Nodo>(); setAbiertos.Add(nodoInicial); while (setAbiertos.Count > 0) { Nodo nodoActual = setAbiertos[0]; for (int i = 1; i < setAbiertos.Count; i++) { if (setAbiertos[i].costoF < nodoActual.costoF || setAbiertos[i].costoF == nodoActual.costoF && setAbiertos[i].costoH < nodoActual.costoH) //siguiente posicion { nodoActual = setAbiertos[i]; } } setAbiertos.Remove(nodoActual); setCerrados.Add(nodoActual); if (nodoActual == nodoObjetivo) { rutaActual = trazarRuta(nodoInicial, nodoObjetivo); return(rutaActual); //camino encontrado } //En las siguientes lineas se asigna el set abiertos, los posibles nodos que pueden ocupar el camino foreach (Nodo vecino in grid.getNodosVecinos(nodoActual)) { if (!vecino.walkable || setCerrados.Contains(vecino)) { continue; } int costoNuevoMovimientoAlVecino = nodoActual.costoG + getDistancia(nodoActual, vecino); if (costoNuevoMovimientoAlVecino < vecino.costoG || !setAbiertos.Contains(vecino)) { vecino.costoG = costoNuevoMovimientoAlVecino; vecino.costoH = getDistancia(vecino, nodoObjetivo); vecino.nodoPadre = nodoActual; if (!setAbiertos.Contains(vecino)) { setAbiertos.Add(vecino); } } } } return(rutaActual); }
public Nodo EscogerCamino(Nodo nodoActual, HormigaAco hormiga) { double ruleta = Random.Range(0f, 1f); List <Nodo> vecinos = GrillaMundo.getNodosVecinos(nodoActual); double[] probabilidadLocal = new double[vecinos.Count]; double probabilidadVecinos = 0.0; Nodo nodoSiguiente = null; int indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } probabilidadLocal[indice] = vecino.nivelDeFeromonas * getDistancia(nodoActual, vecino); probabilidadVecinos += probabilidadLocal[indice]; indice++; } indice = 0; //actualizar probabilidad de seleccion List <double> sum = new List <double>(); foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } probabilidadLocal[indice] = probabilidadLocal[indice] / probabilidadVecinos; indice++; } indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } double suma = 0; for (int i = indice; i < probabilidadLocal.Length; i++) { suma += probabilidadLocal[i]; } sum.Add(suma); } sum.Reverse(); indice = 0; foreach (Nodo vecino in vecinos) { if (vecino == nodoActual.nodoPadre) { indice++; continue; } if (indice == 0) { if (ruleta <= sum[indice]) { nodoSiguiente = vecino; nodoSiguiente.nodoPadre = nodoActual; } } else if (ruleta > sum[indice - 1] && ruleta <= sum[indice]) { nodoSiguiente = vecino; nodoSiguiente.nodoPadre = nodoActual; } indice++; } if (nodoSiguiente == null) { bool apto = false; while (!apto) { int seleccion = Random.Range(0, vecinos.Count); nodoSiguiente = vecinos[seleccion]; if (nodoSiguiente != nodoActual.nodoPadre && nodoSiguiente.walkable) { apto = true; } } } return(nodoSiguiente); }