/// <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; }
/// <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; } }