private void btnCompute_Click(object sender, EventArgs e) { try { Task task; switch(cmbDimension.SelectedIndex){ case 0: task = new Task((Detail1D)pgrdTest.SelectedObject); break; case 1: task = new Task((Detail2D)pgrdTest.SelectedObject); break; default: throw new NotImplementedException("Не реализованный код!"); } task.CutThick = cutThick; foreach(OrderPair pair in order) task.AddOrder(pair); task.Compute(); fillTableCutAndSimplexMethod(task); fillTableSimplexMethod(dgvSimplexMethod, solver); fillTableResult(dgvResult, task, solver); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void btnCompute_Click(object sender, EventArgs e) { try { Task task; switch (cmbDimension.SelectedIndex) { case 0: task = new Task((Detail1D)pgrdTest.SelectedObject); break; case 1: task = new Task((Detail2D)pgrdTest.SelectedObject); break; default: throw new NotImplementedException("Не реализованный код!"); } task.CutThick = cutThick; foreach (OrderPair pair in order) { task.AddOrder(pair); } task.Compute(); fillTableCutAndSimplexMethod(task); fillTableSimplexMethod(dgvSimplexMethod, solver); fillTableResult(dgvResult, task, solver); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
private void fillTableResult(DataGridView dgv, Task task, src.SMethod.SimplexMethodSolver slv) { dgv.Rows.Clear(); dgv.Columns.Clear(); if (slv.errMsg != "OK") { return; } List<OrderPair> savedOrder = new List<OrderPair>(); foreach (OrderPair p in order) savedOrder.Add(new OrderPair(new Detail1D(pgrdOrderDetail, new double[]{p.Detail.Volume}),p.Num)); String[] strs = new String[3]; strs[0] = "Число заготовок:"; strs[1] = "Разрез:"; strs[2] = "Остатки:"; dgv.Columns.Add("", ""); dgv.Columns.Add("", ""); dgv.Columns.Add("", ""); dgv.Rows.Add(strs); dgv.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; dgv.Columns[0].Width = 150;dgv.Columns[2].Width = 100; double allLeft = 0.0; for (int i = 0; i < slv.xsCol.Count - 1; i++) { if(slv.table[i, slv.table.GetLength(1) - 1] == 0.0) continue; int rounded = (int)slv.table[i, slv.table.GetLength(1) - 1]; strs[0] = rounded.ToString(); strs[1] = ""; foreach (OrderPair p in task.AllCuts[slv.xsCol[i] - 1].Pairs) { for (int j = 0; j < p.Num; j++) { strs[1] += (((Detail1D)p.Detail).Length).ToString().Replace(',','.'); foreach (OrderPair oP in order) { if (((Detail1D)oP.Detail).Length == ((Detail1D)p.Detail).Length) { oP.Num -= rounded; break; } } if (j == p.Num - 1) { if (p != task.AllCuts[slv.xsCol[i] - 1].Pairs.Last()) strs[1] += ","; } else strs[1] += ","; } } strs[2] = Math.Round(task.AllCuts[slv.xsCol[i] - 1].Left, 3).ToString().Replace(',', '.'); allLeft += task.AllCuts[slv.xsCol[i] - 1].Left * rounded; dgv.Rows.Add(strs); } // ЖАДНЫЙ List<src.Cut> leftCuts = greedyAlgorithm(); double greedyCutLeft = 0.0; foreach (Cut cut in leftCuts) { strs[0] = "1"; strs[1] = ""; foreach (OrderPair p in cut.Pairs) { for (int j = 0; j < p.Num; j++) { strs[1] += (((Detail1D)p.Detail).Length).ToString().Replace(',', '.'); foreach (OrderPair oP in order) { if (((Detail1D)oP.Detail).Length == ((Detail1D)p.Detail).Length) { oP.Num -= 1; break; } } if (j == p.Num - 1) { if (p != cut.Pairs.Last()) strs[1] += ","; } else strs[1] += ","; } } strs[2] = Math.Round(cut.Left, 3).ToString().Replace(',', '.'); greedyCutLeft += cut.Left; dgv.Rows.Add(strs); } strs[0] = strs[1] = strs[2] = ""; dgv.Rows.Add(strs); strs[0] = "Общие:"; strs[2] = Math.Round(allLeft, 3).ToString().Replace(',', '.') + " + " + Math.Round(greedyCutLeft, 3).ToString().Replace(',', '.'); dgv.Rows.Add(strs); dgv.Rows[dgv.Rows.Count-1].DefaultCellStyle.BackColor = Color.Gray; order = savedOrder; }
private void fillTableCutAndSimplexMethod(Task task) { dgvAllCuts.Rows.Clear(); dgvAllCuts.Columns.Clear(); dgvAllCuts.Columns.Add("det", "det"); dgvAllCuts.Columns[0].DefaultCellStyle.BackColor = Color.LightGray; for (int i = 0; i < task.AllCuts.Count; i++) dgvAllCuts.Columns.Add((i + 1).ToString(), (i + 1).ToString()); dgvAllCuts.Columns.Add("num", "num"); String[] str = new String[task.AllCuts.Count + 2]; str[0] = "det"; for (int i = 0; i < task.AllCuts.Count; i++) str[i + 1] = (i + 1).ToString(); str[task.AllCuts.Count + 1] = "num"; dgvAllCuts.Rows.Add(str); dgvAllCuts.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; List<src.SMethod.Limitation> limits = new List<src.SMethod.Limitation>(); OrderPair pair = task.order.First(); while (pair != null) { str[0] = pair.Detail.Volume.ToString(); str[task.AllCuts.Count + 1] = pair.Num.ToString(); limits.Add(new src.SMethod.Limitation(new double[] { }, pair.Num, src.SMethod.Limitation.Type.Equal)); for (int i = 0; i < task.AllCuts.Count; i++) { str[i + 1] = task.AllCuts[i].CountOf(pair.Detail).ToString(); limits.Last().equaLine.koeffs.Add(task.AllCuts[i].CountOf(pair.Detail)); } dgvAllCuts.Rows.Add(str); pair = task.GetNextOrderPair(pair); } String[] str2 = new String[task.AllCuts.Count + 2]; dgvAllCuts.Rows.Add(str2); str[0] = "left"; str[task.AllCuts.Count + 1] = ""; src.SMethod.EquaLine equa = new src.SMethod.EquaLine(new double[] { }, 0.0); for (int i = 0; i < task.AllCuts.Count; i++) { str[i + 1] = Math.Round(task.AllCuts[i].Left, 3).ToString().Replace(',', '.'); equa.koeffs.Add(task.AllCuts[i].Left); } src.SMethod.Task sTask = new src.SMethod.Task(equa); foreach (src.SMethod.Limitation limit in limits) sTask.limitations.Add(limit); solver = new src.SMethod.SimplexMethodSolver(sTask); dgvAllCuts.Rows.Add(str); solver.calculateOptimalPlan(); }
private void fillTableResult(DataGridView dgv, Task task, src.SMethod.SimplexMethodSolver slv) { dgv.Rows.Clear(); dgv.Columns.Clear(); if (slv.errMsg != "OK") { return; } List <OrderPair> savedOrder = new List <OrderPair>(); foreach (OrderPair p in order) { savedOrder.Add(new OrderPair(new Detail1D(pgrdOrderDetail, new double[] { p.Detail.Volume }), p.Num)); } String[] strs = new String[3]; strs[0] = "Число заготовок:"; strs[1] = "Разрез:"; strs[2] = "Остатки:"; dgv.Columns.Add("", ""); dgv.Columns.Add("", ""); dgv.Columns.Add("", ""); dgv.Rows.Add(strs); dgv.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; dgv.Columns[0].Width = 150; dgv.Columns[2].Width = 100; double allLeft = 0.0; for (int i = 0; i < slv.xsCol.Count - 1; i++) { if (slv.table[i, slv.table.GetLength(1) - 1] == 0.0) { continue; } int rounded = (int)slv.table[i, slv.table.GetLength(1) - 1]; strs[0] = rounded.ToString(); strs[1] = ""; foreach (OrderPair p in task.AllCuts[slv.xsCol[i] - 1].Pairs) { for (int j = 0; j < p.Num; j++) { strs[1] += (((Detail1D)p.Detail).Length).ToString().Replace(',', '.'); foreach (OrderPair oP in order) { if (((Detail1D)oP.Detail).Length == ((Detail1D)p.Detail).Length) { oP.Num -= rounded; break; } } if (j == p.Num - 1) { if (p != task.AllCuts[slv.xsCol[i] - 1].Pairs.Last()) { strs[1] += ","; } } else { strs[1] += ","; } } } strs[2] = Math.Round(task.AllCuts[slv.xsCol[i] - 1].Left, 3).ToString().Replace(',', '.'); allLeft += task.AllCuts[slv.xsCol[i] - 1].Left * rounded; dgv.Rows.Add(strs); } // ЖАДНЫЙ List <src.Cut> leftCuts = greedyAlgorithm(); double greedyCutLeft = 0.0; foreach (Cut cut in leftCuts) { strs[0] = "1"; strs[1] = ""; foreach (OrderPair p in cut.Pairs) { for (int j = 0; j < p.Num; j++) { strs[1] += (((Detail1D)p.Detail).Length).ToString().Replace(',', '.'); foreach (OrderPair oP in order) { if (((Detail1D)oP.Detail).Length == ((Detail1D)p.Detail).Length) { oP.Num -= 1; break; } } if (j == p.Num - 1) { if (p != cut.Pairs.Last()) { strs[1] += ","; } } else { strs[1] += ","; } } } strs[2] = Math.Round(cut.Left, 3).ToString().Replace(',', '.'); greedyCutLeft += cut.Left; dgv.Rows.Add(strs); } strs[0] = strs[1] = strs[2] = ""; dgv.Rows.Add(strs); strs[0] = "Общие:"; strs[2] = Math.Round(allLeft, 3).ToString().Replace(',', '.') + " + " + Math.Round(greedyCutLeft, 3).ToString().Replace(',', '.'); dgv.Rows.Add(strs); dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.Gray; order = savedOrder; }
private void fillTableCutAndSimplexMethod(Task task) { dgvAllCuts.Rows.Clear(); dgvAllCuts.Columns.Clear(); dgvAllCuts.Columns.Add("det", "det"); dgvAllCuts.Columns[0].DefaultCellStyle.BackColor = Color.LightGray; for (int i = 0; i < task.AllCuts.Count; i++) { dgvAllCuts.Columns.Add((i + 1).ToString(), (i + 1).ToString()); } dgvAllCuts.Columns.Add("num", "num"); String[] str = new String[task.AllCuts.Count + 2]; str[0] = "det"; for (int i = 0; i < task.AllCuts.Count; i++) { str[i + 1] = (i + 1).ToString(); } str[task.AllCuts.Count + 1] = "num"; dgvAllCuts.Rows.Add(str); dgvAllCuts.Rows[0].DefaultCellStyle.BackColor = Color.LightGray; List <src.SMethod.Limitation> limits = new List <src.SMethod.Limitation>(); OrderPair pair = task.order.First(); while (pair != null) { str[0] = pair.Detail.Volume.ToString(); str[task.AllCuts.Count + 1] = pair.Num.ToString(); limits.Add(new src.SMethod.Limitation(new double[] { }, pair.Num, src.SMethod.Limitation.Type.Equal)); for (int i = 0; i < task.AllCuts.Count; i++) { str[i + 1] = task.AllCuts[i].CountOf(pair.Detail).ToString(); limits.Last().equaLine.koeffs.Add(task.AllCuts[i].CountOf(pair.Detail)); } dgvAllCuts.Rows.Add(str); pair = task.GetNextOrderPair(pair); } String[] str2 = new String[task.AllCuts.Count + 2]; dgvAllCuts.Rows.Add(str2); str[0] = "left"; str[task.AllCuts.Count + 1] = ""; src.SMethod.EquaLine equa = new src.SMethod.EquaLine(new double[] { }, 0.0); for (int i = 0; i < task.AllCuts.Count; i++) { str[i + 1] = Math.Round(task.AllCuts[i].Left, 3).ToString().Replace(',', '.'); equa.koeffs.Add(task.AllCuts[i].Left); } src.SMethod.Task sTask = new src.SMethod.Task(equa); foreach (src.SMethod.Limitation limit in limits) { sTask.limitations.Add(limit); } solver = new src.SMethod.SimplexMethodSolver(sTask); dgvAllCuts.Rows.Add(str); solver.calculateOptimalPlan(); }