Багатокритерiальна задача лiнiйного програмування
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
id. TuneColWidth;}
. EqM1TaskPrepared:=False;. EqM2TaskPrepared:=False;.LTaskPrepared:=False;:=True;;
TGridFormattingProcs. Refresh;sc_CurProcName='Refresh';Res1: Boolean;Self. CurFormatStateNil then. CurOutConsole. Lines. Add (sc_CurProcName+': '+_NoGrowingStringGrid);;;
:=False;
{Якщо таблиця редагована або ще не читана, то запускаСФмо СЧСЧ зчитування:}Self. CurGridModified or (Self. TaskWidth<=0) then Res1:=Self. GetTask;
Not(Res1) then {Якщо таблиця не була вiджображена у GetTask, вiдображаСФмо:}. WriteTableToGrid (Self.CHeadColNum, Self.CHeadRowNum);;;
TGridFormattingProcs. ResetModified; {скидаСФ прапорець змiненого стану}. CurGridModified:=False;;
TGridFormattingProcs. UndoChanges;
{ВiдкидаСФ останнi змiни (ResetModified+Refresh).}. ResetModified; Self. Refresh;;
Transpose (Var SDMatrix:TFloatMatrix);
{Транспонування двовимiрноСЧ матрицi.}CurCol, CurRow, CurWidth, CurHeight: Integer;:TWorkFloat;:=Length(SDMatrix);CurHeight>0 then CurWidth:=Length (SDMatrix[0])CurWidth:=0;
(CurHeight=0) or (CurWidth=0) then Exit;
{ЗбiльшуСФмо розмiри матрицi до квадратних:}CurWidth>CurHeight then {Якщо ширина була бiльша за висоту:}(SDMatrix, CurWidth, CurWidth); {збiльшуСФмо висоту}if CurWidth<CurHeight then {Якщо висота була бiльша за ширину:}(SDMatrix, CurHeight, CurHeight); {збiльшуСФмо ширину};
{МiняСФмо елементи мiiями: рядки будуть стовпцями, а стовпцi - рядками:}CurRow:=0 to Length(SDMatrix) - 1 doCurCol:=CurRow + 1 to Length (SDMatrix[CurRow]) - 1 do:=SDMatrix [CurRow, CurCol];[CurRow, CurCol]:=SDMatrix [CurCol, CurRow];[CurCol, CurRow]:=SafeElm;;;
{Ширина тепер буде така як була висота, а висота - як була ширина:}(SDMatrix, CurWidth, CurHeight);;
TGridFormattingProcs. MakeDualLTask: Boolean;
{Перехiд вiд зчитаноСЧ умови задачi максимiзацiСЧ чи мiнiмiзацiСЧ
лiнiйноСЧ форми до двоСЧстоСЧ задачi. ПрацюСФ у режимi редагування
задачi максимiзацiСЧ-мiнiмiзацiСЧ (fs_EnteringLTask).
За правилом двоСЧсту задачу потрiбно мiнiмiзувати, якщо для прямоСЧ
потрiбно було знайти максимум, i максимiзувати, якщо для прямоСЧ потрiбно
було знайти мiнiмум.
}sc_CurProcName='MakeDualLTask';SafeMas:TValOrNameMas; CurCol, CurRow, DFuncCount: Integer;:TDualTaskType; NewDFuncType, OldDFuncType:THeadLineElmType;:=Nil;Self. CurFormatStateNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_CanMakeOnlyInELTaskMode);:=False; Exit;;
Self. CurGridModified thenNot (Self. GetTask(True)) then:=False; Exit;;;
Self. TaskHeightNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_EmptyTable);:=False; Exit;;
{ПеревiряСФмо, чи функцiя мети лише одна, i визначаСФмо СЧСЧ тип
(для максимiзацiСЧ чи мiнiмiзацiСЧ):}:=0; DualTType:=dt_MaxToMin; OldDFuncType:=bc_DestFuncToMax;CurRow:=0 to Length (Self. CurHeadCol) - 1 doSelf. CurHeadCol[CurRow].ElmType=bc_DestFuncToMax then:=dt_MaxToMin;:=Self. CurHeadCol[CurRow].ElmType;(DFuncCount);if Self. CurHeadCol[CurRow].ElmType=bc_DestFuncToMin then:=dt_MinToMax;:=Self. CurHeadCol[CurRow].ElmType;(DFuncCount);;;
{Якщо функцiй мети декiлька або жодноСЧ:}DFuncCountNil then. CurOutConsole. Lines. Add (sc_CurProcName+_CanMakeDTaskOnlyForOneDFunc+IntToStr(DFuncCount));:=False; Exit;;
DualTType=dt_MaxToMin then NewDFuncType:=bc_DestFuncToMinNewDFuncType:=bc_DestFuncToMax;
{ЗсуваСФмо рядок функцiСЧ мети вниз таблицi. При цьому позначки порядку
рядкiв залишаСФмо на тих самих мiiях (i присвоюСФмо тим рядкам, якi
стають на цi мiiя):}. ShiftRowsDown([bc_DestFuncToMax, bc_DestFuncToMin], True);
(Self. CurTable); {транспонуСФмо таблицю коефiцiСФнтiв}
{ОбробляСФмо заголовки таблицi у вiдповiднiсть до двоСЧстоСЧ задачi:}
{Для рядка-заголовка, що стане стовпцем-заголовком:}CurCol:=0 to Length (Self. CurHeadRow) - 1 do{Проходимо по усiх змiнних i останньому елементу -
множнику стовпця вiльних членiв - одиницi:}Self. CurHeadRow[CurCol].ElmType=bc_DependentVar then {Якщо змiнна >=0:}{Ця комiрка буде заголовком функцiСЧ умови-нерiвностi зi знаком >=:}. CurHeadRow[CurCol].ElmType:=bc_FuncVal;. CurHeadRow[CurCol].VarInitInRow:=False;
{ФормуСФмо назву функцiСЧ:}
{якщо змiнна маСФ назву змiнноСЧ двоСЧстоСЧ задачi, то дамо назву
функцiСЧ прямоСЧ задачi, якщо назва прямоСЧ - назву двоСЧстоСЧ:}Pos (sc_DualTaskVarNameStart, Self. CurHeadRow[CurCol].AsVarName)>0 then. CurHeadRow[CurCol].AsVarName:=sc_YFuncName + IntToStr (CurCol+1)Self. CurHeadRow[CurCol].AsVarName:=sc_DualTaskFuncNameStart +(CurCol+1);
{Якщо переходимо вiд задачi максимiзацiСЧ до двоСЧстоСЧ задачi
мiнiмiзацiСЧ, то для нерiвностi треба буде змiнити знак >= на <=,
(якщо для змiнноСЧ була умова >=0, i заголовок для неСЧ був додатний),
тому змiнюСФмо знак заголовка:}DualTType=dt_MaxToMin then(Self. CurHeadRow[CurCol]);{Якщо змiнна вiльна:}if Self. CurHeadRow[CurCol].ElmType=bc_IndependentVar then{Ця комiрка буде заголовком умови-рiвняння:}. CurHeadRow[CurCol].ElmType:=bc_Number;. CurHeadRow[CurCol].AsNumber:=0;{Якщо це число:}if Self. CurHeadRow[CurCol].ElmType=bc_Number thenSelf. CurHeadRow[CurCol].AsNumber=1 then {якщо це множник вiльних членiв}. CurHeadRow[CurCol].ElmType:=NewDFuncType;. CurHeadRow[CurCol].VarInitInRow:=False;
{ФормуСФмо назву функцiСЧ мети двоСЧстоСЧ задачi
(залежно вiд назви функцiСЧ мети поданоСЧ задачi):}Pos (sc_DualDestFuncHdr,. CurHeadCol [Length(Self. CurHeadCol) - 1].AsVarName)>0 then. CurHeadRow[CurCol].AsVarName:=sc_DestFuncHdrSelf. CurHeadRow[CurCol].AsVarName:=sc_DualDestFuncHdr;;;;
{Для стовпця-заголовка, що стане рядком-заголовком:}CurRow:=0 to Length (Self. CurHeadCol) - 1 do
{Проходимо по усiх елементах-заголовках рядкiв, i останньому елементу -
заголовку рядка функцiСЧ мети:}Self. CurHeadCol[CurRow].ElmType=bc_FuncVal then {Якщо нерiвнiсть =0}. CurHeadCol[CurRow].VarInitInRow:=True;
{ФормуСФмо назву змiнноСЧ:
якщо функцiя-нерiвнiсть маСФ назву функцiСЧ двоСЧстоСЧ задачi, то
дамо назву змiнноСЧ прямоСЧ задачi, якщо назва прямоСЧ - назву двоСЧстоСЧ:}Pos (sc_DualTaskFuncNameStart, CurHeadCol[CurRow].AsVarName)>0 then. CurHeadCol[CurRow].AsVarName:=sc_XVarName + IntToStr (CurRow+1)Self. CurHeadCol[CurRow].AsVarName:=sc_DualTaskVarNameStart +(CurRow+1);
{Якщо переходимо вiд задачi мiнiмiзацiСЧ до двоСЧстоСЧ задачi
максимiзацiСЧ, то для змiнноСЧ треба буде змiнити знак i умову <=0
на >=0, (якщо для нерiвнiсть була зi знаком <=, i заголовок для
неСЧ був додатний), тому змiнюСФмо знак заголовка:}DualTType=dt_MinToMax then(Self. CurHeadCol[CurRow]);if Self. CurHeadCol[CurRow].ElmType=bc_Number thenSelf. CurHeadCol[CurRow].AsNumber=0 then {Якщо 0, заголовок рiвняння:}. CurHeadCol[CurRow].ElmType:=bc_IndependentVar;. CurHeadCol[CurRow].Var