Багатокритер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в у ряд