Beispiel #1
0
        // Вычисляем решение по методу уступок
        private void button2_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
            // Создаем множество альтернатив
            Data.criterions[] X = new Data.criterions[20];
            Data.criterions   Result;
            // Считываем исходные данные
            Data.dq1 = Convert.ToDouble(textBox1.Text);
            Data.q_1 = Convert.ToDouble(textBox2.Text);
            Data.q_2 = Convert.ToDouble(textBox3.Text);
            //Считываем таблицу в множество X
            for (int i = 1; i < 21; i++)
            {
                X[i - 1].q1 = Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);
                X[i - 1].q2 = Convert.ToDouble(dataGridView1.Rows[1].Cells[i].Value);
            }
            // Вызвали метод решения уступками
            Result = concessions_method(X, Data.dq1);
            // Выводим решение
            textBox4.Text = Result.q1.ToString();
            textBox5.Text = Result.q2.ToString();
            // Показываем решение графически
            PaintEventArgs pe = new PaintEventArgs(this.panel1.CreateGraphics(), this.panel1.ClientRectangle);

            panel1_Paint(sender, pe, X, Result);
        }
Beispiel #2
0
        // Решение методом притязаний
        private void button3_Click(object sender, EventArgs e)
        {
            panel2.Refresh();
            Data.criterions[]      S = new Data.criterions[20];
            List <Data.criterions> pareto;

            Data.criterions Result;

            Data.q_1 = Convert.ToDouble(textBox2.Text);
            Data.q_2 = Convert.ToDouble(textBox3.Text);
            Data.dq1 = Convert.ToDouble(textBox1.Text);

            for (int i = 1; i < 21; i++)
            {
                S[i - 1].q1 = Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);
                S[i - 1].q2 = Convert.ToDouble(dataGridView1.Rows[1].Cells[i].Value);
            }

            pareto = Pareto(S);
            dataGridView2.ColumnCount            = pareto.Count + 1;
            dataGridView2.RowCount               = 2;
            dataGridView2.Rows[0].Cells[0].Value = "q1";
            dataGridView2.Rows[1].Cells[0].Value = "q2";

            for (int i = 0; i < pareto.Count; i++)
            {
                dataGridView2.Rows[0].Cells[i + 1].Value = pareto[i].q1;
                dataGridView2.Rows[1].Cells[i + 1].Value = pareto[i].q2;

                for (int j = 0; j < 20; j++)
                {
                    if (S[j].q1 == pareto[i].q1 && S[j].q2 == pareto[i].q2)
                    {
                        dataGridView2.Columns[i + 1].HeaderText = (j + 1).ToString();
                    }
                }
            }

            Result        = claims_method(S, Data.q_1, Data.q_2, pareto);
            textBox6.Text = Result.q1.ToString();
            textBox7.Text = Result.q2.ToString();

            Data.criterions s_;
            s_.q1 = Data.q_1;
            s_.q2 = Data.q_2;

            PaintEventArgs pe = new PaintEventArgs(this.panel2.CreateGraphics(), this.panel2.ClientRectangle);

            panel2_Paint(sender, pe, pareto, S, Result, s_);
        }
Beispiel #3
0
        //метод притязаний
        private Data.criterions claims_method(Data.criterions[] s, double q1_, double q2_, List <Data.criterions> pareto)
        {
            bool   type = false; // Решение через мн-во Парето или через условие
            double min_p, p;

            Data.criterions Result = new Data.criterions();

            foreach (Data.criterions tmp in s)
            {
                if (tmp.q1 > q1_ && tmp.q2 > q2_)
                {
                    type = true;
                }
            }

            switch (type)
            {
            // Решаем через множество Парето
            case true:
                min_p  = Math.Sqrt(Math.Pow((q1_ - pareto[0].q1), 2) + Math.Pow((q2_ - pareto[0].q2), 2));
                Result = pareto[0];
                foreach (Data.criterions tmp in pareto)
                {
                    p = Math.Sqrt(Math.Pow((q1_ - tmp.q1), 2) + Math.Pow((q2_ - tmp.q2), 2));
                    if (min_p > p)
                    {
                        min_p  = p;
                        Result = tmp;
                    }
                }
                break;

            // Решаем через условие
            case false:
                min_p  = Math.Pow((q1_ - s[0].q1), 2) + Math.Pow((q2_ - s[0].q2), 2);
                Result = s[0];
                foreach (Data.criterions val in s)
                {
                    p = Math.Pow((q1_ - val.q1), 2) + Math.Pow((q2_ - val.q2), 2);
                    if (min_p > p)
                    {
                        min_p  = p;
                        Result = val;
                    }
                }
                break;
            }

            return(Result);
        }
Beispiel #4
0
        //Метод уступок
        private Data.criterions concessions_method(Data.criterions[] s, double dq1)
        {
            double max_q1, max_q2;

            Data.criterions Result          = new Data.criterions();
            LinkedList <Data.criterions> X1 = new LinkedList <Data.criterions>();

            //Находим максимальное значение 1 критерия
            max_q1 = s[0].q1;
            foreach (Data.criterions tmp in s)
            {
                if (max_q1 < tmp.q1)
                {
                    max_q1 = tmp.q1;
                }
            }

            //определяем множество альтернатив
            foreach (Data.criterions tmp in s)
            {
                if ((max_q1 - tmp.q1) <= dq1)
                {
                    X1.AddLast(tmp);
                }
            }

            //Определяем максимальное значение 2 критерия из множества альтернатив X1
            max_q2 = X1.First.Value.q2;
            Result = X1.First.Value;
            foreach (Data.criterions tmp in X1)
            {
                if (max_q2 < tmp.q2)
                {
                    max_q2 = tmp.q2;
                    Result = tmp;
                }
            }

            return(Result);
        }
Beispiel #5
0
        // Вывод множества Парето
        private void button4_Click(object sender, EventArgs e)
        {
            List <Data.criterions> pareto;

            Data.criterions[] S = new Data.criterions[20];

            for (int i = 1; i < 21; i++)
            {
                S[i - 1].q1 = Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);
                S[i - 1].q2 = Convert.ToDouble(dataGridView1.Rows[1].Cells[i].Value);
            }

            pareto = Pareto(S);
            dataGridView2.ColumnCount            = pareto.Count + 1;
            dataGridView2.RowCount               = 2;
            dataGridView2.Rows[0].Cells[0].Value = "q1";
            dataGridView2.Rows[1].Cells[0].Value = "q2";

            for (int i = 0; i < pareto.Count; i++)
            {
                dataGridView2.Rows[0].Cells[i + 1].Value = pareto[i].q1;
                dataGridView2.Rows[1].Cells[i + 1].Value = pareto[i].q2;

                for (int j = 0; j < 20; j++)
                {
                    if (S[j].q1 == pareto[i].q1 && S[j].q2 == pareto[i].q2)
                    {
                        dataGridView2.Columns[i + 1].HeaderText = (j + 1).ToString();
                    }
                }
            }

            PaintEventArgs pe = new PaintEventArgs(this.panel3.CreateGraphics(), this.panel3.ClientRectangle);

            panel3_Paint(sender, pe, pareto, S);
        }
Beispiel #6
0
        private void panel2_Paint(object sender, PaintEventArgs e, List <Data.criterions> pareto, Data.criterions[] s, Data.criterions s1, Data.criterions s_)
        {
            panel2.Refresh();
            Graphics g = e.Graphics;
            Pen      p = new Pen(Color.Black, 2);

            g.DrawLine(p, 0, 350, 400, 350);
            g.DrawLine(p, 50, 0, 50, 400);

            p = new Pen(Color.Black, 1);
            Font       f         = new Font("Times New Roman", 8);
            SolidBrush drawBrush = new SolidBrush(Color.Black);

            for (int i = 1; i <= 15; i++)
            {
                g.DrawLine(p, 47, 350 - i * 22, 53, 350 - i * 22);
                g.DrawLine(p, 50 + i * 22, 347, 50 + i * 22, 353);

                g.DrawString(i.ToString(), f, drawBrush, 30, 345 - i * 22);
                g.DrawString(i.ToString(), f, drawBrush, 45 + i * 22, 360);
            }
            g.DrawString("0", f, drawBrush, 30, 360);

            foreach (Data.criterions tmp in s)
            {
                g.DrawEllipse(p, 48 + (float)tmp.q1 * 22, 350 - (float)tmp.q2 * 22, 3, 3);
            }
            // Выводим мн-во Парето
            p = new Pen(Color.Red, 2);
            foreach (Data.criterions val in pareto)
            {
                g.DrawEllipse(p, 48 + (float)val.q1 * 22, 350 - (float)val.q2 * 22, 5, 5);
            }
            // Желаемый выбор
            p = new Pen(Color.Green, 2);
            g.DrawEllipse(p, 48 + (float)s1.q1 * 22, 350 - (float)s1.q2 * 22, 5, 5);
            // Полученный выбор
            p = new Pen(Color.Blue, 2);
            g.DrawEllipse(p, 48 + (float)s_.q1 * 22, 350 - (float)s_.q2 * 22, 5, 5);
        }
Beispiel #7
0
        private void panel1_Paint(object sender, PaintEventArgs e, Data.criterions[] x, Data.criterions x1)
        {
            panel1.Refresh();
            Graphics g = e.Graphics;
            Pen      p = new Pen(Color.Black, 2);

            // Декартовы координаты
            g.DrawLine(p, 0, 350, 400, 350);
            g.DrawLine(p, 50, 0, 50, 400);

            p = new Pen(Color.Blue, 1);
            // Область альтернатив с интервалом dq1
            g.DrawLine(p, (48 + (float)(x1.q1 + Data.dq1) * 22), 350, (48 + (float)(x1.q1 + Data.dq1) * 22), 0);
            g.DrawLine(p, (48 + (float)(x1.q1 - Data.dq1) * 22), 350, (48 + (float)(x1.q1 - Data.dq1) * 22), 0);

            p = new Pen(Color.Black, 1);
            Font       f         = new Font("Times New Roman", 8);
            SolidBrush drawBrush = new SolidBrush(Color.Black);

            for (int i = 1; i <= 15; i++)
            {
                g.DrawLine(p, 47, 350 - i * 22, 53, 350 - i * 22);
                g.DrawLine(p, 50 + i * 22, 347, 50 + i * 22, 353);

                g.DrawString(i.ToString(), f, drawBrush, 30, 345 - i * 22);
                g.DrawString(i.ToString(), f, drawBrush, 45 + i * 22, 360);
            }
            g.DrawString("0", f, drawBrush, 30, 360);

            foreach (Data.criterions tmp in x)
            {
                g.DrawEllipse(p, 48 + (float)tmp.q1 * 22, 350 - (float)tmp.q2 * 22, 3, 3);
            }

            p = new Pen(Color.Red, 2);
            p = new Pen(Color.Green, 2);
            g.DrawEllipse(p, 48 + (float)x1.q1 * 22, 350 - (float)x1.q2 * 22, 5, 5);
        }