Разработка приложения для выбора покупки пары станков
Понятия оптимизации проектных решений. Нахождение максимума (минимума) линейной целевой функции. Схема алгоритма метода Саати для вычисления весов критериев. Создание приложения, позволяющего производить однокритериальную и многокритериальную оптимизацию.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.02.2016 |
Размер файла | 781,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
7. Подиновский В.В. Парето-оптимальные решения многокритериальных задач. / В.В. Подиновский, В.Д. Ногин. М.: Наука. Главная редакция, 2007. - 256 с.
Приложение А
Листинг программы
Класс Odnomernaj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class Odnomernaj
{
DataGridView dataGridView1;
DataGridView dataGridView2;
double koluz, chasmes, stoim, moshnmes;
public Odnomernaj(DataGridView dataGridView1, DataGridView dataGridView2, double koluz, double chasmes, double stoim, double moshnmes)
{
this.dataGridView1 = dataGridView1;
this.dataGridView2 = dataGridView2;
this.koluz = koluz;
this.moshnmes = moshnmes;
this.stoim = stoim;
this.chasmes = chasmes;
}
public void Proiz() //поиск альтернатив подходящих по производительности
{
int k = 0;
Sort(1, false);
for (int i = 0; i < dataGridView1.RowCount; i++)
if (double.Parse(dataGridView1[1, i].Value.ToString()) >= (koluz / 12) / chasmes)
{
dataGridView2.RowCount = k + 1;
dataGridView2[0, k].Value = dataGridView1[0, i].Value;
dataGridView2[1, k].Value = dataGridView1[1, i].Value;
dataGridView2[2, k].Value = dataGridView1[2, i].Value;
dataGridView2[3, k].Value = dataGridView1[3, i].Value;
k++;
}
Vizual.viz(dataGridView2);
}
public void Stoim() //поиск альтернатив подходящих по стоимости
{
int k = 0;
Sort(2, true);
for (int i = 0; i < dataGridView1.RowCount; i++)
if (double.Parse(dataGridView1[2, i].Value.ToString()) <= stoim)
{
dataGridView2.RowCount = k + 1;
dataGridView2[0, k].Value = dataGridView1[0, i].Value;
dataGridView2[1, k].Value = dataGridView1[1, i].Value;
dataGridView2[2, k].Value = dataGridView1[2, i].Value;
dataGridView2[3, k].Value = dataGridView1[3, i].Value;
k++;
}
Vizual.viz(dataGridView2);
}
public void Energ() //поиск альтернатив подходящих по энергоэффективности
{
int k = 0;
Sort(3, true);
for (int i = 0; i < dataGridView1.RowCount; i++)
if (moshnmes >= chasmes * double.Parse(dataGridView1[1, i].Value.ToString()) * double.Parse(dataGridView1[3, i].Value.ToString()))
{
dataGridView2.RowCount = k + 1;
dataGridView2[0, k].Value = dataGridView1[0, i].Value;
dataGridView2[1, k].Value = dataGridView1[1, i].Value;
dataGridView2[2, k].Value = dataGridView1[2, i].Value;
dataGridView2[3, k].Value = dataGridView1[3, i].Value;
k++;
}
Vizual.viz(dataGridView2);
}
public void Sort(int ii, bool f) //метод сортировки по заданному столбцу
{
object temp = 0;
if (f)
for (int i = 0; i < dataGridView1.RowCount; i++)
for (int j = i; j < dataGridView1.RowCount; j++)
{
if (double.Parse(dataGridView1[ii, i].Value.ToString()) > double.Parse(dataGridView1[ii, j].Value.ToString()))
{
for (int k = 0; k < dataGridView1.ColumnCount; k++)
{
temp = dataGridView1[k, i].Value;
dataGridView1[k, i].Value = dataGridView1[k, j].Value;
dataGridView1[k, j].Value = temp;
}
}
}
else
for (int i = 0; i < dataGridView1.RowCount; i++)
for (int j = i; j < dataGridView1.RowCount; j++)
if (double.Parse(dataGridView1[ii, i].Value.ToString()) < double.Parse(dataGridView1[ii, j].Value.ToString()))
{
for (int k = 0; k < dataGridView1.ColumnCount; k++)
{
temp = dataGridView1[k, i].Value;
dataGridView1[k, i].Value = dataGridView1[k, j].Value;
dataGridView1[k, j].Value = temp;
}
}
}
}
}
Класс Mnogomernaj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class Mnogomernaj
{
double temp;
object[,] A; //массив альтернатив
double[,] oc1, oc2; //массивы оценок
double[] ves, //веса альтернатив
A1, //оценки ольтернативы
soglas;
DataGridView dataGridView1, dataGridView2;
ListBox listBox1;
Label label1;
object DGVR;
Form5 f5;
Form4 f4;
public Mnogomernaj(DataGridView dataGridView1, DataGridView dataGridView2, ListBox listBox1, Label label1)
{
this.dataGridView1 = dataGridView1;
this.dataGridView2 = dataGridView2;
this.listBox1 = listBox1;
this.label1 = label1;
f5 = new Form5();
f4 = new Form4();
}
void Altern() //запись всех альтернатив в матрицу
{
A = new object[dataGridView1.RowCount, dataGridView1.ColumnCount];
A1 = new double[A.GetLength(0)];
for (int i = 0; i < dataGridView1.RowCount; i++)
for (int k = 0; k < dataGridView1.ColumnCount; k++)
A[i, k] = dataGridView1[k, i].Value;
}
public void Pareto()//метод Парето
{
Altern();
int kk = 0;
for (int i = 0; i < A.GetLength(0); i++)
if (Sravnenie(i))
{
dataGridView1.RowCount = kk + 1;
for (int g = 0; g < A.GetLength(1); g++)
dataGridView1[g, kk].Value = A[i, g];
kk++;
}
}
bool Sravnenie(int ii) //метод сравнения альтернатив
{
bool f = true;
for (int i = 0; i < A.GetLength(0) && f; i++)
if (ii != i && Convert.ToDouble(A[ii, 1]) <= Convert.ToDouble(A[i, 1]) && Convert.ToDouble(A[ii, 2]) >= Convert.ToDouble(A[i, 2]) && Convert.ToDouble(A[ii, 3]) >= Convert.ToDouble(A[i, 3]) && Convert.ToDouble(A[ii, 4]) <= Convert.ToDouble(A[i, 4]) && Convert.ToDouble(A[ii, 5]) <= Convert.ToDouble(A[i, 5]) && Convert.ToDouble(A[ii, 6]) <= Convert.ToDouble(A[i, 6]))
f = false;
return f;
}
void Perev() //метод перевода значений критериев в безразмерные величины
{
double temp = 0;
dataGridView2.RowCount = dataGridView1.RowCount;
dataGridView2.ColumnCount = dataGridView1.ColumnCount;
for (int i = 0; i < A.GetLength(1); i++)
{
if (i == 1 || i == 5)
{
for (int k = 0; k < A.GetLength(0); k++)
if (temp < Convert.ToDouble(A[k, i]))
temp = Convert.ToDouble(A[k, i]);
for (int k = 0; k < A.GetLength(0); k++)
dataGridView2[i, k].Value = String.Format("{0:f2}", (Convert.ToDouble(dataGridView1[i, k].Value) / temp));
}
else
if (i == 2 || i == 3)
{
for (int k = 0; k < A.GetLength(0); k++)
if (temp < Convert.ToDouble(A[k, i]))
temp = Convert.ToDouble(A[k, i]);
for (int k = 0; k < A.GetLength(0); k++)
dataGridView2[i, k].Value = String.Format("{0:f2}", (1 - (Convert.ToDouble(dataGridView1[i, k].Value) / temp)));
}
else
{
for (int k = 0; k < A.GetLength(0); k++)
dataGridView2[i, k].Value = dataGridView1[i, k].Value;
}
temp = 0;
}
}
double Soglas() //метод проверки соглассованности выставленных оценок
{
soglas = new double[oc1.GetLength(1)];
ves = new double[oc2.GetLength(1)];
double pr = 0;
for (int i = 0; i < oc1.GetLength(1); i++)//вычисление суммы оценок по столбцам
{
for (int k = 0; k < oc1.GetLength(0); k++)
pr = pr + Math.Abs(oc1[k, i] - oc2[k, i]);
soglas[i] = pr;
pr = 0;
}
double sog = 0;
for (int i = 0; i < soglas.Length; i++)
{
sog = sog + Math.Pow(soglas[i], 2);
}
double W = 1 - ((12 * sog) / (2 * 2 * (6 * 6 * 6 - 6)));//расчет коэффициента согласованности
return W;
}
void veskrit() //метод вычисления веса каждого из критериев
{
double pr = 0;
for (int i = 0; i < oc2.GetLength(1); i++)
{
for (int k = 0; k < oc2.GetLength(0); k++)
pr = pr + oc2[i, k]+ oc1[i,k];
ves[i] = pr;
pr = 0;
}
for (int i = 0; i < ves.Length; i++)
pr += ves[i];
listBox1.Items.Clear();
for (int i = 0; i < ves.Length; i++)
{
ves[i] = ves[i] / pr;
listBox1.Items.Add(dataGridView2.Columns[i + 1].HeaderText + " " + ves[i].ToString("f3"));
}
}
void Sort()
{
for (int i = 0; i < A1.Length; i++)
for (int j = 0; j < A1.Length; j++)
if (A1[i] > A1[j])
{
temp = A1[i];
A1[i] = A1[j];
A1[j] = temp;
for (int ii = 0; ii < dataGridView2.ColumnCount; ii++)
{
DGVR = dataGridView2[ii, i].Value;
dataGridView2[ii, i].Value = dataGridView2[ii, j].Value;
dataGridView2[ii, j].Value = DGVR;
}
for (int ii = 0; ii < dataGridView1.ColumnCount; ii++)
{
DGVR = dataGridView1[ii, i].Value;
dataGridView1[ii, i].Value = dataGridView1[ii, j].Value;
dataGridView1[ii, j].Value = DGVR;
}
}
}
public void Saati()
{
bool f1, f2;
f1 = false;
f2 = false;
Altern();
Perev();
P1:
f4.Text = "Эксперт 1";
if (f4.ShowDialog() == DialogResult.OK)
{
oc1 = new double[f4.dataGridView1.RowCount, f4.dataGridView1.ColumnCount];
for (int i = 0; i < f4.dataGridView1.RowCount; i++)
for (int k = 0; k < f4.dataGridView1.ColumnCount; k++)
{
oc1[i, k] = Convert.ToDouble(f4.dataGridView1[k, i].Value);
}
f1 = true;
}
f4.Text = "Эксперт 2";
if (f4.ShowDialog() == DialogResult.OK)
{
oc2 = new double[f4.dataGridView1.RowCount, f4.dataGridView1.ColumnCount];
for (int i = 0; i < f4.dataGridView1.RowCount; i++)
for (int k = 0; k < f4.dataGridView1.ColumnCount; k++)
{
oc2[i, k] = Convert.ToDouble(f4.dataGridView1[k, i].Value);
}
f2 = true;
}
if (f1 && f2)
{
if (Soglas() >= 0.5)
{
veskrit();
double pr = 0;
for (int i = 0; i < A1.Length; i++)//расчет итоговых весов альтернатив
{
for (int k = 0; k < ves.Length; k++)
{
pr = pr + ves[k] * Convert.ToDouble(dataGridView2[k + 1, i].Value);
}
A1[i] = pr;
pr = 0;
}
dataGridView2.ColumnCount = dataGridView2.ColumnCount + 1;
dataGridView2.Columns[7].HeaderText = "Оценка";
for (int i = 0; i < A1.Length; i++)
{
dataGridView2[dataGridView2.ColumnCount - 1, i].Value = A1[i].ToString("f4"); ;
}
Sort();
Vizual.viz(dataGridView2, dataGridView1);
label1.Text = "Лучшая альтернатива многомерной оптимизации - " + dataGridView2[0, 0].Value.ToString();
dataGridView2.Visible = true;
dataGridView1.Visible = false;
}
else
{
MessageBox.Show("Оценки экспертов не согласованны");
goto P1;
}
}
else MessageBox.Show("Оценки экспертов не введены");
}
}
}
Класс Vizual
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class Vizual
{
public static void viz(DataGridView dataGridView2)
{
for (int i = 0; i < dataGridView2.RowCount; i++)
for (int k = 0; k < dataGridView2.ColumnCount; k++)
{
if (i == 0)
{
dataGridView2[k, i].Style.BackColor = Color.Red;
}
else if (i == 1 || i == 2)
{
dataGridView2[k, i].Style.BackColor = Color.Gold;
}
else
{
dataGridView2[k, i].Style.BackColor = Color.White;
}
}
}
public static void viz(DataGridView dataGridView2, DataGridView dgv1)
{
for (int i = 0; i < dataGridView2.RowCount; i++)
for (int k = 0; k < dgv1.ColumnCount; k++)
{
dataGridView2[k, i].Value = dgv1[k, i].Value;
if (i == 0)
{
dataGridView2[k, i].Style.BackColor = Color.Red;
}
else if (i == 1 || i == 2)
{
dataGridView2[k, i].Style.BackColor = Color.Gold;
}
else
{
dataGridView2[k, i].Style.BackColor = Color.White;
}
}
}
}
}
Класс Form1
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
int n;
Form2 f2;
Form3 f3;
public object[,] S1, S2;
public double koluz, chasmes, stoim, moshnmes;
public Form1()
{
InitializeComponent();
dataGridView1.RowCount = 5;
dataGridView1.ColumnCount = 7;
dataGridView2.RowCount = 5;
dataGridView2.ColumnCount = 7;
n = 0;
S1 = new object[5, 6];
S2 = new object[5, 6];
//чтение данных из файла
StreamReader strim = new StreamReader("Stanki1.mdb");
while (!strim.EndOfStream)
{
string str = strim.ReadLine();
string[] st = str.Split();
for (int i = 0; i < st.Length; i++)
{
dataGridView1[i, n].Value = st[i];
}
n++;
}
strim.Close();
for(int g=0; g < S1.GetLength(0); g++)
for(int i=0; i < S1.GetLength(1); i++)
S1[g, i] = dataGridView1[i+1,g].Value;
strim = new StreamReader("Stanki2.mdb");
n = 0;
while (!strim.EndOfStream)
{
string str = strim.ReadLine();
string[] st = str.Split();
for (int i = 0; i < st.Length; i++)
dataGridView2[i, n].Value = st[i];
n++;
}
strim.Close();
for (int g = 0; g < S1.GetLength(0); g++)
for (int i = 0; i < S1.GetLength(1); i++)
S2[g, i] = dataGridView2[i+1, g].Value;
koluz = 15000;
chasmes = 150;
stoim = 2000;
moshnmes = 100000;
f2 = new Form2();
f3 = new Form3();
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void одномернаяОптимизацияэToolStripMenuItem_Click(object sender, EventArgs e)
{
f2.dataGridView1.RowCount = dataGridView1.RowCount * dataGridView2.RowCount;
for (int i=0; i < S1.GetLength(0); i++)
for (int j = 0; j < S2.GetLength(0); j++)
{
f2.dataGridView1[0, i * S2.GetLength(0) + j].Value = "ST1" + (i+1).ToString() + " + ST2" + (j+1).ToString();
if (int.Parse(S1[i, 0].ToString()) > int.Parse(S2[j, 0].ToString()))
f2.dataGridView1[1, i * S2.GetLength(0) + j].Value = S2[j, 0];
else
f2.dataGridView1[1, i * S2.GetLength(0) + j].Value = S1[i, 0];
f2.dataGridView1[2, i * S2.GetLength(0) + j].Value = int.Parse(S1[i, 1].ToString()) + int.Parse(S2[j, 1].ToString());
f2.dataGridView1[3, i * S2.GetLength(0) + j].Value = double.Parse(S1[i, 2].ToString()) + double.Parse(S2[j, 2].ToString());
}
f2.koluz = koluz;
f2.chasmes = chasmes;
f2.stoim = stoim;
f2.moshnmes = moshnmes;
f2.dataGridView1.Visible = true;
f2.dataGridView2.Visible = false;
f2.ShowDialog();
}
private void многомерная Оптимизация ToolStripMenuItem_Click(object sender, EventArgs e)
{
f3.dataGridView1.RowCount = dataGridView1.RowCount * dataGridView2.RowCount;
for (int i = 0; i < S1.GetLength(0); i++)
for (int j = 0; j < S2.GetLength(0); j++)
{
f3.dataGridView1[0, i * S2.GetLength(0) + j].Value = "ST1" + (i + 1).ToString() + " + ST2" + (j + 1).ToString();
if (int.Parse(S1[i, 0].ToString()) > int.Parse(S2[j, 0].ToString()))
f3.dataGridView1[1, i * S2.GetLength(0) + j].Value = S2[j, 0];
else
f3.dataGridView1[1, i * S2.GetLength(0) + j].Value = S1[i, 0];
f3.dataGridView1[2, i * S2.GetLength(0) + j].Value = int.Parse(S1[i, 1].ToString()) + int.Parse(S2[j, 1].ToString());
f3.dataGridView1[3, i * S2.GetLength(0) + j].Value = double.Parse(S1[i, 2].ToString()) + double.Parse(S2[j, 2].ToString());
f3.dataGridView1[4, i * S2.GetLength(0) + j].Value = (Perevod(S1[i, 3].ToString()) + Perevod(S2[j, 3].ToString())) / 2;
if (int.Parse(S1[i, 4].ToString()) > int.Parse(S2[j, 4].ToString()))
f3.dataGridView1[5, i * S2.GetLength(0) + j].Value = S2[j, 4];
else
f3.dataGridView1[5, i * S2.GetLength(0) + j].Value = S1[i, 4];
f3.dataGridView1[6, i * S2.GetLength(0) + j].Value = (Perevod(S1[i, 5].ToString()) + Perevod(S2[j, 5].ToString())) / 2;
}
f3.dataGridView1.Visible = true;
f3.dataGridView2.Visible = false;
f3.ShowDialog();
}
public double Perevod(string str) //метод перевода аналитических оценок
{
if (str.CompareTo("Да") == 0) return 0.67;
if (str.CompareTo("Нет") == 0) return 0.33;
if (str.CompareTo("Плохо") == 0) return 0.25;
if (str.CompareTo("Отлично") == 0) return 0.9;
if (str.CompareTo("Хорошо") == 0) return 0.63;
if (str.CompareTo("Очень_хорошо") == 0) return 0.8;
else return -1;
}
}
}
Размещено на Allbest.ru
Подобные документы
Общая характеристика и структурная схема приложения, требования к нему и функциональные особенности, сферы практического применения. Обоснование выбора языка программирования. Описание интерфейса и инструкция пользователя. Проведение листинга программы.
дипломная работа [1,0 M], добавлен 10.07.2017Характеристика объекта автоматизации. Создание многоуровневой архитектуры приложения, отладка метода безошибочной идентификации пользователей системы. Разработка нестандартного метода преобразования объектов базы данных в объекты классов приложения.
курсовая работа [395,4 K], добавлен 28.04.2015Программная реализация приложения для вычисления заданных функций. Процедура поиска минимума функции. Применение методов Хука-Дживса и градиентного спуска для решения задачи. Исследование функции в окрестности базисной точки, определение ее координат.
контрольная работа [767,1 K], добавлен 02.02.2014Рассмотрение методов прямоугольников и трапеций как способов вычисления определенных интегралов. Характеристика графика зависимости погрешности от числа разбиений N. Создание приложения по вычислению интеграла с помощью методов приближенного вычисления.
курсовая работа [1,6 M], добавлен 20.06.2012Обоснование выбора метода реализации функции выбора наиболее выгодного потребительского кредита. Реализация разрабатываемого web-приложения, тестирование функции рекомендации наиболее выгодного потребительского кредита на основе предпочтений пользователя.
дипломная работа [1,1 M], добавлен 22.10.2016Создание многоуровневого приложения с Web-интерфейсом выставления оценки фильму и просмотра оценок других пользователей. Клиентская часть приложения. Разработка многопользовательского веб-приложения на ASP.NET MVC 3 с разграничением доступа к данным.
курсовая работа [949,7 K], добавлен 22.02.2015Преобразование формулы и решение ее с помощью Метода Эйлера. Моделирование метода оптимизации с функцией Розенброка. Поиск модели зашумленного сигнала. Нахождение минимума заданной целевой функции методом покоординатного спуска нулевого порядка.
курсовая работа [1,2 M], добавлен 21.12.2013Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.
курсовая работа [987,1 K], добавлен 27.06.2019Создание программы в среде программирования MatLab для решения задачи одномерной оптимизации (нахождение минимума и максимума заданных функций) методом золотого сечения, построение блок-схемы алгоритма и графическое изображение исследованных функций.
реферат [112,0 K], добавлен 14.06.2010Постановка задачи и ее формализация. Поиск значений интерполяционного многочлена в точках x1 и x2. Поиск минимума функции F(x) на отрезке [a;b]. Проверка условий сходимости методов. Тестирование программных модулей. Детализированная схема алгоритма.
курсовая работа [893,0 K], добавлен 04.02.2011