Багатокритерiальна задача лiнiйного програмування
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
або функцiСЧ) у стовпцi-заголовку в точцi
задачi мають своСЧ значення у стовпцi вiльних членiв,
а змiннi двоСЧстоСЧ - рiвнi нулю:}(Self. CurHeadCol[CurRowNum].ElmType in DestFuncsTypes) or(DualTaskVals) then:=st1+ FloatToStr (Self. CurTable [CurRowNum, LastColNum])st1:=st1+'0';
(Self. CurHeadCol[CurRowNum].ElmType in DestFuncsTypes) then:=sc_ResFunc+sc_Space+st1;
CurRowNum=LastRowNum then st1:=st1+sc_Spotst1:=st1+sc_KrKm;
. CurOutConsole. Lines. Add(st1);;;;
TGridFormattingProcs. ReadCurFuncSolution (Var SDValVecs:TFloatMatrix;SDDestFuncVals:TFloatArr; SVecRow: Integer;: Boolean; DualTaskVals: Boolean);
{Процедура зчитуСФ значення функцiСЧ мети у таблицi розв'язаноСЧ
однокритерiальноСЧ задачi, i значення усiх змiнних або функцiй в цьому
розв'язку.
Вхiднi данi:- номер поточноСЧ функцiСЧ мети (нумерацiя з нуля) у масивахi SDDestFuncVals;- перемикач: якщо рiвний False, то зчитуються значення
змiнних (i значення функцiСЧ мети); True - зчитуються значення
функцiй-нерiвностей (i значення функцiСЧ мети);- вмикач режиму читання змiнних двоСЧстоСЧ задачi:
читаються значення змiнних i функцiй двоСЧстоСЧ задачi. РЗхнi
значення розмiщенi не на мiii стовпця вiльних членiв, а у рядку
коефiцiСФнтiв функцiСЧ мети (функцiСЧ мети прямоСЧ задачi). Вони СФ
значеннями змiнних чи функцiй, iмена яких у рядку-заголовку.
Змiннi чи функцiСЧ-нерiвностi двоСЧстоСЧ задачi з iменами у
стовпцi-заголовку СФ рiвними нулю.
Таблиця розв'язаноСЧ однокритерiальноСЧ (з одною функцiСФю мети) задачi:. CurTable - таблиця коефiцiСФнтiв та вiльних членiв;. CurHeadRow - рядок-заголовок з iменами змiнних, iменами
функцiй-нерiвностей (що перейшли в рядок-заголовок) та
одиницею-множником стовпця вiльних членiв (маСФ бути останнiм);. CurHeadCol - стовпець-заголовок з iменами функцiй-нерiвностей,
iменами змiнних (виключених), iменем функцiСЧ мети. Функцiя мети
маСФ бути в останньому рядку, i бути одна;- масив для запису векторiв значень змiнних;- масив для запису значень функцiй мети
(для цих двох останнiх масивiв пам'ять маСФ бути вже видiленою).
Вихiднi данi:- масив векторiв значень змiнних iз заповненим вектором
номер SVecRow. Змiннi, яких немаСФ в таблицi розв'язку, вважаються
такими що можуть мати будь-яке значення, i приймаються рiвними нулю;- масив значень функцiй мети з поточни значенням
у комiрцi номер SVecRow.}CurColNum, CurRowNum, LastColNum, LastRowNum: Integer;:THeadLineElmTypes;
{РЖнiцiюСФмо нулями поточний вектор значень.
Змiннi чи функцiСЧ, iмена яких у рядку-заголовку, рiвнi нулю
для прямоСЧ задачi (для двоСЧстоСЧ - у стовпцi-заголовку).
Змiннi i функцiСЧ, яких немаСФ в таблицi, теж вважаСФмо рiвними нулю:}CurColNum:=0 to Length (SDValVecs[SVecRow]) - 1 do[SVecRow, CurColNum]:=0;
{ЧитаСФмо стовпець-заголовок i значення iз останнього стовпця таблицi:}:=Length (Self. CurHeadRow) - 1;:=Length (Self. CurHeadCol) - 1;
{Значення функцiСЧ мети:}[SVecRow]:=Self. CurTable [LastRowNum, LastColNum];
{ФункцiСЧ-нерiвностi прямоСЧ задачi вiдповiдають змiнним двоСЧстоСЧ задачi
за позицiюванням в заголовках (не за значеннями, значення рiзнi!),
змiннi прямоСЧ - функцiям двоСЧстоСЧ:}(ToReadFuncVals) xor (DualTaskVals) then:=[bc_FuncVal]WorkCellTypes:=[bc_IndependentVar, bc_DependentVar];
{ЧитаСФмо змiннi або функцiСЧ-нерiвностi (в залежностi вiд того, що
задано прочитати):}DualTaskVals thenCurColNum:=0 to LastColNum-1 do {усi стовпцi крiм стовпця вiльних членiв}{значення записуСФмо у заданий вектор (SVecRow):}(Self. CurHeadRow[CurColNum].ElmType in WorkCellTypes) then[SVecRow, Self. CurHeadRow[CurColNum].VarInitPos]:=. CurTable [LastRowNum, CurColNum];CurRowNum:=0 to LastRowNum-1 do {усi рядки крiм рядка функцiСЧ мети}{значення записуСФмо у заданий вектор (SVecRow):}(Self. CurHeadCol[CurRowNum].ElmType in WorkCellTypes) then[SVecRow, Self. CurHeadCol[CurRowNum].VarInitPos]:=. CurTable [CurRowNum, LastColNum];;;
TGridFormattingProcs. BuildPaymentTaskOfOptim (SOptimXVecs:TFloatMatrix; Const SOptimFuncVals:TFloatArr;: Integer);
{БудуСФ однокритерiальну задачу максимiзацiСЧ для пошуку вагових
коефiцiСФнтiв i компромiсного вектора значень змiнних для
усiх заданих функцiй мети.
Вхiднi данi:- масив векторiв оптимальних значень змiнних для
кожноСЧ з фунуцiй мети;- масив оптимальних значень функцiй мети;- номер першоСЧ (найвищоСЧ) функцiСЧ мети
у Self. CopyTable i Self. CopyHeadCol;. CopyTable - матриця коефiцiСФнтiв умови багатокритерiальноСЧ задачi;
Вихiднi данi:
Однокритерiальна задача ЛП для максимiзацiСЧ:. CurTable - матриця коефiцiСФнтiв оптимальностi,
вiльних членiв i коефiцiСФнтiв функцiСЧ мети;. CurHeadCol - iмена змiнних двоСЧстоСЧ задачi (як
функцiСЧ-нерiвностi прямоСЧ задачi);. CurHeadRow - iмена функцiй-нерiвностей двоСЧстоСЧ задачi
(як залежнi (тiльки бiльше нуля) змiннi прямоСЧ задачi).}jCol, iRow, FuncCount, FuncRow: Integer; MinQ, CurQ:TWorkFloat;sc_CurProcName='BuildPaymentTaskOfOptim';CalcQ (ZjFuncRow: Integer; Const XiVals:TFloatArr;ZjXj:TWorkFloat):TWorkFloat;
{ПiдраховуСФ мiру неоптимальностi.
Вхiднi данi:- номер рядка j-оСЧ функцiСЧ мети у таблицi Self. CopyTable;. CopyTable - таблиця коефiцiСФнтiв умови багатокритерiальноСЧ
задачi ЛП;- оптимальнi значення змiнних для i-оСЧ функцiСЧ мети
(для формування i-го рядка матрицi неоптимальностi);- значення j-оСЧ функцiСЧ мети за j-го набору оптимальних
значень змiнних (тобто оптимальне значення цiСФСЧ функцiСЧ). Для
формування j-го стовпця матрицi неоптимальностi.
Вихiднi данi: мiра неоптимальностi.}VarNum: Integer; ZjXi:TWorkFloat;:=0;
{ШукаСФмо суму добуткiв значень змiнних i коефiцiСФнтiв при них -
значення функцiСЧ у точцi, координатами якоСЧ СФ поданi значення змiнних:}VarNum:=0 to Length(XiVals) - 1 do:=ZjXi + Self. CopyTable [ZjFuncRow, VarNum]*XiVals[VarNum];
:=-Abs((ZjXi/ZjXj) - 1); {qij=-|(ZjXi-ZjXj)/(ZjXj)|};
{Заповнення iмен змiнних - iмен фукнцiй двоСЧстоСЧ задачi у рядку-заголовку:}FillHRowVarName (SCol: Integer);. CurHeadRow[SCol].VarInitPos:=SCol;. CurHeadRow[SCol].VarInitInRow:=True;. CurHeadRow[SCol].ElmType:=bc_DependentVar;. CurHeadRow[SCol].AsVarName:=sc_Minus+sc_DualTaskFuncNameStart+(SCol+1);