Exemple #1
0
 /// <summary>
 /// Obteners the sigma.
 /// </summary>
 /// <param name="configuracion">The configuracion.</param>
 /// <param name="diferencia">The diferencia.</param>
 /// <returns></returns>
 public static decimal obtenerValorFuncPreferencia(Promethee configuracion, decimal diferencia)
 {
     decimal retorno = 0;
     switch (configuracion.tipoFuncion)
     {
         case enumFuncionPreferencia.None:
             break;
         case enumFuncionPreferencia.VerdaderoCriterio:
             if (diferencia == 0) retorno = 0;
             else retorno = 1;
             break;
         case enumFuncionPreferencia.CuasiCriterio:
             if (diferencia <= configuracion.limiteIndiferencia) retorno = 0;
             else retorno = 1;
             break;
         case enumFuncionPreferencia.PseudoCriterioConPreferenciaLineal:
             if (diferencia <= configuracion.limitePreferencia) retorno = (diferencia / configuracion.limitePreferencia);
             else retorno = 1;
             break;
         case enumFuncionPreferencia.LevelCriterio:
             if (diferencia <= configuracion.limiteIndiferencia) retorno = 0;
             else
             {
                 if (configuracion.limiteIndiferencia < diferencia && diferencia <= configuracion.limitePreferencia) retorno = 1 / 2;
                 else retorno = 1;
             }
             break;
         case enumFuncionPreferencia.CriterioConPreferenciaLinealYAreaDeIndiferencia:
             if (diferencia <= configuracion.limiteIndiferencia) retorno = 0;
             else
             {
                 if (configuracion.limiteIndiferencia < diferencia && diferencia <= configuracion.limitePreferencia)
                     retorno = (diferencia - configuracion.limiteIndiferencia) / (configuracion.limitePreferencia - configuracion.limiteIndiferencia);
                 else retorno = 1;
             }
             break;
         case enumFuncionPreferencia.CriterioGaussiano:
             double valor = 0;
             double difEnDouble = Convert.ToDouble(diferencia);
             double limiteSigma = Convert.ToDouble(configuracion.limiteSigma);
             valor = ((-1) * Math.Pow(difEnDouble, 2)) / (2 * Math.Pow(limiteSigma, 2));
             retorno = Convert.ToDecimal(1 - Math.Exp(valor));
             break;
         default:
             break;
     }
     return retorno;
 }
Exemple #2
0
 /// <summary>
 /// Obteners the valores.
 /// </summary>
 /// <returns></returns>
 public Promethee obtenerValores()
 {
     Promethee datos = new Promethee();
     datos.limiteIndiferencia = limiteIndiferencia;
     datos.limitePreferencia = limitePreferencia;
     datos.limiteSigma = limiteSigma;
     datos.tipoFuncion = TipoFuncionPreferencia;
     datos.pesoCriterio = pesoCriterio;
     return datos;
 }
        /// <summary>
        /// Aplicars the metodo.
        /// </summary>
        /// <param name="lista">The lista.</param>
        private void AplicarMetodo(List<RptIndicadores> lista)
        {
            try
            {
                Promethee valoresCalificacion = new Promethee(), valoresInasistencia = new Promethee(), valoresSancion = new Promethee();

                if (criterioCalificacion.habilitarCriterio)
                    valoresCalificacion = criterioCalificacion.obtenerValores();
                if (criterioInasistencia.habilitarCriterio)
                    valoresInasistencia = criterioInasistencia.obtenerValores();
                if (criterioSancion.habilitarCriterio)
                    valoresSancion = criterioSancion.obtenerValores();

                decimal diferenciaCriterio = 0;
                decimal valorFuncPreferencia = 0;
                tablaPaso1 = new DataTable("Promethee1");
                tablaPaso1.Columns.Add("Alumnos");
                if (criterioCalificacion.habilitarCriterio)
                    tablaPaso1.Columns.Add("Calificacion", System.Type.GetType("System.Decimal"));
                if (criterioInasistencia.habilitarCriterio)
                    tablaPaso1.Columns.Add("Inasistencia", System.Type.GetType("System.Decimal"));
                if (criterioSancion.habilitarCriterio)
                    tablaPaso1.Columns.Add("Sancion", System.Type.GetType("System.Decimal"));

                DataRow fila;
                // Paso 1: determinar como se situan las alternativas con respecto a cada atributo.
                #region --[Paso 1]--
                foreach (RptIndicadores item in lista)
                {
                    List<RptIndicadores> filtro = lista.FindAll(p => p.idAlumno != item.idAlumno);

                    foreach (RptIndicadores alumno in filtro)
                    {
                        fila = tablaPaso1.NewRow();
                        fila["Alumnos"] = item.idAlumno.ToString() + "-" + alumno.idAlumno.ToString();

                        #region --[Promedios]--
                        if (criterioCalificacion.habilitarCriterio)
                        {
                            valorFuncPreferencia = -1;
                            diferenciaCriterio = 0;
                            if (criterioCalificacion.esMaximzante)
                            {
                                if (item.promedio >= alumno.promedio)
                                {
                                    diferenciaCriterio = Math.Abs(item.promedio - alumno.promedio);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresCalificacion, diferenciaCriterio);
                                }
                            }
                            else
                            {
                                if (item.promedio <= alumno.promedio)
                                {
                                    diferenciaCriterio = Math.Abs(item.promedio - alumno.promedio);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresCalificacion, diferenciaCriterio);
                                }
                            }
                            if (valorFuncPreferencia >= 0) fila["Calificacion"] = valorFuncPreferencia;
                            else fila["Calificacion"] = DBNull.Value;
                        }
                        //else fila["Calificacion"] = DBNull.Value;
                        #endregion

                        #region --[Inasistencias]--
                        if (criterioInasistencia.habilitarCriterio)
                        {
                            valorFuncPreferencia = -1;
                            diferenciaCriterio = 0;
                            if (criterioInasistencia.esMaximzante)
                            {
                                if (item.inasistencias >= alumno.inasistencias)
                                {
                                    diferenciaCriterio = Math.Abs(item.inasistencias - alumno.inasistencias);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresInasistencia, diferenciaCriterio);
                                }
                            }
                            else
                            {
                                if (item.inasistencias <= alumno.inasistencias)
                                {
                                    diferenciaCriterio = Math.Abs(item.inasistencias - alumno.inasistencias);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresInasistencia, diferenciaCriterio);
                                }
                            }
                            if (valorFuncPreferencia >= 0) fila["Inasistencia"] = valorFuncPreferencia;
                            else fila["Inasistencia"] = DBNull.Value;
                        }
                        //else fila["Inasistencia"] = DBNull.Value;
                        #endregion

                        #region --[Sanciones]--
                        if (criterioSancion.habilitarCriterio)
                        {
                            valorFuncPreferencia = -1;
                            diferenciaCriterio = 0;
                            if (criterioSancion.esMaximzante)
                            {
                                if (item.sanciones >= alumno.sanciones)
                                {
                                    diferenciaCriterio = Math.Abs(item.sanciones - alumno.sanciones);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresSancion, diferenciaCriterio);
                                }
                            }
                            else
                            {
                                if (item.sanciones <= alumno.sanciones)
                                {
                                    diferenciaCriterio = Math.Abs(item.sanciones - alumno.sanciones);
                                    valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresSancion, diferenciaCriterio);
                                }
                            }
                            if (valorFuncPreferencia >= 0) fila["Sancion"] = valorFuncPreferencia;
                            else fila["Sancion"] = DBNull.Value;
                        }
                        //else fila["Sancion"] = DBNull.Value;
                        #endregion
                        tablaPaso1.Rows.Add(fila);
                    }
                }
                #endregion

                // Paso 2: Expresar la intensidad de la preferencia de la alternativa Xi comparada con Xk
                #region --[Paso 2]--
                tablaPaso2 = new DataTable("Promethee2");
                tablaPaso2.Columns.Add("Alumnos");
                DataRow nuevaFila;
                for (int i = 0; i < lista.Count; i++)
                {
                    tablaPaso2.Columns.Add(lista[i].idAlumno.ToString(), System.Type.GetType("System.Decimal"));
                    nuevaFila = tablaPaso2.NewRow();
                    tablaPaso2.Rows.Add(nuevaFila);
                    tablaPaso2.Rows[i]["Alumnos"] = lista[i].idAlumno.ToString();
                }
                tablaPaso2.Columns.Add("FlujoEntrante", System.Type.GetType("System.Decimal"));

                string[] alternativas;
                int indexFila = 0;
                int indexColumna = 0;
                decimal valorCalificacion = 0;
                decimal valorInasistencia = 0;
                decimal valorSancion = 0;
                decimal sumaPesos = 0;
                if (criterioCalificacion.habilitarCriterio) sumaPesos += valoresCalificacion.pesoCriterio;
                if (criterioInasistencia.habilitarCriterio) sumaPesos += valoresInasistencia.pesoCriterio;
                if (criterioSancion.habilitarCriterio) sumaPesos += valoresSancion.pesoCriterio;

                int nroFila;
                decimal valorAcumulado = 0;
                foreach (DataRow item in tablaPaso1.Rows)
                {
                    valorAcumulado = 0;
                    alternativas = item[0].ToString().Split('-');
                    //item 0: fila
                    //item 1: columna
                    int.TryParse(alternativas[0], out indexFila);
                    int.TryParse(alternativas[1], out indexColumna);
                    nroFila = tablaPaso2.Rows.IndexOf(tablaPaso2.Select("Alumnos='" + indexFila.ToString() + "'")[0]);

                    if (criterioCalificacion.habilitarCriterio)
                    {
                        valorCalificacion = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0;
                        if (criterioInasistencia.habilitarCriterio)
                        {
                            valorInasistencia = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0;
                            if (criterioSancion.habilitarCriterio)
                                valorSancion = (item[3] != DBNull.Value) ? Convert.ToDecimal(item[3]) : 0;
                        }
                        else
                            valorSancion = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0;

                    }
                    else
                    {
                        if (criterioInasistencia.habilitarCriterio)
                        {
                            valorInasistencia = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0;
                            if (criterioSancion.habilitarCriterio)
                                valorSancion = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0;
                        }
                        else
                            valorSancion = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0;
                    }

                    if (criterioCalificacion.habilitarCriterio)
                        valorAcumulado += (valorCalificacion * valoresCalificacion.pesoCriterio);
                    if (criterioInasistencia.habilitarCriterio)
                        valorAcumulado += (valorInasistencia * valoresInasistencia.pesoCriterio);
                    if (criterioSancion.habilitarCriterio)
                        valorAcumulado += (valorSancion * valoresSancion.pesoCriterio);
                    tablaPaso2.Rows[nroFila][indexColumna.ToString()] = Math.Round((valorAcumulado / (sumaPesos)), 2);
                }
                #endregion

                // Paso 3: Expresar como Xi supera a las demás alternativas y cómo es superada por las otras.
                #region --[Paso 3]--
                tablaPaso3 = new DataTable("Promethee2");
                tablaPaso3 = tablaPaso2.Clone();
                tablaPaso3.Columns[0].DataType = System.Type.GetType("System.String");
                nuevaFila = tablaPaso3.NewRow();
                nuevaFila[0] = "FlujoSaliente";
                tablaPaso3.Rows.Add(nuevaFila);

                decimal acumuladorFila, acumuladorColumna;
                for (int i = 0; i < tablaPaso2.Rows.Count; i++)
                {
                    acumuladorFila = 0;
                    for (int j = 1; j < tablaPaso2.Columns.Count - 1; j++)
                    {
                        acumuladorFila += (tablaPaso2.Rows[i][j] != DBNull.Value) ? Convert.ToDecimal(tablaPaso2.Rows[i][j]) : 0;
                    }
                    tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 1] = acumuladorFila;
                }

                for (int i = 1; i < tablaPaso2.Columns.Count - 1; i++)
                {
                    acumuladorColumna = 0;
                    for (int j = 0; j < tablaPaso2.Rows.Count; j++)
                    {
                        acumuladorColumna += (tablaPaso2.Rows[j][i] != DBNull.Value) ? Convert.ToDecimal(tablaPaso2.Rows[j][i]) : 0;
                    }
                    tablaPaso3.Rows[0][i] = acumuladorColumna;
                }
                #endregion

                // Paso 4: Obtener el Preorden Total
                #region --[Paso 4]--
                //tablaPaso2.DefaultView.Sort = "FlujoEntrante DESC";
                tablaPaso2.Columns.Add("Ranking", System.Type.GetType("System.Decimal"));
                for (int i = 0; i < tablaPaso2.Rows.Count; i++)
                {
                    tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 1] = Convert.ToDecimal(tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 2])
                        - Convert.ToDecimal(tablaPaso3.Rows[0][i + 1]);
                }

                tablaPaso2.DefaultView.Sort = "Ranking DESC";
                tablaResultado = tablaPaso2.DefaultView.ToTable();
                #endregion

                for (int i = 0; i < tablaResultado.Rows.Count; i++)
                {
                    RptIndicadores alumno = new RptIndicadores();
                    alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(tablaResultado.Rows[i][0].ToString()));
                    tablaResultado.Rows[i][0] = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim();
                }
                tablaResultado.Columns.Remove("FlujoEntrante");

                int idTop = 0;
                int.TryParse(ddlTop.SelectedValue, out idTop);
                if (idTop > 0)
                {
                    DataTable tablaFiltro = tablaResultado.Clone();
                    for (int i = 0; i < idTop; i++)
                    {
                        tablaFiltro.ImportRow(tablaResultado.Rows[i]);
                    }
                    tablaResultado.Clear();
                    tablaResultado = tablaFiltro.Copy();
                }

                CargarGrilla();

                tablaPaso3.Columns.Add("Ranking", System.Type.GetType("System.Decimal"));
                tablaPaso3.Rows[0][tablaPaso3.Columns.Count - 1] = DBNull.Value;
                GraficarPodioResultado();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }