Разработка приложения для выбора покупки пары станков

Понятия оптимизации проектных решений. Нахождение максимума (минимума) линейной целевой функции. Схема алгоритма метода Саати для вычисления весов критериев. Создание приложения, позволяющего производить однокритериальную и многокритериальную оптимизацию.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.