private void button1_Click_1(object sender, EventArgs e) { if (results != null) { results.Close(); results.Dispose(); results = null; } if (results == null) { results = new frmResults(); } results.Show(); DataGridView dr1 = new DataGridView(); dr1.DataSource = ((DataTable)dataGridView1.DataSource).Copy(); dr1.Dock = DockStyle.Top; dr1.Update(); results.AdicionarControle(dr1); dataGridView1.DataSource = CalcularSimplex((DataTable)dataGridView1.DataSource); dataGridView1.Update(); foreach (DataRow dr in ((DataTable)dataGridView1.DataSource).Rows) { if (dr[0].ToString().Substring(0, 1) == "X") { lstResultado.Items.Add(dr[0].ToString() + " = " + dr[dr.ItemArray.Length - 1].ToString()); } } }
private DataTable CalcularSimplex(DataTable m) { int iPivo = 0; int jPivo = 0; int iMax = m.Rows.Count - 1; int jMax = m.Columns.Count - 2; float[,] z = new float[m.Rows.Count, m.Columns.Count - 1]; for (int i = 0; i < m.Rows.Count; i++) { for (int j = 0; j < m.Columns.Count - 1; j++) { z[i, j] = float.Parse(m.Rows[i][j + 1].ToString()); } } float MenorValor; float Pivo; // Encontrar a coluna de resultados com o menor valor. // jMax-1 ==> Nao olha a coluna B (resultados). MenorValor = z[iMax, 0]; for (int j = 0; j < jMax - 1; j++) { if (z[iMax, j] < MenorValor) { MenorValor = z[iMax, j]; jPivo = j; } } // Localizada a coluna do pivo, identificar a linha do Pivo; bool primeiroValor = true; for (int i = 0; i < iMax; i++) { if (z[i, jPivo] > 0 && ((z[i, jMax] / z[i, jPivo]) > 0 && (z[i, jMax] / z[i, jPivo]) < MenorValor || primeiroValor)) { MenorValor = z[i, jMax] / z[i, jPivo]; iPivo = i; primeiroValor = false; } } // INICIAR TRANSFORMACAO DAS LINHAS -- recalcula linha do pivo. Pivo = z[iPivo, jPivo]; for (int j = 0; j <= jMax; j++) { z[iPivo, j] = z[iPivo, j] / Pivo; } // CALCULA OUTRAS LINHAS float fCoef; for (int i = 0; i <= iMax; i++) { if (i != iPivo) { fCoef = z[i, jPivo]; for (int j = 0; j <= jMax; j++) { z[i, j] = z[i, j] - fCoef * z[iPivo, j]; } } } // EXIBE NA TELA m.Rows[iPivo][0] = m.Columns[jPivo + 1].ColumnName; for (int i = 0; i <= iMax; i++) { for (int j = 0; j <= jMax; j++) { m.Rows[i][j + 1] = z[i, j]; } } bool PossuiNegativo = false; for (int j = 0; j < jMax; j++) { if (z[iMax, j] < 0) { PossuiNegativo = true; } } if (results == null) { results = new frmResults(); } results.Show(); DataGridView dr = new DataGridView(); dr.DataSource = m.Copy(); dr.Dock = DockStyle.Top; dr.Update(); results.AdicionarControle(dr); results.WindowState = FormWindowState.Maximized; results.Refresh(); if (PossuiNegativo) { m = CalcularSimplex(m); } return(m); }