Круговая диаграмма принятия решений (паутинная диаграмма)

  • Вид работы:
    Контрольная работа
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    688,23 kb
  • Опубликовано:
    2011-06-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Круговая диаграмма принятия решений (паутинная диаграмма)



Пояснительная записка

по дисциплине «Теория принятия решений»

Тема: «Круговая диаграмма принятия решений (Паутинная диаграмма)»

Оглавление

1. Постановка задачи

. Краткие теоретические сведения

. Реализация программного средства

.1 Проектирование

.2 Листинг программного кода

. Пример работы программы

Выводы

Используемые программные средства

1. Постановка задачи

Необходимо разработать программу, реализующую метод принятия решений на основе круговой диаграммы. В данном случае будет разработано программное средство, реализующее метод принятия решения на основе паутинной диаграммы. Входными данными в программе являются: количество объектов исследования, количество критериев, по которым оцениваются объекты, веса, соответствующие критериям. Эти данные могут вводится пользователем, как вручную, так и могут быть загружены из текстового файла. К входным также можно отнести настройки, которые устанавливает пользователь, тем самым регулируя объекты отображаемые на диаграмме.

Выходными данными являются, главным образом, паутинная диаграмма, отображающая веса критериев, отложенные на осях, многоугольники принятия решений и легенду об объектах на диаграмме. К выходным данным относятся также файлы, в которые пользователь сохраняет таблицу весов, диаграмму и результаты расчета площадей многоугольников, и найденной максимальной площади.

 


2. Краткие теоретические сведения


В теории принятия решений, существует метод, в основе которого лежит графическое отображение весов критериев принятия решений «Круговая диаграмма принятия решений». Суть метода заключается в следующем: имеются n объектов, из которых необходимо по определенным критериям mi выбрать один или несколько объектов удовлетворяющих критериям.

Для каждого объекта указывается, каким весом обладает каждый критерий, т.о. чтобы сумма весов одного критерия у всех объектов равнялась единице. .

Составляется таблица, в строки которой, записываются веса одного критерия для каждого объекта. На основании данных таблица составляется диаграмма. Лучи диаграммы соответствуют критериям. На лучах откладываются веса соответствующие критериям объектов. Затем точки на весах соединяются в многоугольники, представляющие собой объекты.

В зависимости от размеров многоугольников и их формы, принимается решение о выборе необходимого объекта. Кроме того можно наглядно оценить как соотносятся объекты между собой, как в частных критериях, так и по всем критериям в целом.

Подобные диаграммы нередко используются для наглядного отображения сравнительных значений во времени или по категориям.

программа паутинный диаграмма


3. Реализация программного средства


Среда разработки: Visual Studio 2008

Язык программирования: C#

 

3.1 Проектирование


При проектировании программного средства будем использовать объектно-ориентированный подход.

Список классов с кратким описанием:

1)      Form.cs - это главное окно, служит для ввода данных, запуска работы программы, вывода диаграмм, ввода настроек, содержит метод подсчета площади многоугольников.

2)      Reader.cs - это класс содержит методы, реализующие сохранение данных в файл.

3)      Settings.cs - класс настроек визуализации программы.

4)      Writer.cs - класс содержит методы реализующие чтение данных из файла.

 

3.2 Листинг программного кода

class Settings

{bool legend;bool axis;bool pipki;int pipkiSize;bool countSum;

Settings()

{= false;= false;= false;= 0;= false;

}Settings(bool leg, bool ax, bool pip, int pipSize, bool sum)

{= leg;= ax;= pip;= pipSize;= sum;

}

bool getCountSum()

{countSum;

}void setCountSum(bool sum)

{= sum;

}int getPipSize()

{pipkiSize;

}void setPipSize(int size)

{= size;

}bool getPipki()

{pipki;

}void setPipki(bool pip)

{= pip;

}bool getLegend()

{legend;

}bool getAxis()

{axis;

}void setLegend(bool leg)

{= leg;

}void setAxis(bool ax)

{= ax;

}

public class Reader

{string fileName;string[] inputTxt;double[,] matrix;double[,] table;int rows;int cols;System.Globalization.NumberFormatInfo numberFormat;

Reader(string name)

{= name;

}

void ReadTable(out double[,] table)

{= new System.Globalization.NumberFormatInfo();.CurrencyDecimalSeparator = ".";

//забираем весь текст из файла по строкам[] fullText = File.ReadAllLines(fileName);

//забираем первую строку в массив по строкам разделенным пробелом[] aloneString = fullText[0].Split(new char[] { ' ' });

//массив куда будут помещены значения файла= new double[fullText.Length, aloneString.Length];

//double[,] temp = new double[fullText.Length, aloneString.Length];

(int i = 0; i < aloneString.Length; i++)

{[0, i] = double.Parse(aloneString[i], numberFormat);

}

{= fullText[i].Split(new char[] { ' ' });(int j = 0; j < aloneString.Length; j++)

{[i, j] = double.Parse(aloneString[j], numberFormat);

}

}

}

}

public static class Writer

{static string fileName;static string[] inputTxt;static double[,] matrix;

static int rows;static int cols;static System.Globalization.NumberFormatInfo numberFormat;

Writer()

{= new System.Globalization.NumberFormatInfo();.CurrencyDecimalSeparator = ".";

}

static void WriteTable(string nameFile, double[,] table)

{.fileName = nameFile;.matrix = table;

(Writer.matrix != null)

{= matrix.GetLength(0);= matrix.GetLength(1);= new string[rows];

(int i = 0; i < rows; i++)

{(int j = 0; j < cols; j++)

{[i] += matrix[i, j].ToString("0.0000", numberFormat);(j < cols - 1)

{[i] += " ";

}

}

}.WriteAllLines(nameFile, inputTxt);

}

}

}

public partial class Form1 : Form

{

bm;

bool goodGo = false;

//число кусков (критериев)float countOfPie;

//угол для кусковfloat degrees;

//число целейint aims;

//таблица весовDouble[,] tables;double[,] fromFileTable;static int rows;static int cols;

//не верно заполненные рядыint[] wrongRows;cR = 0, cG =0, cB =0;Settings settings = new Settings();

Form1()

{();

}

//получение данных для таблицы и рисованияvoid getData()

{= (int)numericUpDown1.Value;= 360 / countOfPie;= (int)numericUpDown2.Value;.setLegend(checkBox1.Checked);.setAxis(checkBox2.Checked);.setPipki(checkBox3.Checked);.setPipSize((int)numericUpDown3.Value);.setCountSum(checkBox4.Checked);

}

// создание и заполнение таблицы из формыvoid createTableOfWeight()

{= new double[rows, cols];(int i = 0; i < rows; i++)

{(int j = 0; j < cols; j++)

{[i, j] = Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);

}

}

/*(int i = 0; i < rows; i++)

{(int j = 0; j < cols; j++)

{.AppendText(tables[i,j].ToString());.AppendText(" ");

}.AppendText(" /n ");

}

*/

}

//проверка правильного заполнения рядовBoolean checkTable()

{

[]tempTable = new int[rows];check = false;sum = 0;k=0;(int i = 0; i < tables.GetLength(0); i++)

{= 0;

(int j = 0; j < tables.GetLength(1); j++)

{+= tables[i,j];

// textBox1.AppendText(sum.ToString());

// textBox1.AppendText(" ");

}

//если сумма в ряде больше единицы, записываем номер этого ряда

(sum > 1)

{[k] = i;++;= 0;

//textBox1.AppendText("get bug ");

}

}

//заполним таблицу ошибочных рядов= new int[k];(int l =0; l<k; l++)

[l] = tempTable[l];

}

//если все ряды в порядке(k == 0)

{= true;

}check;

}

//рисуемvoid button1_Click(object sender, EventArgs e)

{= true;

//DEBUG

// textBox1.AppendText(degrees.ToString());

// textBox1.AppendText(" ");

//DEBUG

//забираем данные();

//забираем данные из таблицы();

//проверяем данные, если в порядке, то рисуем.(checkTable() == true)

{.Text = "Данные верны ";();

}

{

// MessageBox msg = new MessageBox;

//не в порядкеtext;= "Ошибка в заполнении рядов: ";(int i = 0; i < wrongRows.Length; i++)

{+= " " + (wrongRows[i]+1) + ";";

}.Text = text;

}

}

//рисуем пирогvoid drawMyPie()

{= new Bitmap(pictureBox1.Width, pictureBox1.Height);.Image = bm;g = Graphics.FromImage(pictureBox1.Image);

//длина единичного отрезка на пирогеradius = 0;

//Graphics g = Graphics.FromHwnd(panel1.Handle);.SmoothingMode = SmoothingMode.AntiAlias;.Clear(Color.AntiqueWhite);

//смещениеdx = 260;

//масштаб пирога. цифра больше - масштаб меньше.call = 70;

//пирогrect = new Rectangle(call, call, pictureBox1.Width - dx-call*2,.Height - call*2);start, end;= 0;= 0;(int i = 0; i < countOfPie; i++)

{= i * degrees;= start + degrees;.DrawPie(new Pen(Color.Black, 1), rect, 0, end);

}

// единичный отрезок= (pictureBox1.Height - call*2) / 2; //старый вариант

//radius = (panel1.Height) / 2 - 10;

// центр областиOx = (pictureBox1.Width-dx) / 2;Oy = pictureBox1.Height / 2;R = 0;angle = 0;

//рисуем пипки(settings.getPipki() == true)

{

//задание точек для пипок[] pipkiPoints = new PointF[rows];Rpipki = 0;

(int lm = 0; lm < 10; lm++)

{

(int m = 0; m < rows; m++)

{= (Convert.ToDouble(lm)+1)/10*radius;

//textBox1.AppendText("Rpipki = ");

//textBox1.AppendText(Rpipki.ToString());

//textBox1.AppendText("LM = ");

///textBox1.AppendText(lm.ToString());= Math.PI * (degrees * m) / 180.0;[m].X = (float)(Rpipki * Math.Cos(angle)) + Ox;[m].Y = (float)(Rpipki * Math.Sin(angle)) + Oy;myBrush = new SolidBrush(Color.Black);

//SolidBrush myBrush = new SolidBrush(Color.Red);(((lm+1) % 5) == 0)

{.FillEllipse(myBrush, pipkiPoints[m].X - settings.getPipSize() / 2, pipkiPoints[m].Y - settings.getPipSize() / 2, settings.getPipSize(), settings.getPipSize());

}.FillEllipse(myBrush, pipkiPoints[m].X - settings.getPipSize() / 4, pipkiPoints[m].Y - settings.getPipSize() / 4, settings.getPipSize() / 2, settings.getPipSize() / 2);

}.FillEllipse(new SolidBrush(Color.Black), Ox - settings.getPipSize() / 2, Oy - settings.getPipSize() / 2, settings.getPipSize(), settings.getPipSize());

}

}

//рисуем подписи(settings.getAxis() == true)

{

//определение точек для подписей осей[] textPoints = new PointF[rows];R1 = 0;

(int s = 0; s < rows; s++)

{text2 = "Критерий ";= radius + 40;= Math.PI * (degrees * s) / 180.0;[s].X = (float)(R1 * Math.Cos(angle)) + Ox;[s].Y = (float)(R1 * Math.Sin(angle)) + Oy;((degrees * s) == 90)

{[s].Y += 10;

}((degrees * s) == 270)

{[s].Y -= 10;

}((degrees*s > 100) && (degrees*s < 260))

{.AppendText(degrees.ToString());.AppendText("\n");[s].X -= 32;.AppendText(textPoints[s].X.ToString());.AppendText("\n");

}+= " " + Convert.ToString(s + 1);.DrawString(text2, new Font("helveticz", 8), Brushes.Black, textPoints[s]);

}

}

[] polygonPoints = new PointF[rows];

//рисование многоугольника и надписей.(int j = 0; j < cols; j++)

{

//получаем точки для многоугольника(int i = 0; i < rows; i++)

}

text = "Объект №";+= " " + Convert.ToString(j+1);

myPen = new Pen(Color.FromArgb(cR, cG, cB), 2);

//тип линии определяем(j % 3 == 0).DashStyle = DashStyle.Dot;(j % 2 == 0).DashStyle = DashStyle.Dash;(j % 5 == 0).DashStyle = DashStyle.DashDot;();(polygonPoints.Length > 1)

{.DrawPolygon(myPen, polygonPoints);(settings.getLegend() == true)

{.DrawLine(myPen, (rect.Width + 220), (j + 1) * 21, (rect.Width + 280), (j + 1) * 21);.DrawString(text, new Font("Helvetica", 8), Brushes.Black, rect.Width + 300, (j + 1) * 20);

}

}

}.Clear();(settings.getCountSum() == true)

{max = 0;ch = 0;

//подсчет площади многоугольника.

//первый и второй катет треугольникаpRS1 = 0;pRS2 = 0;

//площадь треугольникаsquareSum = 0;squareTriangle = 0;

(int countSq = 0; countSq < cols; countSq++)

{(int pS = 1; pS <= rows; pS++)

{(pS == rows)

{= tables[0, countSq] * radius;

}

{= tables[pS, countSq] * radius;

}= tables[pS - 1, countSq] * radius;

= Math.PI * (degrees) / 180.0;

= 0.5 * pRS1 * pRS2 * (float)(Math.Sin(angle));+= squareTriangle;

}(squareSum > max)

{= countSq;= squareSum;

}.AppendText("Площадь многоугольника №: ");.AppendText(Convert.ToString(countSq+1));.AppendText(" ");.AppendText(squareSum.ToString());.AppendText(" единиц; ");.AppendText("\n");

//string tex = "lj";

//tex.

}.AppendText("Максимальная площадь ");.AppendText(max.ToString());.AppendText(" у объекта № ");.AppendText(Convert.ToString(ch+1));

.Dispose();.Invalidate();

}

}

void nextRGB()

{dx = 60;+= dx;(cR > 255)

{+= dx;-= 255;(cG > 255)

{+= dx;-= 255;(cB > 255)

{-= 255;

}

}

}

}

//onPaintvoid panel1_Paint(object sender, PaintEventArgs e)

{g = e.Graphics;(goodGo == true)();

}

//создание таблицыvoid CreateTable(int row, int col)

{_row = row;_col = col;.ColumnCount = _col;.RowHeadersVisible = false;.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;.RowCount = _row;

}

//задание данных для таблицыvoid Button2_Click(object sender, EventArgs e)

{();= (int)countOfPie;= aims;(rows, cols);

}

//применить настройки и отрисоватьvoid button3_Click_1(object sender, EventArgs e)

{(goodGo == true)

{();();

}

}

void выходToolStripMenuItem_Click(object sender, EventArgs e)

{();

}

//очистить область диаграммvoid button5_Click(object sender, EventArgs e)

{

// Graphics g = Graphics.FromHwnd(panel1.Handle);g = Graphics.FromHwnd(pictureBox1.Handle);.Clear(Color.AntiqueWhite);

}

void Form1_Load(object sender, EventArgs e)

{

}

//загрузить данныеvoid toolStripMenuItem2_Click(object sender, EventArgs e)

{fileName;(openFileDialog1.ShowDialog() == DialogResult.OK)

{.InitialDirectory = "C:\tmp";.Filter = "diag files (*.diag)|*.abs|All files|*.*";= openFileDialog1.FileName;myReader = new Reader(fileName);.ReadTable(out fromFileTable);

//сбор и установка данных= fromFileTable.GetLength(0);.Value = (int)countOfPie;= 360 / countOfPie;= fromFileTable.GetLength(1);.Value = aims;

= (int)countOfPie;= aims;

//создаем таблицу на форме(rows, cols);

{(int j = 0; j < cols; j++)

{.Rows[i].Cells[j].Value =Convert.ToDouble(fromFileTable[i,j]);

}

}

}

}

//сохранить данныеvoid toolStripMenuItem3_Click(object sender, EventArgs e)

{.InitialDirectory = "C:\tmp";.Filter = "diag files (*.diag)|*.abs|All files|*.*";(saveFileDialog1.ShowDialog() == DialogResult.OK)

{fileName = saveFileDialog1.FileName;.WriteTable(fileName, tables);

}

}

//сохранить диаграммуvoid toolStripMenuItem4_Click(object sender, EventArgs e)

{.InitialDirectory = "C:\tmp";.Filter =

"Bitmap File(*.bmp)|*.bmp|" +

"GIF File(*.gif)|*.gif|" +

"JPEG File(*.jpg)|*.jpg|" +

"TIF File(*.tif)|*.tif|" +

"PNG File(*.png)|*.png";(saveFileDialog1.ShowDialog() == DialogResult.OK)

{fileName = saveFileDialog1.FileName;

// Get the extensionstrFilExtn =.Remove(0, fileName.Length - 3);

// Save file(strFilExtn)

{"bmp":.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);;"jpg":.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);;"gif":.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);;"tif":.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff);;"png":.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);;:;

}

}

}

}

4. Пример работы программы


1) Критериев - 3

Объектов - 3

Веса:

0,2

0,7

0,1

0,1

0,2

0,7

0,5

0,4

0,1



Площадь многоугольника №: 1 3894,08315822482 единиц;

Площадь многоугольника №: 2 15347,2689177096 единиц;

Площадь многоугольника №: 3 18783,224645555 единиц;

Максимальная площадь 18783,224645555 у объекта № 3

Исходные данные введены вручную.

2) Число критериев - 10;

Число объектов - 4.

Веса:

Данные из файла:

.1000 0.7000 0.1000 0.1000

.1000 0.2000 0.5000 0.2000

.3000 0.2000 0.3000 0.2000

.5000 0.2000 0.1000 0.1000

.3500 0.3500 0.1500 0.1500

.8000 0.0500 0.1000 0.0500

.2000 0.2000 0.2000 0.4000

.3000 0.3000 0.3000 0.1000

.2000 0.3000 0.3000 0.2000

.4000 0.4000 0.1000 0.1000


Площадь многоугольника №: 1 16246,5310901403 единиц;

Площадь многоугольника №: 2 29733,4839329124 единиц;

Площадь многоугольника №: 3 37040,5361935496 единиц;

Площадь многоугольника №: 4 40344,2566305399 единиц;

Максимальная площадь 40344,2566305399 у объекта № 4

 

 


Выводы


В результате проделанной работы было разработано программное средство для принятия решений на основе паутинной диаграммы.

Программное средство позволяет вводить данные в ручном и автоматическом режиме из файла; выводить паутинную диаграмму на основе введенных данных; подсчитывать площади многоугольников-объектов; определять максимальную площадь.

Пользователь, на основе полученных диаграмм принимает решение о том или ином объекте исследования.

Данное приложение может использоваться, как демонстрационно-обучающее по теме «Круговая диаграмма принятия решений» дисциплины «Теория принятия решений».


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!