Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2022
1
TABLA DE CONTENIDO
RESUMEN………………………………………………………………………………. 1
INTRODUCCIÓN…………………………………………………………………….…. 2
OBJETIVO GENERAL...……………………………………………………………….. 3
OBJETIVOS ESPECÍFICOS…………………………………………………… 3
PLANTEAMIENTO DE PROBLEMA……………………………………………...…. 3
ANÁLISIS Y DESARROLLO..…………………………………………………………..3
DISEÑO DE CLASES Y MÉTODOS QUE IMPLETAN PARA LA
SOLUCIÓN DE PROBLEMAS………………………………………………….3
CÓDIGO FUENTE……………………………………………………………….4
CAPTURAS………………………………………………………………………18
RESULTADOS…………………………………………………………………………..20
CONCLUSIONES Y RECOMENDACIONES………………………………………..21
BIBLIOGRAFÍA…………………………………………………………………………22
2
RESUMEN
INTRODUCCIÓN
3
La programación lineal es un método mediante el cual se optimiza, ya sea maximizando o
minimizando, una función objetivo, donde las variables están elevadas a la potencia 1. Esto,
tomando en cuenta distintas restricciones dadas.
Existen diferentes métodos para solucionar la programación lineal como ser el método
gráfico ⁵⅝ o el método de penalización, el método que usaremos y estudiaremos será el
método simplex.
El método Simplex es un procedimiento iterativo que permite mejorar la solución de la
función objetivo en cada paso. El proceso concluye cuando no es posible continuar
mejorando dicho valor, es decir, se ha alcanzado la solución óptima.
Para lograr la automatización del método simplex estudiamos C# que es un lenguaje de
programación desarrollado por Microsoft, orientado a objetos que ha sido diseñado para
compilar diversas aplicaciones que se ejecutan en .NET es un lenguaje simple, eficaz y con
seguridad.
En este proyecto combinamos ambas ramas tanto la investigación operativa como
programación, para conseguir una aplicación que nos automatice las iteraciones del método
simplex, y como conclusión tenemos una aplicación que nos optimiza tanto la
programación lineal como el tiempo que demora hacerlo de manera manual y los errores
causados por simple escritura o de simple razonamiento matemático.
OBJETIVO GENERAL
4
Desarrollar una aplicación para automatizar el proceso de un problema de programación
lineal bajo el método simplex.
OBJETIVOS ESPECIFICOS
Estudiar el método simplex tabular
Diseñar algoritmos del problema
Comprender el correcto uso de vectores y matrices
Aprender a diseñar una interfaz en base a Windows forms
PLANTEAMIENTO DEL PROBLEMA
Por mucho tiempo los problemas de programación lineal se resolvieron a partir de hoja y
lápiz por lo que causa demora y errores de escritura.
¿Cómo automatizar el procedimiento para la optimización del método simplex?
ANÁLISIS Y DESARROLLO
DISEÑO DE CLASES Y MÉTODOS QUE IMPLEMENTAN PARA LA SOLUCIÓN
DEL PROBLEMA
DIAGRAMA DE FLUJO GAUSS-JORDAN
CÓDIGO FUENTE
5
Namespace Metodo_Simplex
{
Public partial class Form1 : Form
{
Public Form1()
{
InitializeComponent();
}
Int V = 0;
Int ren = 1, col = 0;
Int var, rest, Dmenor = 0, g;
Int Colpivote = 0;
Bool M;
6
Dgv2.Columns.Clear();
Dgv1.Rows.Clear();
Int v = Convert.ToInt32(cmbvari.Text);
Int r = Convert.ToInt32(cmbres.Text);
Dgv2.ColumnCount = v;
Dgv2.RowCount = r + 1;
Dgv2.Columns.Add(cmb);
For (int i = 1; i <= r; i++) // para las restricciones
Dgv2.Rows[i].HeaderCell.Value = (“R” + i +”: “); //se establecen las filas
de las restricciones
For (int i = 0; i < v; i++) // para el lado derecho L.D.
Dgv2.Columns[i].Width = 50;
Dgv2.RowHeadersWidth = 90;
Dgv2.Columns.Add(“RESULTADO”, “RESULTADO”);
7
Dgv2.Rows[0].Cells[v + 1].Style.BackColor = Color.Blue; // para no poder
ingresar datos de la F.O. en el L.D.
Dgv2.Rows[0].Cells[v].ReadOnly = true;
For (int i = 1; i <= r; i++) //para que nos muestre en pantalla lo ingresado es
decir: <=
Dgv2.Rows[i].Cells[v].Value = “<=”;
}
Catch //bloque catch para capturar los errores generados por el try
{
MessageBox.Show(“POR FAVOR INGRESA LOS VALORES”);
}
}
8
Dgv1.Columns[i + var].Name = (“H” + i); //para que las holguras
aumenten
Dgv1.Columns[var + rest + 1].Name = (“LD”); //para que los datos se
ingresen a L.D.
Dgv1.RowCount = rest + 1;
Dgv1.Rows[0].HeaderCell.Value = “Z”;
For (int i = 0; i <= rest + var; i++) //Para el tamaño de columnas, pixeles
Dgv1.Columns[i].Width = 40;
Dgv1.Columns[var + rest + 1].Width = 55;
Dgv1.RowHeadersWidth = 50;
9
For (int i = 0; i < rest; i++)
{
For (int j = 0; j < var; j++)
{
Dgv1[j + 1, i + 1].Value = dgv2[j, i + 1].Value;
}
}
For (int i = 0; i < rest; i++)
{
Dgv1[0, i + 1].Value = 0;
}
10
For (int i = 0; i < (rest + var + 2); i++)
{
Num = Convert.ToInt32(dgv1[i, 0].Value);
If (num < Dmenor)
Dmenor = num;
}
For (int i = 0; i < (rest + var + 2); i++)
{
If (Convert.ToInt32(dgv1[i, 0].Value) == Dmenor)
{
Dgv1.Columns[i].DefaultCellStyle.BackColor = Color.Red; //para
distinguir el pivote
Break;
}
Colpivote++;
Col++;
}
Int R = rest + var + 1;
Int n1, n2, S = 0;
For (int i = 0; i < rest + 1; i++)
{
N1 = Convert.ToInt32(dgv1[R, i].Value);
N2 = Convert.ToInt32(dgv1[col, i].Value);
If (n1 > 0 & n2 > 0)
S++;
}
Double[] comp = new double[S];
Int M = 0;
Double ra = 0.0, r2 = 0.0;
11
For (int i = 0; i < rest + 1; i++)
{
Ra = Convert.ToDouble(dgv1[R, i].Value);
R2 = Convert.ToDouble(dgv1[col, i].Value);
If (ra > 0 & r2 > 0)
{
Comp[M] = ra / r2;
M++;
}
}
Double and = 999999;
For (int i = 0; i < comp.Length; i++)
{
If (comp[i] < and)
{
And = comp[i];
}
}
G = 1;
For (int i = 0; i < (rest + 1); i++) //para la fila pivote
{
If (comp[i] == and)
{
Dgv1.Rows[g].DefaultCellStyle.BackColor = Color.SkyBlue; //para
distinguir la fila pivote
Break;
}
G++;
Ren++;
12
}
Dgv1.Rows[ren].Cells[col].Style.BackColor = Color.Red; //para distinguir el
pivote
}
Catch (Exception)
{
MessageBox.Show(“INGRESA LOS VALORES”);
}
}
13
Btnsiguiente.Enabled = false; //para que se deshabilite al cargar el formulario
(siguiente)
Dmenor *= -1;
Int nColumnas = dgv1.ColumnCount;
Int nRenglo = dgv1.RowCount;
Double[] rPiv = new double[nColumnas];
For (int i = 0; i < nColumnas; i++)
rPiv[i] = Convert.ToDouble(dgv1[i, ren].Value) * Dmenor;
for (int i = 0; i < nColumnas; i++)
dgv1[i, 0].Value = Convert.ToDouble(dgv1[i, 0].Value) + rPiv[i];
14
Y = 0;
For (int j = 0; j < nColumnas; j++)
{
If (i ¡= ren)
{
Nrpiv = colPivo[i] * -1;
Checar[y] = nrpiv * nrenPivo[y];
Dgv1[j, i].Value = Checar[y] + Convert.ToDouble(dgv1[j, i].Value);
Y++;
}
}
Conta++;
}
Double numero = 0.0;
For (int i = 0; i < nColumnas; i++)
{
Numero = Convert.ToDouble(dgv1.Rows[0].Cells[i].Value);
If (numero < 0)
{
M = true;
Break;
}
V++;
}
btnValop.Enabled = true;
}
15
Private void btnValop_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
double[] nuevaCpivote = new double[dgv1.RowCount]; // creamos vectores
para llenar los resultados
double[] sol = new double[dgv1.RowCount];
double[] resultado = new double[dgv1.RowCount];
if (M == true) //si se cumple todo
{
For (int i = 0; i < dgv1.RowCount; i++)
{
For (int j = 0; j < dgv1.ColumnCount; j++)
{
Dgv1.Rows[i].Cells[j].Style.BackColor = Color.SkyBlue;
}
}
For (int i = 0; i < dgv1.RowCount; i++) //para pivote
{
nuevaCpivote[i] = Convert.ToDouble(dgv1.Rows[i].Cells[V].Value);
}
For (int i = 0; i < dgv1.RowCount; i++) //para diferenciar fila pivote
{
Dgv1.Rows[i].Cells[V].Style.BackColor = Color.SkyBlue;
}
For (int i = 0; i < sol.Length; i++) //para la solución
{
Sol[i] = Convert.ToDouble(dgv1.Rows[i].Cells[dgv1.ColumnCount –
1].Value);
16
}
For (int i = 0; i < resultado.Length; i++) //para el resultado
{
Resultado[i] = sol[i] / nuevaCpivote[i]; //resultado es igual a la solución
sobre el nuevo pivote
}
Double peque = 999999.99;
For (int i = 1; i < resultado.Length; i++)
{
If (resultado[i] < peque)
{
Peque = resultado[i];
}
}
Int t;
For (t = 0; t < dgv1.RowCount; t++)
{
If (peque == resultado[t])
Break;
}
For (int i = 0; i < dgv1.ColumnCount; i++)
{
Dgv1.Rows[t].Cells[i].Style.BackColor = Color.SkyBlue;
}
Dgv1.Rows[t].Cells[V].Style.BackColor = Color.Red;
Double nElementoPivote = Convert.ToDouble(dgv1.Rows[t].Cells[V].Value);
Int z = 0;
Int ncdt = dgv1.ColumnCount;
Int nrdt = dgv1.RowCount;
17
Double vari;
For (int i = 0; i < ncdt; i++) //para resolver la fila del pivote
{
Vari = Convert.ToDouble(dgv1.Rows[t].Cells[i].Value);
Dgv1.Rows[t].Cells[i].Value = (vari / nElementoPivote).ToString(“0.##”);
}
Double ch;
Double[] Pri = new double[dgv1.ColumnCount];
Double[] Jir = new double[dgv1.ColumnCount];
For (int i = 0; i < Jir.Length; i++)
{
Jir[i] = Convert.ToDouble(dgv1.Rows[t].Cells[i].Value);
}
For (int i = 0; i < dgv1.RowCount; i++)
{
Z = 0;
For (int j = 0; j < dgv1.ColumnCount; j++)
{
If (i ¡= t)
{
Ch = nuevaCpivote[i] * -1;
Pri[z] = ch * Jir[z];
Dgv1[j, i].Value = (Pri[z] + Convert.ToDouble(dgv1[j,
i].Value)).ToString(“0.##”);
Z++;
}
}
}
18
listBox1.Items.Add(“Z= “ + dgv1.Rows[0].Cells[dgv1.ColumnCount –
1].Value);
for (int i = 1; i < (var + 1); i++)
{
listBox1.Items.Add(“X” + i + “= “ +
dgv1.Rows[i].Cells[dgv1.ColumnCount – 1].Value);
}
}
Else
{
listBox1.Items.Add(“Z= “ + dgv1.Rows[0].Cells[dgv1.ColumnCount –
1].Value);
for (int i = 1; i < (var + 1); i++)
{
listBox1.Items.Add(“X” + i + “= “ +
dgv1.Rows[i].Cells[dgv1.ColumnCount – 1].Value);
}
}
}
19
Ren = 1;
Col = 0;
Var = 0;
Rest = 0;
V = 0;
listBox1.Items.Clear();
}
CAPTURAS
20
21
RESULTADOS
Comprobamos el resultado con la calculadora PHPSimplex y de manera manuscrita
CONCLUSIONES Y RECOMENDACIONES
Concluido el proyecto se determinan las siguientes conclusiones:
Es posible desarrollar una aplicación para la solución de
optimización.
Podemos concluir que la base del proyecto es el estudio de
investigación operativa y programación
22
Se puede evitar errores de escritura y lógica matemática bajo la
eficiencia de la aplicación
Se recomienda:
Estudiar otros lenguajes de programación
Implementar una versión de aplicación que reconozca diferentes
métodos de solución
Estudiar a detalle los diferentes métodos de optimización
BIBLIOGRAFIA
Gimena Arnez (2020) clase del método simplex tabular
https://drive.google.com/drive/u/2/folders/1547Blfe7ad6MLeGe4vrNRzH4_RTOrtqy
Hamdy Abdelaziz Taha (1971) investigación operativa
23