Багатокритеріальна задача лінійного програмування - Программирование, компьютеры и кибернетика курсовая работа

Багатокритеріальна задача лінійного програмування - Программирование, компьютеры и кибернетика курсовая работа




































Главная

Программирование, компьютеры и кибернетика
Багатокритеріальна задача лінійного програмування

Розв’язок багатокритеріальної задачі лінійного програмування з отриманням компромісного рішення (для задач з кількома функціями мети) за допомогою теоретико-ігрового підходу. Матриця мір неоптимальності та рядок функції мети. Модуль опису класу.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.


Розв'язати багатокритеріальну задачу лінійного програмування з отриманням компромісного розв'язку за допомогою теоретико-ігрового підходу.
У цій роботі реалізовано вирішування таких задач лінійного програмування: розв'язування задач багатокритеріальної оптимізації, тобто пошук компромісного рішення для задач з кількома функціями мети.
Задано об'єкт управління, що має n входів і k виходів. Вхідні параметри складають вектор X = {x j }, . Кожен з вхідних параметрів може мати обмеження, що накладене на область його значень. В програмі підтримуються параметри без обмежень на значення, і з обмеженнями невід'ємності (з областю ). Також на комбінації вхідних значень можуть бути накладені обмеження як система лінійних рівнянь або нерівностей:
Вихідні сигнали об'єкта є лінійними комбінаціями вхідних сигналів. Для досягнення ефективності роботи об'єкта управління частину вихідних сигналів треба максимізувати, інші - мінімізувати, змінюючи вхідні сигнали і дотримуючись обмежень на ці сигнали (задоволення усіх нерівностей, рівнянь і обмежень області значень кожного з вхідних параметрів). Тобто вихідні сигнали є функціями мети від вхідних:
Як правило, для багатокритеріальної задачі не існує розв'язку, який би був найкращим (оптимальним) для усіх функцій мети одночасно. Проте можна підібрати такий розв'язок, який є компромісним для усіх функцій мети (в точці цього розв'язку кожна з функцій мети якнайменше відхиляється від свого оптимального значення в заданій системі умов (обмежень).
Тут реалізовано пошук компромісного розв'язку за допомогою теоретико-ігрового підходу, що був розроблений під керівництвом доцента ХАІ Яловкіна Б.Д. Цей підхід дозволяє знайти компромісний розв'язок з мінімальним сумарним відхиленням всіх виходів (значень функцій мети) від їхніх екстремальних значень за даної системи обмежень.
Йде пошук компромісного вектора значень змінних в такому вигляді:
тут - вектор, що оптимальний для i -го критерію (функції мети); i - вагові коефіцієнти.
Для отримання цього вектора виконуються такі кроки розв'язування:
1) Розв'язується k однокритеріальних задач ЛП за допомогою симплекс-методу (для кожної з функцій мети окремо, з тією самою системою обмежень, що задана для багатокритеріальної задачі). Так отримуємо k оптимальних векторів значень змінних (для кожної з цільових функцій - свій).
2) Підраховуються міри неоптимальності для всіх можливих підстановок кожного вектора значень змінних у кожну з функцій мети, за такою формулою:
де C j   - вектор коефіцієнтів j -ої функції мети;
X * i  - вектор, що оптимальний для i - ої функції мети;
X * j  - вектор, що оптимальний для j - ої функції мети;
Всі ці міри неоптимальності складають квадратну матрицю, рядки якої відповідають k оптимальним векторам X * i для кожної функції мети, а стовпці - k функціям мети C j . Ця матриця розглядається як платіжна матриця матричної гри двох партнерів X * і Z , що визначена множиною стратегій X*={X* 1 , … , X * k } першого гравця, і Z={C 1 X, … , C k X} другого. Всі міри неоптимальності є недодатними, і є коефіцієнтами програшу першого гравця. На головній діагоналі вони рівні нулю (бо є мірами неоптимальності оптимального вектора для своєї ж функції).
3) Матриця мір неоптимальності заміняється еквівалентною їй матрицею додаванням до кожної міри неоптимальності , тобто найбільшого з абсолютних значень всіх мір. Якщо таке найбільше значення рівне нулю, то всі міри рівні нулю, і в такому випадку замість нього до усіх мір додається число 1. В результаті отримуємо матрицю з невід'ємними елементами. На головній діагоналі усі вони рівні максимальному значенню. Така заміна матриці не змінює рішення гри, змінює тільки її ціна. Тобто тепер гра має вигляд не гри програшів, а гри з пошуком максимального виграшу. Для пошуку оптимальної стратегії для першого гравця гра подається як пара взаємнодвоїстих однокритеріальних задач ЛП. Для першого гравця потрібні значення змінних двоїстої задачі :
Функція мети: Z2 = -10,3333333333333.
Пошук оптимального розв'язку для функції Z3
Задача для симплекс-методу максимізації
Незалежних змінних і 0-рядків немає.
Функція мети: Z3 = 3,33333333333333.
Матриця мір неоптимальності та рядок функції мети, стовпець вільних членів і заголовки задачі ЛП, що будуть використані далі
До мір додана найбільша за модулем міра . Матриця у формі задачі ЛП
Результат для двоїстої задачі (відносно розв'язаної):
Функція мети: Z = 0,577181208053691.
Вагові коефіцієнти (Li[Func]=ui/W(U)):
Модуль опису класу, що виконує роботу з задачами ЛП:
Uses SysUtils, Types, Classes, Forms, Controls, StdCtrls, Dialogs, Graphics,
lwc_DependentColor:TColor=$02804000;
lwc_IndependentColor:TColor=$02FF8000;
lwc_RightSideColColor:TColor=$02FFD7AE;
lwc_DestFuncToMaxNameColor:TColor=$024049FF;
lwc_DestFuncToMinNameColor:TColor=$02FF4940;
lwc_DestFuncValColor:TColor=$02A346FF;
lwc_ValInHeadColOrRowColor:TColor=$025A5A5A;
lwc_SolveColColor:TColor=$02AAFFFF;
lwc_SolveRowColor:TColor=$02AAFFFF;
lwc_SolveCellColor:TColor=$0200FFFF;
{ Кількість стовпців перед стовпцями змінних та після них,
які можна редагувати, для редагування таблиці задачі
лінійного програмування (максимізації чи мінімізації функції):}
bc_LTaskColsBeforeVars=1; bc_LTaskColsAfterVars=1;
bc_LTaskRowsBeforeVars=bc_LTaskColsBeforeVars;
bc_Negative=-1; bc_Zero=0; bc_Positive=1;
sc_DependentVar='Залежна змінна (>=0)';
sc_IndependentVar='Незалежна змінна (будь-яке дійсне число)';
sc_FreeMembers='Вільні члени (праві сторони рівнянь)';
sc_InequalFuncName='Назва функції умови-нерівності';
sc_DestFuncCoefs='Рядок коефіцієнтів функції мети';
sc_DestFuncName='Назва функції мети';
sc_DestFuncToMaxName=sc_DestFuncName+', що максимізується';
sc_DestFuncToMinName=sc_DestFuncName+', що мінімізується';
sc_DestFuncVal='Значення функції мети';
sc_ValInHeadColOrRow='Число у заголовку таблиці';
sc_SolveCol='Розв''язувальний стовпець';
sc_SolveRow='Розв''язувальний рядок';
sc_SolveCell='Розв''язувальна комірка';
TWorkFloat=Extended; {тип дійсних чисел, що використовуються}
{Ідентифікатор для типу елемента масиву чисел та імен змінних.
Типи змінних: залежні, незалежні, функції (умови-нерівності).
Залежні змінні - це змінні, для яких діє умова невід'ємності:}
THeadLineElmType=(bc_IndependentVar, bc_DependentVar, bc_FuncVal, bc_Number,
bc_DestFuncToMax, bc_DestFuncToMin, bc_OtherType);
THeadLineElmTypes=set of THeadLineElmType;
TVarNameStr=String[7]; {короткий рядок для імені змінної}
TValOrName=record {Елемент-число або назва змінної:}
1: (AsNumber:TWorkFloat); {для запису числа}
2: (AsVarName:TVarNameStr; {для запису назви змінної}
{ Для запису номера змінної по порядку в умові задачі (в рядку
{ Відмітка про те, що змінна була у рядку-заголовку ( True ), або
TValOrNameMas=array of TValOrName; {тип масиву для заголовків матриці}
TFloatArr=array of TWorkFloat; {тип масиву дійсних чисел}
TFloatMatrix=array of TFloatArr; {тип матриці чисел}
TByteArr=array of Byte; {масив байтів - для поміток для змінних}
{Стани об'єкта форматування таблиці у GrowingStringGrid:}
TTableFormatState=(fs_EnteringEqs, fs_EnteringLTask, fs_SolvingEqsM1,
{ Тип переходу до двоїстої задачі: від задачі максимізації до
задачі мінімізації, або навпаки. Ці два переходи виконуються за
різними правилами (різні правила зміни знаків «< = » та «> = »
при переході від нерівностей до залежних змінних, і від залежних змінних
до нерівностей). І двоїсті задачі для максимізації і мінімізації
TDualTaskType=(dt_MaxToMin, dt_MinToMax);
{ Процедури для форматування екранної таблиці GrowingStringGrid під час
роботи з нею у потрібному форматі, а також для вирішування
задач ЛП і відображення проміжних чи кінцевих результатів у
TGridFormattingProcs=class(TObject)
CurHeadRow, CurHeadCol:TValOrNameMas; {заголовки таблиці}
{ Масиви для зберігання умови (використовуються для
CopyHeadRow, CopyHeadCol:TValOrNameMas; {заголовки таблиці}
InSolving, SolWasFound, WasNoRoots, WasManyRoots,
EqM1TaskPrepared, EqM2TaskPrepared, LTaskPrepared: Boolean;
{ Прапорець про те, що вміст CurGrid ще не був прочитаний
даним об'єктом з часу останнього редагування його користуваем:}
{В режимах розв'язування (CurFormatState=fs_SolvingEqsM1,
-   координати розв'язувальної комірки у GrowingStringGrid
в режимах редагування (CurFormatState=fs_EnteringEqs, fs_EnteringLTask)
-   координати комірки, для якої викликано контекстне меню
(відносно верхньої лівої комірки таблиці коефіцієнтів (що має
CurGridSolveCol, CurGridSolveRow: Integer;
{Номери стовпця і рядка-заголовків у CurGrid :}
{Режим форматування і редагування чи розв'язування задачі:}
{Екранна таблиця для редагування чи відображення результатів:}
CurOutConsole:TMemo; {поле для відображення повідомлень}
{ Адреси обробників подій екранної таблиці CurGrid , які цей
{ Процедура встановлює довжину рядка-заголовка CurHeadRow відповідно
до ширини екранної таблиці CurGrid і заповнює нові елементи
значеннями за змовчуванням. Використовується при зміні розмірів
екранної таблиці. Після її виклику можна вказувати типи змінних
у рядку-заголовку (користувач вибирає залежні та незалежні):}
Procedure UpdateLTaskHeadRowToStrGrid (SGrid:TStringGrid);
{ Процедура для підтримки масиву стовпця-заголовка під час
редагування таблиці. Встановлює довжину масиву відповідно до висоти
екранної таблиці і координат вписування в неї таблиці задачі,
заповнює нові комірки значеннями за змовчуванням:}
Procedure UpdateLTaskHeadColToStrGrid (SGrid:TStringGrid;
{Функції для переходів з одного режиму до іншого:}
Procedure SetNewState (Value:TTableFormatState);
Function PrepareToSolveEqsWithM1: Boolean;
Function PrepareToSolveEqsWithM2: Boolean;
Function PrepareToSolveLTask: Boolean;
Procedure SetNewGrid (Value:TGrowingStringGrid); {п ерехід до нового CurGrid}
Procedure SetNewMemo (Value:TMemo); {перехід до нового CurOutConsole}
{ Процедури форматування GrowingStringGrid для набору таблиці
procedure EditLineEqsOnNewRow (Sender: TObject; NewRows: array of Integer);
procedure EditLineEqsOnNewCol (Sender: TObject; NewCols: array of Integer);
procedure EditLineEqsOnDrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
{ Процедура форматування GrowingStringGrid відображення таблиці
у процесі розв'язання системи рівнянь способом 1 і 2:}
procedure SolveLineEqsM1OrM2OnDrawCell (Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
{ Процедури форматування GrowingStringGrid для набору таблиці
задачі максимізації чи мінімізації лінійної форми (функції з
умовами-нерівностями чи рівняннями):}
procedure EdLineTaskOnNewRow (Sender: TObject; NewRows: array of Integer);
procedure EdLineTaskOnNewCol (Sender: TObject; NewCols: array of Integer);
procedure EdLineTaskOnDrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure EdLineTaskOnDblClick (Sender: TObject);
{ Процедура реагує на відпускання правої кнопки миші на
комірках рядка-заголовка та стовпця-заголовка таблиці.
Формує та відкриває контекстне меню для вибору типу комірки із можливих
procedure EdLineTaskOnMouseUp (Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
{ Процедура перевіряє наявність об'єкта TPopupMenu. Якщо його немає
(SGrid . Po pupMenu=Nil), то створює новий.
Видаляє усі пунтки (елементи, теми) з меню:}
Procedure InitGridPopupMenu (SGrid:TStringGrid);
{ Додає пункт меню для вибору типу комірки в таблиці з заданим
написом SCaption і кругом того кольору, що асоційований з даним
типом SAssocType . Для нового пункту меню настроює виклик
процедури обробки комірки для задавання їй обраного типу SAssocType .
Значення SAssocType записує у поле Tag об'єкта пункту меню:}
Procedure AddCellTypeItemToMenu (SMenu:TPopupMenu;
SCaption: String; IsCurrentItem: Boolean; SAssocType:THeadLineElmType;
{ Обробник вибору пункту в меню типів для комірки
Procedure ProcOnCellTypeSelInMenu (Sender: TObject);
{ Процедури для нумерації рядків і стовпців при відображенні
таблиць у ході вирішення задачі, або з результатами. Лише
проставляють номери у першому стовпцю і першому рядку:}
procedure NumerationOnNewRow (Sender: TObject; NewRows: array of Integer);
procedure NumerationOnNewCol (Sender: TObject; NewCols: array of Integer);
{ Процедура для реагування на редагування вмісту комірок
під час редагування вхідних даних. Встановлює прапорець
CurGridModified := True про те, що екранна таблиця має зміни:}
procedure ReactOnSetEditText (Sender: TObject; ACol, ARow: Longint;
{ Зчитує комірку з екранної таблиці в рядок-заголовок.
SCol - номер комірки у рядку-заголовку.
Для екранної таблиці використовуються координати комірки відповідно до
координат рядка-заголовка та стовпця заголовка (верхнього лівого кута
таблиці з заголовками): HeadColNumInGrid і HeadRowNumInGrid :}
Procedure ReadHeadRowCell (SCol: Integer);
{ Зчитує комірку з екранної таблиці в стовпець-заголовок.
SRow - номер комірки у стовпці-заголовку.
Для екранної таблиці використовуються координати комірки відповідно до
координат рядка-заголовка та стовпця заголовка (верхнього лівого кута
таблиці з заголовками): HeadColNumInGrid і HeadRowNumInGrid :}
Procedure ReadHeadColCell (SRow: Integer);
{Процедура для зчитування таблиці та її заголовків із CurGrid :}
Function ReadTableFromGrid: Boolean;
{Процедура для відображення таблиці та її заголовків у CurGrid :}
Function WriteTableToGrid (SHeadColNum, SHeadRowNum: Integer;
ToTuneColWidth: Boolean=True):Boolean;
{ Визначення розмірів таблиці задачі, і корегування довжини
заголовків таблиці та зовнішнього масиву таблиці (масиву масивів):}
Procedure GetTaskSizes (Var DWidth, DHeight: Integer);
{Жорданове виключення за заданим розв'язувальним елементом матриці:}
Function GI (RozElmCol, RozElmRow: Integer;
Var SDHeadRow, SDHeadCol:TValOrNameMas; Var SDMatrix:TFloatMatrix;
Var DColDeleted: Boolean; ToDoMGI: Boolean=False;
ToDelColIfZeroInHRow: Boolean=True):Boolean;
{ Відображення таблиці, обробка віконних подій доки користувач не
скомандує наступний крок (якщо користувач не скомандував вирішувати
Procedure WaitForNewStep (HeadColNum, HeadRowNum: Integer);
{ Пошук ненульової розв'язувальної комірки для вирішування системи
рівнянь (починаючи з комірки [ CurRowNum , CurColNum ]):}
Function SearchNozeroSolveCell (CurRowNum,
CurColNum, MaxRow, MaxCol: Integer;
ToSearchInRightColsToo: Boolean=True):Boolean;
{ Зміна знаків у рядку таблиці і відповідній комірці у
Procedure ChangeSignsInRow (CurRowNum: Integer);
{ Зміна знаків у стовпці таблиці і відповідній комірці у
Procedure ChangeSignsInCol (CurColNum: Integer);
{ Функція переміщує рядки таблиці CurTable (разом із відповідними
комірками у стовпці-заголовку CurHeadCol ) з заданими типами комірок
Повертає номер найвищого рядка із тих, що не було задано
переміщувати вгору (вище нього - ті, що переміщені вгору):}
Function ShiftRowsUp (SHeadColElmTypes:THeadLineElmTypes;
ToChangeInitPosNums: Boolean=False):Integer;
{ Аналогічна до ShiftRowsUp , але переміщує вниз.
Повертає номер найвищого рядка із тих, що переміщені вниз (вище
нього - рядки тих типів, що не було задано переміщувати донизу):}
SHeadColElmTypes:THeadLineElmTypes;
ToChangeInitPosNums: Boolean=False):Integer;
{Вирішування системи лінійних рівнянь способом 1:}
{Вирішування системи лінійних рівнянь способом 2:}
{ Вирішування задачі максимізації лінійної форми (що містить
умови-нерівності, рівняння та умови на невід'ємність окремих
змінних і одну функцію мети, для якої треба знайти максимальне
Function SolveLTaskToMax (DualTaskVals: Boolean):Boolean;
Function PrepareDFuncForSimplexMaximize: Boolean;
Function PrepareDestFuncInMultiDFuncLTask (SFuncRowNum,
MinDestFuncRowNum: Integer):Boolean;
{ Процедура зчитує значення функції мети у таблиці розв'язаної
однокритеріальної задачі, і значення усіх змінних або функцій
в цьому розв'язку. Відображає значення цих змінних,
функцій-нерівностей, і функції мети в Self . Cu rOutConsole:}
Procedure ShowLTaskResultCalc (DualTaskVals: Boolean);
{ Процедура зчитує значення функції мети у таблиці розв'язаної
однокритеріальної задачі, і значення усіх змінних або функцій в
Procedure ReadCurFuncSolution (Var SDValVecs:TFloatMatrix;
Var SDDestFuncVals:TFloatArr; SVecRow: Integer;
ToReadFuncVals: Boolean; DualTaskVals: Boolean);
Procedure BuildPaymentTaskOfOptim (
Const SOptimXVecs:TFloatMatrix; Const SOptimFuncVals:TFloatArr;
Procedure CalcComprVec (Const SVarVecs:TFloatMatrix;
Const SWeightCoefs:TFloatArr; Var DComprVec:TFloatArr);
Function CalcDFuncVal (Const SVarVec:TFloatArr;
SDestFuncRowNum: Integer):TWorkFloat;
{ Вирішування задачі багатокритеріальної оптимізації лінійної
форми з використанням теоретико-ігрового підходу.
Умовою задачі є умови-нерівності, рівняння та умови на
невід'ємність окремих змінних, і декілька функцій мети, для
яких треба знайти якомога більші чи менші значення.
Функція повертає ознаку успішності вирішування:}
Function SolveMultiCritLTask: Boolean;
{ Процедури для зміни позиціювання таблиці з заголовками у
екранній таблиці CurGrid . Працюють лише у режимі fs _ FreeEdit :}
Procedure SetHeadColNum (Value: Integer);
Procedure SetHeadRowNum (Value: Integer);
{ Прапорці для керування кроками вирішування:
Continue - продовжити на один крок;
GoToEnd - при продовженні йти всі кроки до кінця вирішування без
відображення таблиці на кожному кроці;
Для керування прапорці можуть встановлюватися іншими потоками
програми, або і тим самим потоком (коли процедури даного класу
викликають Application . Pr ocessMessages):}
{ Властивість для керуання станом форматування:}
Property TableFormatState:TTableFormatState read CurFormatState
write SetNewState default fs_NoFormatting;
{ Прапорець про те, що зараз задача у ході вирішування
Property Solving: Boolean read InSolving;
Property SolutionFound: Boolean read SolWasFound;
Property NoRoots: Boolean read WasNoRoots;
Property ManyRoots: Boolean read WasManyRoots;
{ Властивість для задавання екранної таблиці:}
Property StringGrid:TGrowingStringGrid read CurGrid write SetNewGrid
{ Поле для відображення повідомлень:}
Property MemoForOutput:TMemo read CurOutConsole write SetNewMemo
{ Номери стовпця і рядка-заголовків у CurGrid . Змінювати можна
тільки у режимі fs _ FreeEdit . В інших режимах зміна ігнорується:}
Property HeadColNumInGrid: Integer read CHeadColNum write SetHeadColNum;
Property HeadRowNumInGrid: Integer read CHeadRowNum write SetHeadRowNum;
{Таблиця і її заголовки у пам'яті:}
Property Table:TFloatMatrix read CurTable;
Property HeadRow:TValOrNameMas read CurHeadRow;
Property HeadCol:TValOrNameMas read CurHeadCol;
{ Читання і запис таблиці та режиму редагування у файл
Function ReadFromFile (Const SPath: String):Boolean;
Function SaveToFile (Const SPath: String):Boolean;
{ Процедури для читання і зміни таблиці і її заголовків.
Не рекомендується застосовувати під час вирішування
Procedure SetTable (Const SHeadRow, SHeadCol:TValOrNameMas;
Procedure GetTable (Var DHeadRow, DHeadCol:TValOrNameMas;
{ Вибір кольору для фону комірки за типом елемента
Function GetColorByElmType (CurType:THeadLineElmType):TColor;
{ Вибір назви комірки за типом елемента
Function GetNameByElmType (CurType:THeadLineElmType):String;
{ Зчитування умови задачі із CurGrid та відображення прочитаного
на тому ж місці, де воно було. Працює у режимах
fs_EnteringEqs і fs_EnteringLTask.}
Function GetTask (ToPrepareGrid: Boolean=True):Boolean;
{Приймає останні зміни при редагуванні і відображає таблицю:}
Procedure ResetModified; {скидає прапорець зміненого стану}
Procedure UndoChanges; {відкидає останні зміни (ResetModified+Refresh)}
{ Перехід від зчитаної умови задачі максимізації чи мінімізації
лінійної форми до двоїстої задачі. Працює у режимі редагування
задачі максимізації-мінімізації ( fs _ EnteringLTask ):}
{Розміри прочитаної таблиці задачі:}
{ Запускач вирішування. Працює у режимах fs_SolvingEqsM1,
Function Solve (ToGoToEnd: Boolean=False):Boolean;
Function ValSign (Const Value:TWorkFloat):TSignVal; overload;
Function ValSign (Const Value:TValOrName):TSignVal; overload;
Function GetValOrNameAsStr (Const Value:TValOrName):String;
Procedure ChangeSignForValOrVarName (Var SDValOrName:TValOrName);
Procedure DeleteFromArr (Var SArr:TValOrNameMas; Index, Count: Integer);
Procedure DeleteFromArr (Var SArr:TFloatArr; Index, Count: Integer); overload;
Procedure DelColsFromMatr (Var SDMatrix:TFloatMatrix; ColIndex, Count: Integer);
Procedure DelRowsFromMatr (Var SDMatrix:TFloatMatrix; RowIndex, Count: Integer);
Procedure ChangeRowsPlaces (Var SDMatr:TFloatMatrix; Row1, Row2: Integer);
Procedure ChangeRowsPlaces (Var SDMatr:TFloatMatrix;
Var SDHeadCol:TValOrNameMas; Row1, Row2: Integer;
ToChangeInitPosNums: Boolean=False); overload;
Procedure ChangeColsPlaces (Var SDMatr:TFloatMatrix; Col1, Col2: Integer);
Procedure ChangeColsPlaces (Var SDMatr:TFloatMatrix;
Var SDHeadRow:TValOrNameMas; Col1, Col2: Integer;
ToChangeInitPosNums: Boolean=False); overload;
{Транспонування двовимірної матриці:}
Procedure Transpose (Var SDMatrix:TFloatMatrix);
'Немає розв''язуючого елемента з такими координатами';
sc_ZeroResolvingElm='Розв''язуючий елемент рівний нулю';
sc_NoGrowingStringGrid='GrowingStringGrid не заданий' + sc_TriSpot;
sc_UnknownVarType='Невідомий тип змінної';
sc_TableIsNotReady=': таблиця не готова' + sc_TriSpot;
sc_WrongEditMode=': не той режим редагування'+
' задачі. Не можу перейти до розв''язування' + sc_TriSpot;
sc_EmptyTable=': таблиця пуста' + sc_TriSpot;
': у поточному режимі умова задачі не зчитується';
': не можу записати умову задачі з поточного режиму'+sc_TriSpot;
sc_CantCloseFile=': не можу закрити файл:'+sc_DoubleQuot;
sc_StartSolving=': починаю розв''язування' + sc_TriSpot;
sc_ZeroKoef=': нульовий коефіцієнт';
sc_SearchingOther=' шукаю інший' + sc_TriSpot;
sc_AllKoefIsZeroForVar=': усі коефіцієнти є нулі для змінної';
sc_AllKoefIsZero=': усі коефіцієнти для потрібних змінних є нулі'+sc_TriSpot;
sc_FreeVar=': вільна змінна (у її стовпці лише нулі, не впливає на результат)';
sc_UnlimitedFunc='Функція мети не обмежена.';
sc_SolutionFound='Корені знайдено.';
sc_SolvingStopped=': розв''язування припинено' + sc_TriSpot;
sc_ExcludingFreeVars=': виключаю незалежні змінні' + sc_TriSpot;
sc_CantExcludeFreeVars=': не можу виключити усі незалежні змінні.'+
sc_AllFreeVarsExcluded=': усі незалежні змінні виключені.';
': Увага! У таблиці більше немає комірок для наступної обробки'+sc_TriSpot;
sc_ExcludingZeroRows=': виключаю 0-рядки' + sc_TriSpot;
sc_AllZeroInRow=': усі елементи - нулі у рядку';
sc_NoMNN=': не можу знайти МНВ для стовпця';
sc_AllZeroRowsExcluded=': усі 0-рядки виключені.';
sc_SearchingBaseSolve=': шукаю опорний розв''язок' + sc_TriSpot;
sc_BaseSolveFound=': опорний розв''язок знайдено.';
sc_SearchingOptimSolve=': шукаю оптимальний розв''язок' + sc_TriSpot;
sc_NoSolveMode=': поточний режим не є режимом для розв''язування'+sc_TriSpot;
sc_ValNotAvail='значення не доступно' + sc_TriSpot;
sc_ForDualTask='для двоїстої задачі (відносно розв''язаної):';
sc_ForDirectTask='для прямої задачі:';
sc_InHeadCol='У стовпці-заголовку:';
sc_CanMakeOnlyInELTaskMode='до двоїстої задачі можна переходити лише у '+
'режимі fs_EnteringLTask' + sc_TriSpot;
sc_CanMakeDTaskOnlyForOneDFunc=': можу переходити до двоїстої задачі ' +
'тільки від однокритеріальної задачі ЛП (з одною функцією мети). '+
': не можу міняти режим під час розв''язування…';
sc_CantDetMenuItem=': не визначено пункт меню, який викликав процедуру…';
sc_UnknownObjectCall=': невідомий об''єкт, який викликав процедуру: клас ';
sc_NoCellOrNotSupported=': комірка не підтримується або не існує: ';
sc_CantOpenFile=': не можу відкрити файл: «';
sc_EmptyFileOrCantRead=': файл пустий або не читається: «';
sc_FileNotFullOrHasWrongFormat=': файл не повний або не того формату: «';
sc_CantReadFile=': файл не читається: «';
sc_CantCreateFile=': не можу створити файл: «';
sc_CantWriteFile=': файл не вдається записати: «';
': заданий рядок не помічений як функція мети: рядок ';
sc_RowNumsIsOutOfTable=': задані номери рядків виходять за межі таблиці!..';
sc_NoDestFuncs=': немає рядків функцій мети! Задачу не розумію…';
sc_OnlyDestFuncsPresent=': у таблиці всі рядки є записами функцій мети!..';
sc_CalculatingNoOptMeasures=': підраховую міри неоптимальності…';
sc_AllMeasurIsZero=': усі міри рівні нулю, додаю до них одиницю…';
sc_UniqueMeasureCantSetZero=': є тільки одна міра оптимальності (і одна'+
' функція мети). Максимальна за модулем - вона ж. Додавання цієї'+
' максимальної величини замінить її на нуль. Тому заміняю на одиницю…';
sc_WeightCoefs='Вагові коефіцієнти (Li[Func]=ui/W(U)):';
sc_ComprVarVals='Компромісні значення змінних';
sc_DestFuncComprVals='Компромісні значення функцій мети:';
Function ValSign (Const Value:TWorkFloat):TSignVal; overload;
Else if Value>0 then Res1:=bc_Positive;
Function ValSign (Const Value:TValOrName):TSignVal; overload;
If Pos (sc_Minus, Value. AsVarName)=1 then Res1:=bc_Negative
Function GetValOrNameAsStr (Const Value:TValOrName):String;
GetValOrNameAsStr:=FloatToStr (Value. AsNumber)
Else GetValOrNameAsStr:=Value. AsVarName;
Procedure DeleteFromArr (Var SArr:TValOrNameMas; Index, Count: Integer); overload;
{ Процедура для видалення з одновимірного масиву чисел чи назв змінних
SArr одного або більше елементів, починаючи з елемента з номером Index .
Видаляється Count елементів (якщо вони були у масиві починаючи із елемента
If Count<=0 then Exit; {якщо немає елементів для видалення}
{ Якщо є хоч один елемент із заданих для видалення:}
{ Якщо у масиві немає так багато елементів, скільки холіли видалити, то
коригуємо кількість тих, що видаляємо:}
If (Index+Count)>Length(SArr) then Count:=Length(SArr) - Index;
{ Зсуваємо елементи масиву вліво, що залишаються справа після видалення
For CurElm:=Index to (Length(SArr) - 1-Count) do
{ Видаляємо з масиву зайві елементи справа:}
SetLength (SArr, Length(SArr) - Count);
Procedure DeleteFromArr (Var SArr:TFloatArr; Index, Count: Integer); overload;
{ Процедура для видалення з одновимірного масиву дійсних чисел
SArr одного або більше елементів, починаючи з елемента з номером Index .
Видаляється Count елементів (якщо вони були у масиві починаючи із елемента
If Count<=0 then Exit; {якщо немає елементів для видалення}
{ Якщо є хоч один елемент із заданих для видалення:}
{ Якщо у масиві немає так багато елементів, скільки холіли видалити, то
коригуємо кількість тих, що видаляємо:}
If (Index+Count)>Length(SArr) then Count:=Length(SArr) - Index;
{ Зсуваємо елементи масиву вліво, що залишаються справа після видалення
For CurElm:=Index to (Length(SArr) - 1-Count) do
{ Видаляємо з масиву зайві елементи справа:}
SetLength (SArr, Length(SArr) - Count);
Procedure DelColsFromMatr (Var SDMatrix:TFloatMatrix; ColIndex, Count: Integer);
{ Процедура для видалення із матриці дійсних чисел
SHeadArr одного або більше стовпців, починаючи зі стовпця з номером ColIndex .
Видаляється Count стовпців (якщо вони були у матриці починаючи зі стовпця
If Count<=0 then Exit; {якщо немає елементів для видалення}
{ Видаляємо елементи у вказаних стовпцях з кожного рядка. Так
For CurRow:=0 to (Length(SDMatrix) - 1) do
DeleteFromArr (SDMatrix[CurRow], ColIndex, Count);
Procedure DelRowsFromMatr (Var SDMatrix:TFloatMatrix; RowIndex, Count: Integer);
{ Процедура для видалення із матриці дійсних чисел
SHeadArr одного або більше рядків, починаючи з рядка з номером RowIndex .
Видаляється Count рядків (якщо вони були у матриці починаючи з рядка
If Count<=0 then Exit; {якщо немає елементів для видалення}
{ Якщо є хоч один рядок із заданих для видалення:}
If Length(SDMatrix)>=(RowIndex+1) then
{ Якщо у матриці немає так багато рядків, скільки холіли видалити, то
коригуємо кількість тих, що видаляємо:}
If (RowIndex+Count)>Length(SDMatrix) then Count:=Length(SDMatrix) - RowIndex;
{ Зсуваємо рядки матриці вгору, що залишаються знизу після видалення
For CurElm:=RowIndex to (Length(SDMatrix) - 1-Count) do
SDMatrix[CurElm]:=SDMatrix [CurElm+Count];
{ Видаляємо з матриці зайві рядки знизу:}
SetLength (SDMatrix, Length(SDMatrix) - Count);
Procedure ChangeSignForValOrVarName (Var SDValOrName:TValOrName);
{Зміна знаку числа або перед іменем змінної:}
If SDValOrName. ElmType=bc_Number then {для числа:}
SDValOrName. AsNumber:=-SDValOrName. AsNumber
If Pos (sc_Minus, SDValOrName. AsVarName)=1 then
Delete (SDValOrName. AsVarName, 1, Length (sc_Minus))
Else SDValOrName. AsVarName:=sc_Minus+SDValOrName. AsVarName;
{Жорданове виключення за заданим розв'язувальним елементом матриці:}
Function TGridFormattingProcs.GI (RozElmCol, RozElmRow: Integer;
Var SDHeadRow, SDHeadCol:TValOrNameMas; Var SDMatrix:TFloatMatrix;
ToDoMGI: Boolean=False; {прапорець на модифіковане Жорданове виключення}
ToDelColIfZeroInHRow: Boolean=True):Boolean;
{ Функція виконує Жорданове виключення для елемента матриці
SDMatrix з координатами (RozElmCol, RozElmRow). Окрім обробки матриці,
здійснюється заміна місцями елементів у рядку і стовпцю-заголовках
RozElmCol - номер стовпця матриці, у якому лежить розв'язувальний елемент.
RozElmRow - номер рядка матриці, у якому лежить розв'язувальний елемент.
Розв'язувальний елемент не повинен бути рівним нулю, інакше виконання
SDHeadRow , SDHeadCol - рядок і стовпець-заголовки матриці. Рядок-заголовок
SDHeadRow повинен мати не менше елементів, ніж є ширина матриці. Він
містить множники. Стовпець-заголовок SDHeadCol повинен бути не коротшим
за висоту матриці. Він містить праві частини рівнянь (чи нерівностей)
системи. Рівняння полягають у тому що значення елементів
стовпця-заголовка пр
Багатокритеріальна задача лінійного програмування курсовая работа. Программирование, компьютеры и кибернетика.
Произведения Про Одиночество Для Сочинения
Сочинение Досрочное Егэ 2022
Сочинение: Анализ стихотворения Н. Некрасова Родина.
Гдз Контрольные Работы 8 Класс Атанасян
Сочинение На Тему Берегите Природу
Реферат: Возникновение двойной бухгалтерии
Реферат: История становления психологии как науки 2
Реферат На Тему Функциональные Стили Русского Литературного Языка
Контрольная работа по теме Понятие и функции налога
Реферат: Физическая тренировка. Предстартовое состояние. Мышечная работа. Разминка. Физическая работоспос
Реферат: Валютная система РФ
Сочинение На Тему Матрешка 5 Класс
Курсовая работа: Сутність духовності особистості
Лев Толстой Реферат 4 Класс
Классификация И Утилизация Медицинских Отходов Реферат
Сочинение На Тему Какие События Нельзя Забывать
Доклад по теме Спутниковые навигационные системы
Делаю Вдох Так Пахнет Май Эсс
Реферат: Technology Changes Essay Research Paper New Technologies
Реферат: Cleopatra Essay Research Paper CleopatraCleopatra was queen
Кухня фьюжн - Кулинария и продукты питания курсовая работа
Язык коммерческой рекламы - Маркетинг, реклама и торговля курсовая работа
Исследование особенностей мышления школьников подросткового и раннего юношеского возраста - Педагогика курсовая работа


Report Page