Метод бажаної точки при прийнятті рішень в умовах визначеності та його програмна реалізація

Автор: Пользователь скрыл имя, 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

Работа содержит 1 файл

Жездріс.docx

— 437.85 Кб (Скачать)

  // шукаємо максимальне  значення другої функції, 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.Label5.Caption+ ' до '+FloatToStrF (max_t, ffNumber,3,0);

  // виводимо на екран  максимальне значення другої  функції, mm

   // в компонент Memo1

  Form1.Memo1.Lines.Add('Максимальне значення функції');

  Form1.Memo1.Lines.Add('(x1-2)^2+(x2-4)^2+x3^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.Text);

   // компонент Edit - однорядкове текстове поле, 

   // Text - текст в компоненті

   // StrToFloat - перетворює рядок символів в дійсне число

   // зчитаємо бажані  значення аргументів для другої  функції

    ksi_t:=StrToFloat(Form4.Edit2.Text);

    // виводимо в файл  бажаній значення критеріїв

    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):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)+sqr(x3-2);

// 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)+sqr(x3);

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.


Информация о работе Метод бажаної точки при прийнятті рішень в умовах визначеності та його програмна реалізація