Автор: Пользователь скрыл имя, 23 Марта 2012 в 08:23, дипломная работа
Мета роботи полягає у вивченні теоретичних основ щодо прийняття рішень в умовах визначеності, задач багатокритеріальної оптимізації та програмної реалізації методу багатокритеріальної оптимізації, а саме методу бажаної точки.
Виходячи з поставленої мети, в роботі розв’язано низку наступних завдань:
- розгляд прикладів багатокритеріальності;
- ознайомлення із задачами багатокритеріального програмування;
- вивчення основних понять та принципів теорії прийняття рішень в умовах визначеності;
- з’ясування основних методів багатокритеріальної оптимізації;
- розробка програмної реалізації методу бажаної точки.
ВСТУП………………………………………………………...……………………...3
РОЗДІЛ 1. ІНФОРМАЦІЙНИЙ ОГЛЯД…………………………………………...5
1.1. Огляд задач багатокритеріального програмування,
приклади багатокритеріальності………...………………………..……5
1.2. Поняття про багатокритеріальну оптимізацію……………...…………8
РОЗДІЛ 2. ТЕОРЕТИЧНА ЧАСТИНА………………………………..………….11
2.1. Основні поняття та визначення теорії прийняття рішень
в умовах визначеності…………………………..…………………….11
2.2. Загальні відомості про задачі багатокритеріальної оптимізації..….12
2.3. Постановка задачі багатокритеріальної оптимізації……..…………18
2.4. Методи багатокритеріальної оптимізації………..…………………..29
2.5. Метод бажаної точки при прийнятті рішень в умовах
визначеності…………………………………………………………...32
РОЗДІЛ 3. ПРАКТИЧНА РЕАЛІЗАЦІЯ…………………………………. ………36
3.1. Блок-схема алгоритму …………………….………………………...36
3.2. Опис програмної реалізації методу бажаної точки………………....38
ВИСНОВКИ………………………………………………………………………...45
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ ………………………………………..46
ДОДАТОК А………………….…………………………………………………….48
Програма видає результат на екран і в файл.
На екран виводиться:
– мінімальне значення , критеріїв, і точки, в яких ці значення досягаються;
– максимальні значення , критеріїв ;
– бажані значення критеріїв , , які задовольнили особу, що приймає рішення;
– оптимальний розв’язок.
В файл виводиться:
– умова задачі;
– мінімальне значення , критеріїв, і точки, в яких ці значення досягаються, а також всі проміжні обчислення при знаходження мінімальних значень критеріїв градієнтним методом (спочатку для першого критерію; потім для другого);
– всі бажані значення критеріїв , , які особа, що приймає рішення, вводила в програмі, і оптимальний розв’язок при цих , .
Файл буде створюватися в тій же папці, що і програма, і буде мати назву «result.txt». Якщо перед запуском програми файл з такою назвою і розширенням в цій папці існував, то після запуску програму він буде перезаписаний.
Опис модулів програми
Програма складається з 4 модулів Unit1, Unit2, Unit3, Unit4 та двох форм Form1, Form4.
Form1 – це головне діалогове вікно, Form4 – діалогове вікно, в якому вводять бажані значення критеріїв.
Unit1 – відповідає формі Form1. В ньому реалізована такі підпрограми:
1) процедура Button1Click (Sender: TObject)
– виникає при натисненні на
кнопку «Метод бажаної точки».
Знаходить розв’язок
2) процедура Button2Click (Sender: TObject) – виникає при натисненні на кнопку «Заново». Очищує компоненти форми Form1 і приховує компоненти, що відображаються відповідь
3) процедура Button3Click (Sender: TObject)
- відбувається при натисненні
на кнопку «Мінімізація
4) процедура FormCreate (Sender: TObject)
– виникає при створенні форми
5) процедура FormActivate (Sender: TObject) – виникає тоді, коли форма Form1 стає активною і в цьому випадку передає фокус компоненту Edit1. Тобто цей компонент стає активним і в ньому розміщується курсор.
6) процедури Edit1KeyPress (Sender:
TObject; var Key: Char), …, Edit6KeyPress (Sender: TObject; var Key:
Char). Вони викликають процедуру
IfKeyPress з модуля Unit4. За допомогою
даних процедур перевіряється,
що користувач ввів в
Unit2 – містить підпрограми:
1) процедуру GradientMethod (z, dz_dx1, dz_dx2, dz_dx3: func; Memo1: TMemo; x1_Edit, x2_Edit, x3_Edit: TEdit; var y_opt: real) для знаходження мінімального значення критерію градієнтним методом.
2) функцію w (ksi, max, min:real):real для перетворення бажаних значень цільових функцій до нормованого безрозмірного вигляду
3) процедуру MethodMonteKarlo (max_f,
max_t, y_f, y_t: real; f, t: func; Ro_f, Ro_t: real; var x1_max,x2_max,x3_max:real)
– для знаходження
В модулі Unit3 оголошується новий тип даних func, а також розміщуються функції, для знаходження значень критеріїв в деякій точці та для знаходження значень похідних критеріїв в деякій точці.
Отже в модулі Unit3 реалізовані функції:
1) f (x1,x2,x3:real):real –критерій ;
2) df_dx1 (x1,x2,x3:real):real, df_dx2 (x1,x2,x3:real):real, df_dx3 (x1,x2,x3:real):real – похідні ;
3) t(x1,x2,x3:real):real – критерій ;
4) dt_dx1 (x1, x2, x3: real) :real, dt_dx2 (x1, x2, x3: real), dt_dx3 (x1, x2, x3: real) :real– похідні .
Модуль Unit4 відповідає формі Form4.
В модулі Unit4 розташовуються:
1) процедура IfKeyPress (var Key: Char)
– написана для того, щоб перевіряти
чи в текстові полі Edit вводять
санкціоновані логікою
2) процедури Edit1KeyPress (Sender:
TObject; var Key: Char); Edit2KeyPress (Sender: TObject; var Key: Char).
Вони викликають процедуру
3) процедура Button1Click (Sender: TObject). Виникає при натисненні на кнопку «Ок» на формі Form4. Перевіряє, щоб бажанні значення критеріїв були введені, і щоб не виходили за допустимі межі для критеріїв.
Більш детальна інформація щодо програмної реалізації (код програми) знаходить у додатку А.
Висновки
На основі проведеної роботи
було розглянуто теоретичні основи щодо
багатокритеріальної
Дана програма має досить простий інтерфейс та алгоритмічну структуру.
Створена програмна реалізація
максимально полегшує застосування
методу бажаної точки в задачах
багатокритеріальної
Впровадження розробленої програми дозволить полегшити та підвищити ефективність розв’язування задач багатокритеріальної оптимізації при прийнятті рішень в умовах визначеності.
Список використаних джерел
Д.Б. Юдин. – М. : Наука, 1989. – 320 с.
ДОДАТОК А
Програмний код модуля Unit1.pas
unit Unit1; // даний модуль відповідає формі Form1
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Panel1: TPanel;
Edit4: TEdit;
Edit5: TEdit;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit6: TEdit;
Edit1: TEdit;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit3: TEdit;
Button3: TButton;
Memo1: TMemo;
Label13: TLabel;
Button1: TButton;
Button2: TButton;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// підключення модулів Unit2, Unit3, Unit4
uses Unit2,Unit3,Unit4;
var
r_opt:real; // r_opt - мінімальне значення першої функції
z_opt:real; // z_opt - мінімальне значення другої функції
// коли натиснули кнопку
// "Мінімізація критеріїв градієнтним методом"
procedure TForm1.Button3Click(Sender: TObject);
var
g:textfile; //текстовий файл
begin
// вказуємо, що працюємо з файлом result_g.txt
// файл повинен розміщуватися в тій же папці, що і програма
assignfile(g,'result.txt');
rewrite(g); // rewrite - відкриваємо файл,
// якщо файл з таким іменем існував,
// то стара інформація
// вивід в файл
writeln(g,'Перша цільова функція:');
writeln(g,'(x1-1)^2+(x2-3)^2+(
writeln(g,'Друга цільова функція:');
writeln(g,'(x1-2)^2+(x2-4)^2+
closefile(g); // закриття файлу
Memo1.Clear; // Clear - очищає компонент Memo
// якщо користувач пропустив і не ввів число
// Text - рядок символів, що містить в компоненті
If (Edit1.Text='') or (Edit2.Text='') or (Edit3.Text='')
or (Edit4.Text='') or (Edit5.Text='') or (Edit6.Text='') then
begin
// то вивесті йому повідомлення про це
ShowMessage('Заповніть всі поля');
// ShowMessage – функція для виведення повідомлення на екран
exit; // exit - вихід з процедури
end;
Form1.Tag:=0; // властивість Tag створена для програміста
// Tag призначено для зберігання цілих чисел
// якщо Tag = 0, то шукаємо мінімум першої функції
// якщо Tag = 1, то шукаємо мінімум другої функції
// будемо використувати ці числа
// при використання градієнтного методому
// компонент Memo - це багаторядковий текстовий редактор
// призначений для виведення інформації текстової
// Memo1.Lines - звертання до рядків в компоненті Memo1
// Memo1.Lines.Add - додати новий рядок в компонент Memo1
// виводимо текст в Memo1
Memo1.Lines.Add('Мінімальне значення функції:');
Memo1.Lines.Add('(x1-1)^2+(x2-
// виклик процедури GradientMethod
// для обчислення мінімального значення функції
// градієнтним методом
// f - функція, мінімальне значення якої шукаємо
// df_dx1 - функція, похідная функції f по змінній х1
// df_dx2 - функція, похідная функції f по змінній х2
// df_dx3 - функція, похідная функції f по змінній х3
// Memo1 - в цей компонент будемо виводити інформацію
// Edit1,Edit2,Edit3 - компоненти, з яких будемо зчитувати
// значення точки
// r_opt - мінімальне значення функції f
// (це значення поверне процедура GradientMethod)
GradientMethod(f,df_dx1,df_
Form1.Tag:=1;
// виводимо інформацію в компонент Memo1
Memo1.Lines.Add('Мінімальне значення функції:');
Memo1.Lines.Add('(x1-2)^2+(x2-
// виклик процедури GradientMethod для
// обчислення мінімального
значення другої функції
// t - функція, мінімальне значення якої шукаємо
// dt_dx1 - функція, похідная функції t по змінній х1
// dt_dx2 - функція, похідная функції t по змінній х2
// dt_dx3 - функція, похідная функції t по змінній х3
// Memo1 - передаємо в який компонент будемо виводити інформацію
// Edit4,Edit5,Edit6 - компоненти, з яких будемо зчитувати значення точки
// z_opt - мінімальне значення функції t (це значення поверне процедура GradientMethod)
GradientMethod(t,dt_dx1,dt_
// Enabled задає, компонент є активним чі ні
Button1.Enabled:=true;
// кнопка "Метод бажаної точки" стає активною
Button3.Enabled:=false;
// кнопка "Мінімізація
критеріїв градієнтним методом"
end;
// подія FormCreate виникає при створенні форми Form1
procedure TForm1.FormCreate(Sender: TObject);
begin
// для того, щоб запустити датчик випадкових чисел
//слід викликати один раз процедуру Randomize
Randomize;
end;
// подія FormCreate виникає, коли форма Form1 стає актвиною
procedure TForm1.FormActivate(Sender: TObject);
begin
Edit1.SetFocus; //SetFocus - встановити фокус в компнент, тобто він в ньому розміщується курсор
end;
// натиснення на кнопку "Метод бажаної точки"
procedure TForm1.Button1Click(Sender: TObject);
begin
// виклик процедури MethodBaganTochki
// реалізація методу бажаної точки
MethodBaganTochki(r_opt,z_opt,
// Enabled задає, компонент є активним чі ні
Button1.Enabled:=false; // кнопка "Метод бажаної точки" стає активною
end;
// подія, яка виникає при натиснені клавіші в полі Edit1
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// подія, яка виникає при натиснені клавіші в полі Edit2
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// подія, яка виникає при натиснені клавіші в полі Edit3
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// подія, яка виникає при натиснені клавіші в полі Edit4
procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// подія, яка виникає при натиснені клавіші в полі Edit5
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// подія, яка виникає при натиснені клавіші в полі Edit6
procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char);
//Key - символ який ввели в компонент
begin
IfKeyPress (Key);// виклик процедури, яка перевіряє, чи санкціоновані символи були введенні
end;
// процедура виникає при натисненні на кнопку "Заново"
procedure TForm1.Button2Click(Sender: TObject);
begin
// очищення всіх компонентів
// Clear - знищує текст в компоненті
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
Memo1.Clear;
// Enabled задає, компонент є активним чі ні
Button3.Enabled:=true; // кнопка
"Мінімізація критеріїв
Button1.Enabled:=false; // кнопка "Метод бажаної точки" стає не активною
Button2.Enabled:=false; // кнопка "Заново" стає неактивною
// Visible задає, компонент є видими чі ні
// родимо невидими компоненти, які виводять відповідь
Label1.Visible:=false;
Label2.Visible:=false;
Label13.Visible:=false;
Form1.Label14.Visible:=false;