private static void SincronizarAbiertas(Query q) { s = q.ComandoSql; if (q.Parametrizar) { s += Ambiente.OracleDate(q.UltSincronizacion); } else { var mins = (DateTime.Now - q.UltSincronizacion).TotalMinutes; if (mins <= Ambiente.MinAbiertas) { return; } } abiertas = abiertaController.SelectAll(); DataTable atencionesAbiertas = Ambiente.Oracledb.Select(s); if (atencionesAbiertas.Rows.Count > 0) { i = 0; foreach (DataRow a in atencionesAbiertas.Rows) { var abiertalocal = abiertas.FirstOrDefault(x => x.NrAtendimento.Equals(a["NR_ATENDIMENTO"].ToString())); if (abiertalocal != null) { continue; } var abierta = new Abierta(); abierta.NrAtendimento = a["NR_ATENDIMENTO"].ToString(); abierta.CdPaciente = a["CD_PACIENTE"].ToString(); abierta.CdMedico = a["CD_MEDICO"].ToString(); abierta.CdEstabelecimento = a["CD_ESTABELECIMENTO"].ToString(); abierta.DtEntrada = DateTime.Parse(a["DT_ENTRADA"].ToString()); abierta.CdUnidadeBasica = a["CD_UNIDADE_BASICA"].ToString(); abierta.CdSetorAtendimento = a["CD_SETOR_ATENDIMENTO"].ToString(); abierta.DtAlta = null; abierta.DtActualizacion = null; abierta.CreatedAt = DateTime.Now; if (abiertaController.InsertOne(abierta)) { WriteStatus("ATENCIONES ABIERTAS", i, atencionesAbiertas.Rows.Count - 1); i++; } } q.UltSincronizacion = DateTime.Now; queryController.Update(q); } else { WriteStatus("TODO ESTÁ SINCRONIZADO " + DateTime.Now.ToString("HH:mm:ss")); } }
/// <summary> /// Pasa el nodo a la lista abierta /// </summary> /// <param name="actual">Punto donde está el algoritmo</param> /// <param name="i">Incremento de la coordenada X</param> /// <param name="j">Incremento de la coordenada Y</param> /// <param name="coste">Coste del paso</param> private void NodoAAbierta(Baldosa actual, int i, int j, double coste) { Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].Abierto = true; Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].G = Mapa[actual.Posicion.X, actual.Posicion.Y].G + coste; Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].H = Calculo.Distancia(Mapa[actual.Posicion.X + i, actual.Posicion.Y + j], Meta); Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].Padre = Mapa[actual.Posicion.X, actual.Posicion.Y]; Abierta.Enqueue(Mapa[actual.Posicion.X + i, actual.Posicion.Y + j], Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].F); }
/// <summary> /// Reorienta el enlace del nodo /// </summary> /// <param name="actual">Punto donde está el algoritmo</param> /// <param name="i">Incremento de la coordenada X</param> /// <param name="j">Incremento de la coordenada Y</param> /// <param name="coste">Coste del paso</param> private void ReorientacionEnlaces(Baldosa actual, int i, int j, double coste) { if (Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].G > Mapa[actual.Posicion.X, actual.Posicion.Y].G + coste) // Si el coste es menor { Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].G = Mapa[actual.Posicion.X, actual.Posicion.Y].G + coste; Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].Padre = Mapa[actual.Posicion.X, actual.Posicion.Y]; Abierta.UpdatePriority(Mapa[actual.Posicion.X + i, actual.Posicion.Y + j], Mapa[actual.Posicion.X + i, actual.Posicion.Y + j].F); } }
/// <summary> /// Operaciones de limpieza del algoritmo /// </summary> protected internal void LimpiarListas(List <Baldosa> camino) { Abierta.Clear(); foreach (var item in Mapa) { Abierta.ResetNode(item); if (!camino.Contains(item)) //if (item.Abierto == true) { item.Abierto = null; } } }
/// <summary> /// Ejecución del algoritmo /// </summary> /// <returns>Punto del mapa al que se llega</returns> private Baldosa CalculoAlgoritmo() { Baldosa resultado = null; var salir = false; while (!salir) { if (Abierta.Count == 0) { salir = true; } else { var actual = Abierta.Dequeue(); //Cerramos el nodo actual.Abierto = false; MainThread.BeginInvokeOnMainThread(() => { actual.Celda.BackgroundColor = Color.Teal; }); if (actual.Posicion.Equals(Meta.Posicion)) { resultado = Mapa[Meta.Posicion.X, Meta.Posicion.Y]; salir = true; } else { // Expansion del punto actual if (MovimientoDiagonal && MovimientoOrtogonal) { ExpansionConDiagonales(actual); } else { if (MovimientoOrtogonal) { ExpansionOrtogonal(actual); } if (MovimientoDiagonal) { ExpansionDiagonal(actual); } } } } } return(resultado); }
public bool InsertOne(Abierta o) { try { using (var db = new SyncContext()) { db.Add(o); db.SaveChanges(); return(true); } } catch (Exception ex) { Ambiente.Message("Algo salío mal con: " + MethodBase.GetCurrentMethod().Name + " @" + GetType().Name + "\n" + ex.Message); } return(false); }
public bool Update(Abierta o) { try { using (var db = new SyncContext()) { db.Entry(o).State = EntityState.Modified; db.SaveChanges(); return(true); } } catch (Exception ex) { Ambiente.Message("Algo salío mal con: " + MethodBase.GetCurrentMethod().Name + " @" + GetType().Name + "\n" + ex.Message); } return(false); }
/// <summary> /// Llamada al algoritmo /// </summary> /// <returns>Objeto con el camino y el coste asociado</returns> public override AEstrellaResultado Algoritmo() { AEstrellaResultado resultado; // Calculamos la heurística entre el inicio y el final Mapa[Inicio.Posicion.X, Inicio.Posicion.Y].H = Calculo.Distancia(Inicio, Meta); // Agregamos el nodo inicio a la lista abierta Mapa[Inicio.Posicion.X, Inicio.Posicion.Y].Abierto = true; Abierta.Enqueue(Mapa[Inicio.Posicion.X, Inicio.Posicion.Y], Mapa[Inicio.Posicion.X, Inicio.Posicion.Y].F); // Ejecutamos el algoritmo var punto = CalculoAlgoritmo(); // Procesamos el resultado resultado = ProcesarResultado(punto); return(resultado); }