
- •Оглавление
- •Часть 1
- •Контрольные примеры
- •Выводы по первой части курсового проекта:
- •Приложение 1
- •Часть 2 Задание (вариант 7-2,7):
- •Краткая справка по теме:
- •Формализация задачи:
- •Листинг программы
- •Результаты тестирования программы:
- •Выводы по второй части кп:
- •Приложение 2
- •Часть 3 Задание(вариант г42-2,г-42):
- •Краткая справка по заданию
- •Формализация задачи
- •Листинг программы:
- •Контрольные примеры
- •Выводы по третьей части курсового проекта:
- •Приложение 3
- •Часть 4 Задание
- •Формализация задачи:
- •Листинг программы
- •Контрольные примеры:
- •Выводы по 4-ой части курсового проекта:
- •Приложение 4
- •Литература
Краткая справка по теме:
Балльная оценка объектов
К недостаткуперехода от векторной оценки объектов к скалярной следует отнести абстрактный характер последней, поскольку скалярнаяоценка измеряется в абсолютной шкале. При желании этот недостатокустраняетсяпутем пересчета многокритериальной скалярной оценки объектаиз абсолютной в более привычную балльную шкалу, например, в
пятибалльную.
Лучшей оценке ставится в соответствие высший балл EB , например, EB=5 , а худшей оценке присваивается низший балл EH . Он может устанавливаться в пределах от 1 до EB-1 , например EH=EB -2=3 .
Пересчету подвергается каждый оптимизируемый признак.
Пример .Сопоставим варианты трех конфигураций систем
в пятибалльной шкале: EH=1, EB=5 .
Таблица 2
Показателен тот факт, что балльность оценок вычисленных на основеформул (17) и (18)условна, поскольку они не имеют ничего общего с каждойиз исходных оценок в отдельности. Меньшая величинаоценок, вычисленныхпо формуле (17)по сравнению с формулой (18), объясняется исключением изоценок «минимальных достижений»объектов. Оценки, вычисленные вбаллах,отражают те же закономерности упорядочения вариантов, что иотносительные нормированныеоценки(см. таблицу 2).Такимобразом,балльные оценкивсего лишь более привычны, адля кого-то иболее удобныдля анализа результатов.
Расчётные формулы:
(12)
(17)
(18)
Формализация задачи:
Рис. 2.1 UMLдиаграмма
Задание реализовано на основе базовых классов, созданных редактором форм (классы Program и Form1).
Функции (12), (17), (18) представлены в виде методов f12, f17, f18 соответственно.
Листинг программы
Program.cs //Задание 7-1
// Сопоставить оценки, поставленные 10 конфигурациям систем по 3-м показателям . Оценивание производилось по 10-балльной шкале.
//В столбцах правой части табл. 1 привести расчеты оценок по указанным в верхней строке номерам формул.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace _2Face_CourseWork02
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace _2Face_CourseWork02
{
public partial class Form1 : Form
{
private int[,] data; // тут хранятся данные таблицы
/**
* конструктор
*/
public Form1()
{
InitializeComponent();
this.data = new int[,]{ // инициализируем массив данными из задания
{ 10, 8, 3, 9 },
{ 9, 7, 5, 10 },
{ 8, 6, 8, 8 },
{ 8, 5, 7, 7 },
{ 7, 9, 5, 6 },
{ 6, 7, 8, 5 },
{ 8, 5, 8, 10 },
{ 9, 4, 8, 6 },
{ 10, 8, 3, 9 },
{ 9, 8, 4, 8 },
};
this.ShowData(); // и рисуем их на форме
}
/**
* Отображение данных массива this.data
*/
private void ShowData()
{
this.dataGridView1.Columns.Clear();// удаляем всё, что было:
this.dataGridView1.Rows.Clear();
this.dataGridView1.Columns.Add("c_", "Конф-я");//добавляем названия столбцов:
for( int i=0; i<this.data.GetLength(1); i++ )
this.dataGridView1.Columns.Add("c"+i, "P" + (i+1).ToString() );
this.dataGridView1.Columns.Add("_12", "(12)");
this.dataGridView1.Columns.Add("_17", "(17)");
this.dataGridView1.Columns.Add("_18", "(18)");
this.dataGridView1.Rows.Add(this.data.GetLength(0)); // добавлям строки:
// заполняем данными:
for (int i = 0; i < this.data.GetLength(0); i++)
{
this.dataGridView1.Rows[i].Cells[0].Value = (i+1).ToString();
for (int j = 0; j < this.data.GetLength(1); j++)
{
this.dataGridView1.Rows[i].Cells[j+1].Value = this.data[i, j].ToString();
}
}
}
/**
* Чтение данных с формы
*/
private void ReadData()
{
this.data = new int[this.dataGridView1.Rows.Count, 4]; // по условию задано, что столбцов с данными 4, а вот строк - сколько угодно
for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < this.data.GetLength(1); j++)
{
this.data[i, j] = int.Parse(this.dataGridView1.Rows[i].Cells[j+1].Value.ToString());
}
}
}
/**
* Функция (12) */
private double f12(int[] x)
{
return x.Average();
}
/**
* Функция (17) */
private double f17(int[] x)
{
double n = x.Length;
double min = x.Min();
double max = x.Max();
double t = 0;
for (int i = 0; i < x.Length; i++)
{
t += (x[i] - min) / (max - min);
}
return t / n;
}
/**
* Функция (18) */
private double f18(int[] x)
{
return x.Average() / x.Max();
}
/**
* Расчёт последних трёх столбцов таблицы */
private void Fill()
{
this.ReadData();// считываем данные:
for (int i = 0; i < this.data.GetLength(0); i++)
{
// формируем массив целых числел из текущей i-ой строчки.
// этот массив будет передаваться в функции (12),(17),(18)
int[] x = new int[this.data.GetLength(1)];
for (int j = 0; j < this.data.GetLength(1); j++)
{
x[j] = this.data[i,j];
}
this.dataGridView1.Rows[i].Cells[this.data.GetLength(1) + 1].Value = this.f12(x).ToString();// заполняем сами поля
this.dataGridView1.Rows[i].Cells[this.data.GetLength(1) + 2].Value = this.f17(x).ToString();
this.dataGridView1.Rows[i].Cells[this.data.GetLength(1) + 3].Value = this.f18(x).ToString();
}
this.dataGridView1.Sort(this.dataGridView1.Columns[this.data.GetLength(1) + 3], ListSortDirection.Ascending); // сортировка
}
/**
* Обработчик кнопки "GO"
*/
private void gOToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Fill();
}
/**
* Кнопка экспорт
*/
private void exportToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Fill(); // перерасчитываем данные (на всякий случай)
SaveFileDialog dlg = new SaveFileDialog();//далее открываем диалог сохранения файла
dlg.FileName = "результат.txt";
dlg.Filter = "TXT|*.txt";
dlg.ShowDialog();
if (dlg.FileName.Length == 0)
return;
// создаём объект w класса StreamWriter, с помощью которого запишем результаты в поток (в файл)
StreamWriter w = new StreamWriter( dlg.FileName );
w.WriteLine("Результат:");
for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < this.dataGridView1.Columns.Count; j++)
{
w.Write("{0,4}\t", this.dataGridView1.Rows[i].Cells[j].Value.ToString());
}
w.WriteLine();
}
w.Close(); // закрываем поток
}
}
}