Example #1
0
        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);
              }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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;
        }
Example #4
0
        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();
        }
Example #5
0
        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;
        }
Example #6
0
        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();
        }