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