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