Багатокритерiальна задача лiнiйного програмування
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?енами функцiй-нерiвностей,
нулями (заголовки рядкiв-рiвнянь), iменами функцiй мети
(що максимiзуються (тип комiрки bc_DestFuncToMax) або мiнiмiзуються
(тип bc_DestFuncToMin)).
Функцiя повертаСФ ознаку успiшностi вирiшування.}Row, CurWidth, CurHeight, FirstDestFuncRow,, VarCount: Integer;: Boolean;: String;, DualUVec:TFloatMatrix;, OptGTaskVal, ComprXVec:TFloatArr;sc_CurProcName='SolveMultiCritLTask';_TextMarkRow='############';
Procedure ShowWeightCoefs (Const SCoefs:TFloatArr; FirstDestFuncRow: Integer);i: Integer;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_WeightCoefs);i:=0 to Length(SCoefs) - 1 do
{ВiдображаСФмо ваговi коефiцiСФнти для кожноСЧ з функцiй мети
багатокритерiальноСЧ задачi:}. CurOutConsole. Lines. Add ('l['+. CopyHeadCol [FirstDestFuncRow+i].AsVarName+'] = '+(SCoefs[i]));;;;
ShowComprVarVec (Const ComprXVec:TFloatArr);Col: Integer; st1: String;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_ComprVarVals);Col:=0 to Length(ComprXVec) - 1 do:=Self. CopyHeadRow[Col].AsVarName + ' = ';:=st1 + FloatToStr (ComprXVec[Col]);. CurOutConsole. Lines. Add(st1);;;;
ShowDFuncVals (Const ComprXVec:TFloatArr; FirstDFuncRow: Integer);Row: Integer; st1: String;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_DestFuncComprVals);Row:=FirstDFuncRow to Length (Self. CopyTable) - 1 do:=Self. CopyHeadCol[Row].AsVarName + ' = ';:=st1 + FloatToStr (Self. CalcDFuncVal (ComprXVec, Row));. CurOutConsole. Lines. Add(st1);;;;
LStopLabel, LFinish;:=True; {прапорець успiшностi}. GetTaskSizes (CurWidth, CurHeight);
CurWidthNil then. CurOutConsole. Lines. Add (sc_CurProcName + sc_EmptyTable);. WasNoRoots:=True;:=False;;;
Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add('');. CurOutConsole. Lines. Add (sc_CurProcName + sc_StartSolving);;
{ЗберiгаСФмо посилання на масиви умови багатокритерiальноСЧ задачi:}. CopyHeadRow:=Self. CurHeadRow;. CopyHeadCol:=Self. CurHeadCol;. CopyTable:=Self. CurTable;
{ШукаСФмо цiльовi функцiСЧ внизу таблицi:}Row:=CurHeight-1 downto 0 doSelf. CopyHeadCol[Row].ElmType of_DestFuncToMax:;_DestFuncToMin:;
{Якщо знизу вгору дiйшли до рядка, що не СФ функцiСФю мети - завершуСФмо:}Break;;;
Row>=CurHeight-1 then {якщо рядкiв функцiй мети взагалi немаСФ:}Self. CurOutConsoleNil then. CurOutConsole. Lines. Add (sc_CurProcName + sc_OnlyDestFuncsPresent);
:=False; Goto LFinish;
(* Row:=-1; *);:=Row+1; {найвищий у таблицi рядок функцiСЧ мети}
:=CurHeight-FirstDestFuncRow; {кiлькiсть функцiй мети}
{Змiннi: усi стовпцi окрiм останнього (стовпця вiльних членiв з
одиницею в заголовку):}:=CurWidth-1;
{Вектори змiнних в оптимальних розв'язках задач:}(OptimXVecs, DestFuncCount, VarCount);
{Оптимальнi значення функцiй (максимальнi або мiнiмальнi значення):}(OptimFuncVals, DestFuncCount);
{############ ШукаСФмо min або max кожноСЧ функцiСЧ мети окремо: ############}Row:=FirstDestFuncRow to CurHeight-1 do {для усiх функцiй мети:}Self. CurOutConsole<>Nil then:=sc_TextMarkRow+sc_CurProcName + sc_ForDestFunc+_DoubleQuot+ Self. CopyHeadCol[Row].AsVarName +sc_DoubleQuot+sc_Space;Self. CopyHeadCol[Row].ElmType=bc_DestFuncToMin then:=st1+sc_SearchingMinst1:=st1+sc_SearchingMax;:=st1+sc_TriSpot+sc_TextMarkRow;
. CurOutConsole. Lines. Add(st1);;
{ФормуСФмо умову однокритерiальноСЧ задачi максимiзацiСЧ:}Not (Self. PrepareDestFuncInMultiDFuncLTask (Row, FirstDestFuncRow)) then:=False; Break;;Self. Stop then Break;
{ХоваСФмо розв'язувальну комiрку у екраннiй таблицi (СЧСЧ нема тут):}. CurGridSolveCol:=0; Self. CurGridSolveRow:=0;
{ВiдображаСФмо пiдготовану однокритерiальну задачу:}(Self.CHeadColNum, Self.CHeadRowNum);Self. Stop then Break;
{ЗапускаСФмо вирiшування однокритерiальноСЧ задачi максимiзацiСЧ лiнiйноСЧ
форми (так як поточна функцiя СФ функцiСФю максимiзацiСЧ, або зведена
до такоСЧ):}. WasNoRoots:=False; Self. WasManyRoots:=False; Self. SolWasFound:=False;Not (Self. SolveLTaskToMax(False)) then:=False; Break;;
{Якщо функцiя мети необмежена або система умов несумiсна:}Not (Self. SolWasFound) then
{Якщо функцiй мети бiльше одноСЧ, то так як компромiсний вектор
через необмеженiсть принаймнi одноСЧ з функцiй мети знайти неможливо:}(FirstDestFuncRow+1)<CurHeight then Res1:=FalseRes1:=True;LFinish;;Self. Stop then Break;
{ЧитаСФмо вектор значень змiнних та оптимальне значення функцiСЧ мети
з таблицi:}. ReadCurFuncSolution (OptimXVecs, OptimFuncVals, Row-FirstDestFuncRow,, False);;Not(Res1) then Goto LFinish;Self. Stop then Goto LStopLabel;
{############ ШукаСФмо мiри неоптимальностi i будуСФмо задачу: ############}
{######## пошуку компромiсних вагових коефiцiСФнтiв, вирiшуСФмо СЧСЧ: ########}Self. CurOutConsoleNil then. CurOutConsole. Lines. Add (sc_TextMarkRow);
{ГотуСФмо задачу до максимiзацiСЧ симплекс-методом:}:=Self. PrepareDFuncForSimplexMaximize;Not(Res1) then Goto LFinish;
{ЗапускаСФмо вирiшування цiСФСЧ задачi:}. WasNoRoots:=False; Self. WasManyRoots:=False; Self. SolWasFound:=False;
{True - з вiдображенням значень двоСЧстоСЧ:}Not (Self. SolveLTaskToMax(True)) then:=False; Goto LFinish;;
{Якщо функцiя мети необмежена або система умов несумiсна:}Not (Self. SolWasFound) then:=False; Goto LFinish;;Self. Stop then Goto LStopLabel;
{############ ОбчислюСФмо ваговi коефiцiСФнти: ############}
{Якщо задача-iнтерпретацiя гри вирiшена i знайдено оптимальне
значення функцiСЧ, то читаСФмо це значення i значення змiнних
двоСЧстоСЧ задачi:}(OptGTaskVal, 1); {для запису значення функцiСЧ мети}(DualUVec, 1, DestFuncCount); {для запису значень змiнних}. ReadCurFuncSolution (DualUVec, OptGTaskVal, 0, False, True);
{ОбчислюСФмо ваговi коефiцiСФнти:}Row:=0 to DestFuncCount-1 do[0, Row]:=(DualUVec [0, Row]/OptGTaskVal[0]); {Li=ui/(W(U))}
Self. CurOutConsole<>Nil then Self. CurOutConsole. Lines. Add (sc_TextMarkRow);(DualUVec[0], FirstDestFuncRow);
{############ ОбчислюСФмо компромiсний вектор: ############}. CalcComprVec (OptimXVecs, DualUVec[0], ComprXVec);
(ComprXVec);(ComprXVec, FirstDestFuncRow);
LFinish;: {Якщо вирiшування було перервано:}
{ПовертаСФмо початкову умову на попереднСФ мiiе:}. CurHeadRow:=Self. CopyHeadRow;. CurHeadCol:=Self. CopyHeadCol;. CurTable:=Self. CopyTable;:
{ОбнуляСФмо посилання на копiю умови. Так як це динамiчнi масиви i
щодо них йде вiдлiк кiлькостi посилань, то для них не створюватимуться
зайвi копiСЧ у пам'ятi, i при роботi з CurHeadRow, CurHeadCol, CurTable
пам'ять буде видiлена завжди тiльки для СЧхнiх поточних даних:}. CopyHeadRow:=Nil;. CopyHeadCol:=NIl;. CopyTable:=Nil;
:=Res1;;
TGridFormattingProcs. ChangeSignsInRow (CurRowNum: Integer);
{Змiна знакiв у ряд