Автор: Пользователь скрыл имя, 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
// шукаємо максимальне значення другої функції, t
s[1]:=mm(0,0,0);
s[2]:=mm(0,0,a);
s[3]:=mm(0,a,0);
s[4]:=mm(a,0,0);
s[5]:=mm(0,a,a);
s[6]:=mm(a,0,a);
s[7]:=mm(a,a,0);
s[8]:=mm(a,a,a);
max_t:=s[1];
for i:=2 to 8 do
if s[i]>max_t then
max_t:=s[i]; // max_t - максимальне значення другої функції,mm
f2_max_gr:= max_t;
// f2_max_gr - максимальне значення другої функції,mm
// виводимо максимальне значення другої функції в файл
writeln(g, 'Максимальне значення другої функції =' + FloatToStrF (max_t, ffNumber,6,3));
// і на екран
Form4.Label5.Caption:=Form4.
// виводимо на екран максимальне значення другої функції, mm
// в компонент Memo1
Form1.Memo1.Lines.Add('
Form1.Memo1.Lines.Add('(x1-2)^
Form1.Memo1.Lines.Add('y max = '+FloatToStr(max_t));
// далі особа, що приймає рішення задає бажані значення аргументів
// на екран буде видаватися значення критеріїв
// процес продовжується до тих пір,
// доки користувача не задовільнить відповідь
repeat
// Clear - очищення компонентів
Form4.Edit1.Clear;
Form4.Edit2.Clear;
Form4.ShowModal;
// ShowModal - відображення форми Form4 в модальному режимі,
// це означає, що доки користувач не закриє форму Form4
// головна форма буде неактивною
// зчитаємо бажані
значення аргументів для
ksi_f:=StrToFloat(Form4.Edit1.
// компонент Edit - однорядкове текстове поле,
// Text - текст в компоненті
// StrToFloat - перетворює рядок символів в дійсне число
// зчитаємо бажані
значення аргументів для
ksi_t:=StrToFloat(Form4.Edit2.
// виводимо в файл бажаній значення критеріїв
writeln(g,'');
writeln(g,'Бажане значення першого критерію = '+FloatToStr(ksi_f));
writeln(g,'Бажане значення другого критерію = '+FloatToStr(ksi_t));
// перетворення
бажаних значень цільових
// до нормованого безрозмірного вигляду
w_f:=w(ksi_f,max_f,y_f); // для першої цільової функції, zz
w_t:=w(ksi_t,max_t ,y_t); // для другої цільової функції, mm
// обчислення вагових коефіцієнтів критеріїв
Ro_f:=w_t/(w_t+w_f); // для першої цільової функції, zz
Ro_t:=w_f/(w_t+w_f); // для другої цільової функції, mm
// знаходимо max min Ro*w(x1,x2,x3)
// за допомогою методу Монте-Карло
MethodMonteKarlo (max_f, max_t, y_f, y_t, zz, mm, Ro_f, Ro_t, x1_max, x2_max, x3_max);
// в результаті знайшли точку
// x1_max,x2_max,x3_max <- ефективну альтернативу
//виведення значень цільових функцій в цій точці
Form1.Label15.Caption:='y1 = '+FloatToStr (zz (x1_max, x2_max, x3_max)); // FloatToStr - перетворює дійсне число в рядок символів
Form1.Label16.Caption:='y2 = '+FloatToStr (mm (x1_max, x2_max, x3_max));
Form1.Label17.Caption:='x1 = '+FloatToStr(x1_max);
Form1.Label18.Caption:='x2 = '+FloatToStr(x2_max);
Form1.Label19.Caption:='x3 = '+FloatToStr(x3_max);
//виведення значень цільових функцій в цій точці в файл
writeln(g,'Оптимальний розв`язок:');
writeln(g,'Перший критерій = ' + FloatToStr(zz (x1_max, x2_max, x3_max)));
writeln(g, 'Другий критерій = '+ FloatToStr (mm (x1_max, x2_max, x3_max)));
writeln(g,'x1 = '+FloatToStr(x1_max));
writeln(g,'x2 = '+FloatToStr(x2_max));
writeln(g,'x3 = '+FloatToStr(x3_max));
// Робимо видимими компоненти
Form1.Label14.Visible:=true;
Form1.Label15.Visible:=true;
Form1.Label16.Visible:=true;
// MessageDlg - функцій, яка виводить повідомленння
// з заданою піктограмаою і набором кнопок
// перший аргумент - текст повідомлення
// другий - mtConfirmation - задає піктограму "підтвердження"
// третій - [mbYes ,mbNo] - задає, що будуть відображатися
// дві кнопки з написами Yes і No
// четвертий аргумент
- номер розділу довідкової
// в нашому випадку довідка не виводиться тому задаємо нуль
// функція повертає число, яке вказує, яку кнопку натиснув користува
// якщо він натиснув кнопку Yes, то функція повертає значення 3
// отже, цикл repeat..until виконується до тих пір,
// доки не натиснуть кнопку Yes
until (MessageDlg('Отримані значення критеріїв задовільняють?', mtConfirmation, [mbYes ,mbNo],0)=3);
closefile(g); // закриття файлу
// вивід відповіді на екран
Form1.Label1.caption:='y1 = '+FloatToStr(ksi_f);
Form1.Label2.caption:='y2 = '+FloatToStr(ksi_t);
// робимо вивидими необзідні компоненти
Form1.Label1.Visible:=true;
Form1.Label2.Visible:=true;
Form1.Label13.Visible:=true;
Form1.Label1.Visible:=true;
Form1.Label2.Visible:=true;
Form1.Label17.Visible:=true;
Form1.Label18.Visible:=true;
Form1.Label19.Visible:=true;
// робимо активною кнопку "Заново"
Form1.Button2.Enabled:=true;
ShowMessage('Кінець!');// ShowMessage - виведення повідомлення
Form1.Button2.Setfocus; // встановлюємо фокус на кнопку Button2
end;
end.
Програмний код модуля Unit3.pas
unit Unit3;
// в цьому модулі оголошуємо новий тип даних - "функцію"
// а також розміщуємо
всі функції, які будемо
interface
// типи даних, сторені програмістом оголошуються в розділі type
type
// оголошуємо новий тип даних func
// для того, щоб функції можна було передавати
// в якості аргументів підпрограм
func=function(x1,x2,x3:real):
function f(x1,x2,x3:real):real;far;
// підпрограми, що є
параметрами процедур слід
// з використанням дальної моделі пам`яті
// дальню модель встановлюють за допомогою ключового слова far
// похідна функції f
// по змінній х1
function df_dx1 (x1,x2,x3:real):real;far;
// похідна функції f
// по змінній х2
function df_dx2 (x1,x2,x3:real):real; far;
// похідна функції f
// по змінній х3
function df_dx3 (x1,x2,x3:real):real; far;
function t(x1,x2,x3:real):real; far;
// похідна функції t
// по змінній х1
function dt_dx1 (x1,x2,x3:real):real;far;
// похідна функції t
// по змінній х2
function dt_dx2 (x1,x2,x3:real):real; far;
// похідна функції t
// по змінній х3
function dt_dx3 (x1,x2,x3:real):real; far;
implementation
function f(x1,x2,x3:real):real;
begin
result:=sqr(x1-1)+sqr(x2-3)+
// result - це вказівка, яке значення функція повертає
// sqr(х) повертає х*х
end;
// похідна функції f
// по змінній х1
function df_dx1 (x1,x2,x3:real):real;
begin
result:=2*(x1-1);
end;
// похідна функції f
// по змінній х2
function df_dx2 (x1,x2,x3:real):real;
begin
result:=2*(x2-3);
end;
// похідна функції f
// по змінній х3
function df_dx3 (x1,x2,x3:real):real;
begin
result:=2*(x3-2);
end;
function t(x1,x2,x3:real):real;
begin
result:=sqr(x1-2)+sqr(x2-4)+
end;
// похідна функції t
// по змінній х1
function dt_dx1 (x1,x2,x3:real):real;
begin
result:=2*(x1-2);
end;
// похідна функції t
// по змінній х2
function dt_dx2 (x1,x2,x3:real):real;
begin
result:=2*(x2-4);
end;
// похідна функції t
// по змінній х3
function dt_dx3 (x1,x2,x3:real):real;
begin
result:=2*x3;
end;
end.
Програмний код модуля Unit4.pas
unit Unit4; // даний модуль відповідає формі Form4
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Label6: TLabel;
Edit2: TEdit;
Label9: TLabel;
Button1: TButton;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
// процедура, яка дозволяє
// відображати лише символи цифр, знак мінус,
// десяткову кому або десяткову крапку
// (в залежності від налаштувань Windows)
// і дозволяє натискати клавішу "Backspace"
procedure IfKeyPress (var Key: Char);
var
Form4: TForm4;
implementation
{$R *.dfm}
uses Unit2;
// подія, яка виникає при натисненні на кнопку "Ок"
procedure TForm4.Button1Click(Sender: TObject);
begin
// компонент Edit - текстове поле, однорядкове
// властивість Text задає, який рядок символів буде виведено в компоненті
If (Edit1.Text='') or (Edit2.Text='') then
// якщо користувач пропустив поле при заповнення
begin
// то вивесті йому повідомлення про це
// ShowMessage – функція для виведення повідомлення на екран
ShowMessage('Заповніть всі поля');
exit;
end;
// StrToFloat перетворення рядка символів в дійсне число
// f1_min_gr - мінімально можливе значення першої цільової функції
// f1_max_gr - максимальне можливе значення першої цільової функції
// якщо бажані значення критері. вийшли за межі
// можливих значень критеріїв
if (StrToFloat(Edit1.Text) < f1_min_gr) or (StrToFloat(Edit1.Text) > f1_max_gr) then
begin
ShowMessage('Вийшли за допустимі значення першого критерію'); // то вивести повідмолення про це
exit; // вихід з процедури
end;
// f2_min_gr - мінімально можливе значення другої цільової функції
// f2_max_gr - максимальтне можливе значення другої цільової функції
// якщо бажані значення критерію вийшли
// за межі можливих значень критеріїв
if (StrToFloat(Edit2.Text) < f2_min_gr) or (StrToFloat(Edit2.Text) > f2_max_gr) then
begin
ShowMessage('Вийшли за допустимі значення другого критерію');
// то вивести повідмолення про це
exit; // вихід з процедури
end;
// якщо все нормально і всі поля заповненні, то закриваємо вікно
Form4.Close; // Close - закриття форми
end;
// процедура, яка дозволяє
// відображати лише символи цифр, знак мінус,
// десяткову кому або десяткову крапку
// (в залежності від налаштувань Windows)
// і дозволяє натискати клавішу "Backspace"
procedure IfKeyPress (var Key: Char);
// Key - символ, який був введенний
begin
case key of
'0'..'9',#8,'-':; // якщо сивмол допустимий, то все нормально
// #8 означає, що була натиснута клавіша Backspace
else
if not (key=DecimalSeparator) then
// DecimalSeparator - стандартна константа,
// яка зберігає значення десяткової коми, або десяткової крапки
Key:=Chr(0); // символ не відображати
//Chr - функція, яка відобрадає сивмол за його ASCII-кодом,
end;
end;
// подія, яка виникає при натиснені клавіші в полі Edit1
procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char);
// Key - символ, який був введенний в поле
// (яка клавіша була натиснута)
begin
IfKeyPress (Key);
// виклик процедури, яка перевіряє чи санкціонований символ
// було введенно в поле Edit1
end;
// подія, яка виникає при натиснені клавіші в полі Edit2
procedure TForm4.Edit2KeyPress(Sender: TObject; var Key: Char);
// Key - символ, який був введенний в поле
// (яка клавіша була натиснута)
begin
IfKeyPress (Key);
// виклик процедури, яка перевіряє чи санкціонований символ було
// введенно Edit2
end;
end.