Сужение множества Парето на основе информации об относительной важности критериев
Реализация алгоритма сужения множества Парето на основе информации об относительной важности критериев на языке высокого уровня. Теорема о сужении множества Парето. Оценка выгодности инвестирования с ее помощью. Текст программы и результат ее выполнения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 31.03.2023 |
Размер файла | 525,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство науки и высшего образования Российской Федерации Рязанский государственный радиотехнический университет им. В.Ф. Уткина
Кафедра Автоматизированных Систем Управления
Лабораторная работа
Сужение множества Парето на основе информации об относительной важности критериев
Выполнил: ст. гр. 235М Гульняшкин Г.В.
Рязань 2023
Сужение множества Парето на основе информации об относительной важности критериев
Цель работы: реализовать алгоритм сужения множества Парето на основе информации об относительной важности критериев на языке высокого уровня.
Краткие теоретические сведения
Сужение множества Парето на основе информации об относительной важности критериев
Теорема о сужении множества Парето
В соответствии с принципом Эджворта-Парето наилучшие решения следует выбирать среди парето-оптимальных. Если же в задаче принятия решений имеется дополнительная информация о том, что один из критериев важнее другого, то можно рассчитывать на то, что такого рода информация позволит облегчить последующий выбор в пределах множества Парето.
Иначе говоря, дополнительная информация об относительной важности критериев может быть использована для того, чтобы «забраковать» некоторые парето-оптимальные решения и, тем самым, сузить множество Парето и упростить последующий выбор.
Теорема 1. Предположим, что выполняются аксиомы 1 - 4 и i-й критерий важнее j-го с положительными параметрами , . Тогда для любого непустого множества выбираемых решений и выбираемых векторов имеют место включения
, (1)
, (2)
где - множество парето-оптимальных решений в многокритериальной задаче с множеством возможных решений и «новым» векторным критерием , компоненты которого вычисляются по формулам
,
, , , (3)
а .
Замечание 2. Множество Парето инвариантно относительно строго возрастающего преобразования критериев. В частности, множество Парето не изменится, если произвольный критерий умножить (или разделить) на какое угодно положительное число. В соответствии с этим разделим критерий на положительное число и оставим для него прежнее обозначение. Тогда первое из равенств (3) примет вид
, (4)
где - коэффициент относительной важности, определяемой равенством.
Замечание 3. Следует обратить внимание на универсальность теоремы 1, проявляющуюся в том, что в ней отсутствуют какие бы то ни было требования к множеству возможных решений X и векторному критерию f. Это говорит о том, что она применима к любой задаче многокритериального выбора, в которой выполнены аксиомы 1 - 4. При этом множество возможных решений (и векторов) может состоять как из конечного, так и бесконечного числа элементов, а функции могут быть какими угодно - нелинейными, невыпуклыми, невогнутыми, а также не обладать свойством дифференцируемости или непрерывности. Ограничения в условиях теоремы 1 накладываются лишь на поведение ЛПР - оно должно вести себя «разумно» в процессе выбора, т.е. удовлетворять аксиомам 1 - 4.
Формула (3) (и (4)) для вычисления «нового» критерия на основе «старого» f проста. В соответствии с ней «новый» векторный критерий получается из «старого» заменой менее важного критерия на линейную комбинацию критериев и с положительными коэффициентами , . Все остальные «старые» критерии сохраняются. При подобном «пересчете» j_го критерия многие полезные с точки зрения теории экстремальных задач свойства критериев и сохраняются. Например, если указанные критерии являются непрерывными, дифференцируемыми, вогнутыми или линейными, то новый критерий так же будет обладать соответствующими свойствами.
В определенных случаях (в особенности, когда коэффициент относительной важности близок к нулю, а значит, критерии и почти равны друг другу) указанного выше сужения множества Парето может и не произойти из-за совпадения множеств Парето относительно «старого» и «нового» векторных критериев, т.е. . В таких случаях имеющаяся информация об относительной важности критериев не является содержательной.
Рисунок 1 иллюстрирует включения (1).
Пример (задача выбора объекта для инвестирования). Применим теорему 1 для решения следующей задачи. Пусть имеется три объекта для инвестирования средств. Для оценки выгодности инвестирования используются два критерия: величина прироста прибыли от вложения, измеряемая в процентах по отношению к исходной сумме инвестирования, и надежность вложенных средств, измеряемая в пятибалльной шкале от 1 до 5.
Рисунок 1 - Геометрическая иллюстрация включений (1)
сужение множество парето информация
Будем считать, что прирост надежности при переходе от отметки в 1 балл к отметке в 2 балла точно такой, как и при переходе от отметки () к отметке . Это предположение дает возможность принять, что величина надежности измеряется в количественной шкале (шкале разностей).
Пусть множество возможных векторов состоит из трех векторов
, , .
Видно, что все три вектора являются парето-оптимальными, т.е. принцип Эджворта-Парето не позволяет сузить область поиска выбираемых векторов.
Предположим, что от ЛПР поступила дополнительная информация о том, что первый критерий (прирост прибыли) важнее второго (надежности).
Положим . Тогда пересчитанные согласно формуле (5.5) векторы будут иметь вид:
, , .
Система неравенств:
,
имеет решение . Следовательно, если ЛПР за прирост прибыли в размере 10 % готово пожертвовать уменьшением величины надежности на одну единицу, то этому ЛПР следует выбирать первый вектор , так как в данном случае и . Иными словами, если коэффициент относительной важности больше либо равен
,
то выбранным должен быть единственный первый вектор.
Если , то выполняется неравенство . При этом векторы , оказываются несравнимыми по отношению ? . Значит, в этом случае следует исключить из числа выбираемых векторов.
При выбранным может оказаться любой из трех имеющихся векторов, так как в этом случае и три вектора , , составляют множество Парето . Это означает, что информация о том, что ЛПР за потерю в одну единицу надежности соглашается на прирост прибыли лишь на величину, большую 20 %, является в данном случае несущественной. Она не позволяет произвести сужение исходного множества Парето, совпадающего с . Иначе говоря, коэффициент относительной важности первого критерия по сравнению со вторым, равный или меньший
,
свидетельствует о степени относительной важности, не дающей возможности в данном случае удалить из числа выбираемых ни один из возможных векторов.
Задание. Реализовать сужение множества Парето из 1-й задачи на основе теоремы о сужении множества Парето (формулы 5.5 и 5.6) на ЯВУ (язык выбрать самим).
Листинг 1 - Текст программы, реализующей сужение множества Парето (количество элементов = 7, количество критериев из 1 практической работы = 9)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WidowsFormsApp1
{
public partial class Form1 :Form
{
Random rand = new Random();
int[,] myArr = new int[7, 9];
int[] w_arr = new int[9];
double[] val_err = new double[7];
double value = 0.0;
int max_krit = 0;
int count_krit = 0;
int count_prog = 0;
public Form1()
{
InitializeComponent();
GenArray();
dataGridViewPareto.RowCount = 7;
dataGridViewPareto1.RowCount = 7;
for (int i = 0; i < 7; i++)
{
dataGridViewPareto.Rows[i].Cells[0].Value = "Вариант №" + Convert.ToString(i + 1);
dataGridViewPareto1.Rows[i].Cells[0].Value = "Вариант №" + Convert.ToString(i + 1);
}
ShowArray();
ShowArray1();
}
public void ShowArray()
{
for (int i = 0; i < 7;i++)
{
for (int j = 0; j < 9; j++)
{
dataGridViewPareto.Rows[i].Cells[j + 1].Value = myArr[i, j];
}
}
}
public void ShowArray1() // Отображение массива в таблице
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
dataGridViewPareto1.Rows[i].Cells[j + 1].Value = myArr[i, j];
}
}
}
public void GenArray() // Генерация массива случайных значений
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
myArr[i, j] = rand.Next(1, 6);
}
}
}
public void ReadArray() // Чтение массива с таблицы при изменении значений массива
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
myArr[i, j] = Convert.ToInt32(dataGridViewPareto.Rows[i].Cells[j + 1].Value);
}
}
}
public void ReadArray1() // Чтение массива с таблицы при изменении значений массива
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
myArr[i, j] = Convert.ToInt32(dataGridViewPareto.Rows[i].Cells[j + 1].Value);
}
}
}
public bool CompareArray(int[] arr1, int[] arr2) // Сравнение одномерных массивов
{
int count = 0;
for (int n = 0; n < arr1.Length; n++)
{
if (arr1[n] >= arr2[n])
count += 1;
}
if (count == arr1.Length)
return true;
else return false;
}
public void FillArray(int[] arr3, int size, int arr_row) // Заполнение одномерного массива для сравнения
{
for (int i = 0; i < size; i++)
{
arr3[i] = myArr[arr_row, i];
}
}
public void ZeroArray(int size_row, int arr_row) // Заполнение одномерного массива 0 (удаление массива)
{
for (int i = 0; i < size_row; i++)
{
myArr[arr_row, i] = 0;
}
}
public void BestResult() // Вывод лучших результатов
{
label_Result.Text = "";
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
if (myArr[i, j] != 0)
{
if (i == 7)
label_Result.Text += "Вариант №" + Convert.ToString(i + 1);
else label_Result.Text += "Вариант №" + Convert.ToString(i + 1) + " , ";
j = 10;
}
}
}
}
private void dataGridViewPareto_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void buttonArray_Click(object sender, EventArgs e)
{
GenArray();
ShowArray();
ShowArray1();
}
private void Button1_Click_1(object sender, EventArgs e)
{
ShowArray1();
}
private void Button_Pareto_Click(object sender, EventArgs e)
{
// Шаг 1
int i = 0;
int j = 1;
int N = 6;
Boolean flag = true;
ReadArray1();
do
{
int[] a = new int[9];
int[] b = new int[9];
FillArray(a, 9, i);
FillArray(b, 9, j);
if (CompareArray(a, b)) //Шаг 2
{
ZeroArray(9, j); //Шаг 3
if (j < N) // Шаг 4
{
j = j + 1;
}
else
{
if (i < (N - 1)) // Шаг 7
{
i = i + 1;
j = i + 1;
}
else flag = false; // Конец вычислений
}
}
else
{
int[] c = new int[9];
int[] d = new int[9];
FillArray(c, 9, j);
FillArray(d, 9, i);
if (CompareArray(c, d)) // Шаг 5
{
ZeroArray(9, i); // Шаг 6
if (i < (N - 1)) // Шаг 7
{
i = i + 1;
j = i + 1;
}
else flag = false; // Конец вычислений
}
else
{
if (j < N) // Шаг 4
{
j = j + 1;
}
else
{
if (i < (N - 1)) // Шаг 7
{
i = i + 1;
j = i + 1;
}
else flag = false; // Конец вычислений
}
}
}
}
while (flag);
ShowArray();
BestResult();
}
private void Button_Suzhenie_Click(object sender, EventArgs e)
{
ReadArray();
int wk = Convert.ToInt32(textBox_krit.Text);
wk--;
double w_j = 1;
double w_i;
double q = Convert.ToDouble(textBox_otv.Text);
w_i = Math.Round((w_j - (q * w_j)) / (q), 4);
if (textBox_krit.Text == "1")
{
max_krit = 1;
}
else if (textBox_krit.Text == "2")
{
max_krit = 2;
}
else if (textBox_krit.Text == "3")
{
max_krit = 3;
}
else if (textBox_krit.Text == "4")
{
max_krit = 4;
}
else if (textBox_krit.Text == "5")
{
max_krit = 5;
}
else if (textBox_krit.Text == "6")
{
max_krit = 6;
}
else if (textBox_krit.Text == "7")
{
max_krit = 7;
}
else if (textBox_krit.Text == "8")
{
max_krit = 8;
}
else if (textBox_krit.Text == "9")
{
max_krit = 9;
}
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
if (myArr[i, j] == 0)
{
count_krit += 1;
}
}
if (count_krit != 9)
{
if (max_krit == 1)
for (int j = 1; j < 9; j++)
{
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 2)
for (int j = 0; j < 9; j++)
{
if (j == 1)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 3)
for (int j = 0; j < 9; j++)
{
if (j == 2)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 4)
for (int j = 0; j < 9; j++)
{
if (j == 3)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 5)
for (int j = 0; j < 9; j++)
{
if (j == 4)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 6)
for (int j = 0; j < 9; j++)
{
if (j == 5)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 7)
for (int j = 0; j < 9; j++)
{
if (j == 6)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 8)
for (int j = 0; j < 9; j++)
{
if (j == 7)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
else if (max_krit == 9)
for (int j = 0; j < 9; j++)
{
if (j == 8)
continue;
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * w_j + w_i * myArr[i, j]);
}
}
count_krit = 0;
}
label_wi.Text = Convert.ToString(w_i);
label_wj.Text = Convert.ToString(w_j);
label_Result.Text = "Нажмите ввод.";
ShowArray1();
}
private void Button_Prog_Click(object sender, EventArgs e)
{
ReadArray();
int wk = Convert.ToInt32(textBox_krit.Text);
wk--;
double q = Convert.ToDouble(textBox_otv.Text);
if (textBox_krit.Text == "1")
{
max_krit = 1;
}
else if (textBox_krit.Text == "2")
{
max_krit = 2;
}
else if (textBox_krit.Text == "3")
{
max_krit = 3;
}
else if (textBox_krit.Text == "4")
{
max_krit = 4;
}
else if (textBox_krit.Text == "5")
{
max_krit = 5;
}
else if (textBox_krit.Text == "6")
{
max_krit = 6;
}
else if (textBox_krit.Text == "7")
{
max_krit = 7;
}
else if (textBox_krit.Text == "8")
{
max_krit = 8;
}
else if (textBox_krit.Text == "9")
{
max_krit = 9;
}
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 9; j++)
{
if (myArr[i, j] == 0)
{
count_krit += 1;
}
}
if (count_krit != 9)
{
if (max_krit == 1)
for (int j = 1; j < 9; j++)
{
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 2)
for (int j = 0; j < 9; j++)
{
if (j == 1)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 3)
for (int j = 0; j < 9; j++)
{
if (j == 2)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 4)
for (int j = 0; j < 9; j++)
{
if (j == 3)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 5)
for (int j = 0; j < 9; j++)
{
if (j == 4)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 6)
for (int j = 0; j < 9; j++)
{
if (j == 5)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 7)
for (int j = 0; j < 9; j++)
{
if (j == 6)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 8)
for (int j = 0; j < 9; j++)
{
if (j == 7)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
else if (max_krit == 9)
for (int j = 0; j < 9; j++)
{
if (j == 8)
myArr[i, j] = Convert.ToInt32(myArr[i, wk] * q + (1 - q) * myArr[i, j]);
}
}
}
label_wi.Text = "wi";
label_wj.Text = "wj";
label_Result.Text = "Нажмите ввод.";
ShowArray1();
}
}
}
Рис. 2 Результат выполнения программы
Размещено на Allbest.ru
...Подобные документы
Теория множества, основные операции над множествами, мощность множества. Теорема о сравнении множеств. Размер множества в Turbo Pascal, предельно допустимое количество элементов и их порядок. Выполнение действий объединения, исключения и пересечения.
курсовая работа [376,6 K], добавлен 31.01.2016Программная реализация метода оптимальной классификации одномерного упорядоченного множества на основе "склеивания с ближайшим". Проверка работоспособности программы на основе алгоритмов классификации, вычислительные эксперименты по оценке эффективности.
курсовая работа [414,4 K], добавлен 24.05.2015Оптимизационная задача линейного программирования. Виды задач линейного программирования. Принятие решений на основе количественной информации об относительной важности критериев. Выбор средств разработки. Программный комплекс векторной оптимизации.
дипломная работа [1,3 M], добавлен 27.03.2013Понятие нечеткого множества и функции принадлежности. Методы дефаззификации (преобразования нечеткого множества в четкое число) для многоэкстремальных функций принадлежности. Нечеткий логический вывод. Примеры выпуклого и невыпуклого нечеткого множества.
презентация [111,7 K], добавлен 16.10.2013Основные этапы определения радиуса и центра окружности, проходящей через три различные точки заданного множества точек. Особенности построения алгоритма на языке программирования. Составление тестовых примеров для демонстрации возможностей программы.
контрольная работа [103,9 K], добавлен 21.08.2013Общая методика решения задачи определения связанного множества пикселей с помощью функции bwlabel, в языке моделирования Matlab. Возможности оптимизации программы по временным характеристикам для возможности использования функции в анализе видеопотока.
статья [894,5 K], добавлен 11.03.2009Методы поиска подмножеств множества вершин V графа G, удовлетворяющих определенным условиям и свойствам. Понятие независимых множеств и порядок их генерации. Определение доминирующего множества. Основные этапы решения задачи о наименьшем разбиении.
контрольная работа [32,1 K], добавлен 11.03.2010График функции плотности распределения Парето. Алгоритм обработки выборки. Построение гистограммы относительных частот. Программа для автоматизации обработки, в которую заложены алгоритмы обработки выборки и возможность быстрого получения результата.
курсовая работа [1,3 M], добавлен 19.03.2012Постановка задачи. Математическое обоснование. Последовательность разбиений множества. Язык программирования. Реализация алгоритмов. Генерирование разбиений множества. Генерирование всех понятий.
курсовая работа [29,9 K], добавлен 20.06.2003Принципы решения задач линейного программирования в среде электронных таблиц Excel, в среде пакета Mathcad. Порядок решения задачи о назначении в среде электронных таблиц Excel. Анализ экономических данных с помощью диаграмм Парето, оценка результатов.
лабораторная работа [2,0 M], добавлен 26.10.2013Программный комплекс по обработке заданного множества данных в динамической памяти компьютера. Запросы к массиву записей множества данных – групп в детском саду. Функция сортировки массива по числовому полю. Использование главной программы MAINPRO.
курсовая работа [419,3 K], добавлен 23.07.2014Получение изображения объекта с помощью оптико-электронных систем, построенных на основе ПЗС-приемника. Методы обработки первичной измерительной информации. Реализация алгоритма обработки графической информации с помощью языка программирования Python.
лабораторная работа [1,1 M], добавлен 30.05.2023Символьное и образное представление информации. Единицы ее измерения. Язык как способ символьного представления информации. Знак как элемент конечного множества. Алфавитный подход к измерению информации. Решение задач на определение ее количества.
презентация [178,2 K], добавлен 12.12.2012Решение задач по информатике, перебор различных комбинаторных конфигураций объектов и выбор наилучшего, с точки зрения условия задачи. Генерация k-элементных подмножеств, всех подмножеств данного множества, всех перестановок n-элементного множества.
реферат [44,0 K], добавлен 03.01.2010Особенности вывода на экран содержимого файла BAZA.txt. Анализ функций вывода информации о количестве каждой марки машин. Рассмотрение способов проектирования тестов программы методами черного ящика. Проблемы программирования на языке высокого уровня.
контрольная работа [1,6 M], добавлен 04.01.2015Разработка программы для отбора образцов меха в коллекцию – элитную группу из исходного множества согласно заданному эталону и определенным критериям (вид меха, высота мехового покрытия, блеск) и для прогнозирования дальнейшего развития этой группы.
курсовая работа [1,8 M], добавлен 13.11.2012Выбор алгоритма решения задачи. Разработка программы, обеспечивающую эффективную обработку и хранение информации с использованием линейных списков. Написание программы на псевдокоде и на языке программирования высокого уровня. Результаты работы программы.
курсовая работа [2,1 M], добавлен 21.04.2012Разработка программы, создающей и управляющей базой данных, ее реализация на языке Turbo Pascal. Организация алгоритма программы. Вывод информации и возможность добавления информации в базу данных. Поиск информации в базе данных по заданному значению.
курсовая работа [26,7 K], добавлен 19.06.2010Сущность и методика исследования вероятностной структуры сигналов, законы распределения случайных величин. Проверка гипотезы по критерию Колмогорова-Смирнова и Пирсона. Разработка программы вычисления признаков и формирования обучающего множества данных.
курсовая работа [509,6 K], добавлен 03.12.2009Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.
контрольная работа [150,4 K], добавлен 03.05.2014