Багатокритерiальна задача лiнiйного програмування

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



InitInRow:=True;

{ФормуСФмо назву змiнноСЧ двоСЧстоСЧ задачi

(залежно вiд назви функцiСЧ мети поданоСЧ задачi):}Pos (sc_DualDestFuncHdr,. CurHeadCol [Length(Self. CurHeadCol) - 1].AsVarName)>0 then. CurHeadCol[CurRow].AsVarName:=sc_XVarName+IntToStr (CurRow+1)Self. CurHeadCol[CurRow].AsVarName:=sc_DualTaskVarNameStart+(CurRow+1);;{Якщо заголовок рядка функцiСЧ мети:}if Self. CurHeadCol[CurRow].ElmType=OldDFuncType then. CurHeadCol[CurRow].ElmType:=bc_Number;. CurHeadCol[CurRow].AsNumber:=1; {буде множник стовпця вiльних членiв};;

{МiняСФмо рядок i стовпець-заголовки таблицi мiiями:}:=Self. CurHeadRow;. CurHeadRow:=Self. CurHeadCol;. CurHeadCol:=SafeMas;

{У новому стовпцi-заголовку шукаСФмо комiрки-заголовки нерiвностей >=.

РЗх замiняСФмо на <= множенням рядка на -1:}CurRow:=0 to Length (Self. CurHeadCol) - 1 doSelf. CurHeadCol[CurRow].ElmType=bc_FuncVal thenValSign (Self. CurHeadCol[CurRow])=bc_Negative then. ChangeSignsInRow(CurRow);;;

{У новому рядку-заголовку шукаСФмо комiрки-заголовки залежних змiнних,

якi мають умову =0 множенням стовпця на -1:}CurCol:=0 to Length (Self. CurHeadRow) - 1 doSelf. CurHeadRow[CurCol].ElmType=bc_DependentVar thenValSign (Self. CurHeadRow[CurCol])=bc_Negative then. ChangeSignsInCol(CurCol);;;

{ВiдображаСФмо отриману таблицю у екраннiй таблицi:}. WriteTableToGrid (Self.CHeadColNum, Self.CHeadRowNum);

MakeDualLTask:=True;;

TGridFormattingProcs. PrepareToSolveEqsWithM1: Boolean;sc_CurProcName='PrepareToSolveEqsWithM1';CurRow, ColToDel: Integer;(Self. CurFormatState=fs_EnteringEqs) or

(Self. CurFormatState=fs_NoFormatting) then

{Якщо таблиця не зчитана, то читаСФмо:}(Self. CurGridModified) and (Self. CurFormatState=fs_EnteringEqs) thenNot (Self. GetTask) then:=False; Exit;;;

Self. TaskHeightNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_EmptyTable);:=False;;;

Not (Self. EqM1TaskPrepared) then

{КопiюСФмо стовпець вiльних членiв (правих частин рiвнянь) iз

останнього стовпця таблицi до стовпця-заголовка:}CurRow:=0 to Length (Self. CurHeadCol) - 1 do. CurHeadCol[CurRow].ElmType:=bc_Number;. CurHeadCol[CurRow].AsNumber:=. CurTable [CurRow, Length (CurTable[CurRow]) - 1];;

{ВидаляСФмо цей останнiй стовпець iз таблицi:}:=Length (Self. CurTable[0]) - 1;(Self. CurTable, ColToDel, 1);(Self. CurHeadRow, ColToDel, 1);;

{Позицiювання вiдображення таблицi у даному режимi вирiшування:}.CHeadColNum:=CurGrid. FixedCols;.CHeadRowNum:=CurGrid. FixedRows-1;

{ВiдображаСФмо таблицю, що пiдготована для розв'язування:}. WriteTableToGrid (Self.CHeadColNum, Self.CHeadRowNum);

{Якщо таблиця пуста пiсля перенесення останнього стовпця у

стовпець-заголовок:}Self. TaskHeight<=0 then:=False;;;

. EqM1TaskPrepared:=True;:=True;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_WrongEditMode);:=False;;;

TGridFormattingProcs. PrepareToSolveEqsWithM2: Boolean;sc_CurProcName='PrepareToSolveEqsWithM2';CurRow: Integer;(Self. CurFormatState=fs_EnteringEqs) or

(Self. CurFormatState=fs_NoFormatting) then{Якщо таблиця не зчитана, то читаСФмо:}(Self. CurGridModified) and (Self. CurFormatState=fs_EnteringEqs) thenNot (Self. GetTask) then:=False; Exit;;;

Self. TaskHeightNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_TableIsNotReady);:=False; Exit;;Not (Self. EqM2TaskPrepared) thenCurRow:=0 to Length (Self. CurHeadCol) - 1 do

{ЗаповнюСФмо стовпець-заголовок нулями:}. CurHeadCol[CurRow].ElmType:=bc_Number;. CurHeadCol[CurRow].AsNumber:=0;

{ЗмiнюСФмо знаки у останньому стовпцi таблицi - стовпцi вiльних

членiв. Так як вони у правих частинах рiвнянь, то знаходячись у

таблицi коефiцiСФнтiв лiвих частин, повиннi бути з протилежними

знаками:}. CurTable [CurRow, Length (CurTable[CurRow]) - 1]:=

Self. CurTable [CurRow, Length (CurTable[CurRow]) - 1];;;

{Позицiювання вiдображення таблицi у даному режимi вирiшування:}.CHeadColNum:=CurGrid. FixedCols;.CHeadRowNum:=CurGrid. FixedRows-1;

{ВiдображаСФмо таюдицю, що пiдготована для розв'язування:}. WriteTableToGrid (Self.CHeadColNum, Self.CHeadRowNum);

. EqM2TaskPrepared:=True;:=True;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_WrongEditMode);:=False;;;

{TTableFormatState=(fs_EnteringEqs, fs_EnteringLTask, fs_SolvingEqsM1,_SolvingEqsM2, fs_SolvingLTask,_NoFormatting, fs_FreeEdit);}

TGridFormattingProcs. PrepareToSolveLTask: Boolean;sc_CurProcName='PrepareToSolveLTask';(Self. CurFormatState=fs_EnteringLTask) or

(Self. CurFormatState=fs_NoFormatting) then{Якщо таблиця у режимi редагування задачi, i модифiкована, то зчитуСФмо:}(Self. CurGridModified) and (Self. CurFormatState=fs_EnteringLTask) thenNot (Self. GetTask) then {зчитуСФмо таблицю (умову) з екранноСЧ таблицi}:=False; Exit;;;

Self. TaskHeightNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_TableIsNotReady);:=False; Exit;;Not (Self.LTaskPrepared) then {якщо ця пiдготовка ще не виконувалася:}

{ЗсуваСФмо рядки цiльових функцiй вниз. При цьому позначки порядку

рядкiв залишаСФмо на тих самих мiiях (i присвоюСФмо тим рядкам, якi

стають на цi мiiя):}. ShiftRowsDown([bc_DestFuncToMax, bc_DestFuncToMin], True);

{Позицiювання вiдображення таблицi у даному режимi вирiшування:}.CHeadColNum:=CurGrid. FixedCols;.CHeadRowNum:=CurGrid. FixedRows-1;

{ВiдображаСФмо таблицю, що пiдготована для розв'язування:}. WriteTableToGrid (Self.CHeadColNum, Self.CHeadRowNum);.LTaskPrepared:=True;;:=True;Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_WrongEditMode);:=False;;;

TGridFormattingProcs. PrepareDFuncForSimplexMaximize: Boolean;ToMax: Boolean; Row, Col, CurWidth, DFuncRowNum: Integer;sc_CurProcName='PrepareDFuncForSimplexMaximize';:=Length (Self. CurHeadRow);:=Length (Self. CurHeadCol) - 1;

Self. CurHeadCol[DFuncRowNum].ElmType of {перевiряСФмо тип функцiСЧ мети:}_DestFuncToMax: ToMax:=True;_DestFuncToMin: ToMax:=False;{якщо заданий рядок виявився не функцiСФю мети:}Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+_CurRowNotMarkedAsDestFunc+IntToStr (DFuncRowNum+1));:=False; Exit;;;

{ГотуСФмо умову для вирiшування симплекс-методом максимiзацiСЧ:}

{МiняСФмо знаки у елементiв рядка-заголовка, окрiм знака останньоСЧ

комiрки - то множник для стовпця правих частин. Це СФ

iнтерпретацiСФю перенесення усiх доданкiв у праву частину, i

форматом для виконання модифiкованих Жорданових виключень:}Col:=0 to CurWidth-2 do(Self. CurHeadRow[Col]);

{Якщо треба шукати максимум, то множимо коефiцiСФнти функцiСЧ мети

на -1 (окрiм вiльгого члена), бо помножили i усi x1тАжxn на -1.

Якщо треба мiнiмум, то цi коефiцiСФнти не множимо

(бо x1тАжxn вже помноженi), але множимо вiльний член функцiСЧ. Тодi

отримаСФмо протилежну функцiю, щоб знайти СЧСЧ максимум

(це протилежний мiнiмум заданоСЧ функцiСЧ):}:=Length (Self. CurHeadCol) - 1