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

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

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



зувальноСЧ комiрки для помiтки кольором в екраннiй

таблицi:}. CurGridSolveCol:=CurColNum+HeadColNum+bc_LTaskColsBeforeVars;. CurGridSolveRow:=CurRowNum+HeadRowNum+bc_LTaskRowsBeforeVars;

{Якщо поточна змiнна незалежна:}Self. CurHeadRow[CurColNum].ElmType=bc_IndependentVar then{ПеревiряСФмо, чи не дiйшли до рядка функцiСЧ

(або взагалi за низ таблицi):}CurRowNum<(Length (Self. CurHeadCol) - 1) then{якщо рядки для виключення ще залишились:}

{ШукаСФмо ненульову комiрку серед коефiцiСФнтiв поточноСЧ

незалежноСЧ змiнноСЧ (окрiм останнього рядка, що СФ

рядком поточноСЧ функцiСЧ мети):}SearchNozeroSolveCell (CurRowNum, CurColNum,(Self. CurHeadCol) - 2, Length (Self. CurHeadRow) - 2,, HeadColNum, False) then{якщо змiнну можна виключити:}(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{ОбробляСФмо таблицю модифiкованим Жордановим виключенням:}Not (Self.GI (CurColNum, CurRowNum, Self. CurHeadRow,. CurHeadCol, Self. CurTable, ColDeleted, True,)) then:=False; Exit;;

:=False;

{Переходимо до наступного рядка, бо даний рядок тепер вже СФ

рядком виключеноСЧ вiльноСЧ змiнноСЧ (i змiнна виражена як

функцiя-нерiвнiсть):}(CurRowNum);{якщо для незалежноСЧ змiнноСЧ усi коефiцiСФнти обмежень - нулi}{то змiнна зовсiм незалежна:}

{РЖ якщо в рядку функцiСЧ мети теж нуль, то:}Self. CurTable [Length(Self. CurHeadCol) - 1, CurColNum]=0 then{хоч змiнна й незалежна, вiд неСЧ теж нiчого тут не залежить:}Self. CurOutConsole<>Nil then:=sc_CurProcName+sc_FreeVar;Self. CurHeadRow[CurColNum].ElmType=bc_Number then:=st1+sc_Space+(Self. CurHeadRow[CurColNum].AsNumber)st1:=st1+sc_Space+sc_DoubleQuot+. CurHeadRow[CurColNum].AsVarName+sc_DoubleQuot;

. CurOutConsole. Lines. Add(st1);;

(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{ВидаляСФмо стовпець цiСФСЧ змiнноСЧ:}(Self. CurHeadRow, CurColNum, 1);(Self. CurTable, CurColNum, 1);:=True;

:=False;AllExcluded:=False; {не усi вiльнi вдалося виключити};AllExcluded:=False; {не усi вiльнi вдалося виключити};

Not(ColDeleted) then Inc(CurColNum);; {While (CurColNum<(Length (Self. CurHeadRow) - 1)) doтАж}AllExcluded or WasNothingToDo;

Not(AllExcluded) thenSelf. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_CantExcludeFreeVars);. WriteTableToGrid (HeadColNum, HeadRowNum, True);:=True; Exit;;

{ПеремiщаСФмо рядки з усiма незалежними змiнними вгору:}:=Self. ShiftRowsUp([bc_IndependentVar], False);

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_AllFreeVarsExcluded);

{ХоваСФмо розв'язувальну комiрку у екраннiй таблицi:}. CurGridSolveCol:=0; Self. CurGridSolveRow:=0;

(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{Якщо усi рядки СФ рядками незалежних змiнних, то номер найвищого рядка

iншого типу вважаСФмо нижче таблицi (бо нема таких рядкiв):}HiNoIndepRow<0 then HiNoIndepRow:=Length (Self. CurHeadCol);

{Якщо пiсля виключення незалежних змiнних не залишилося рядкiв, окрiм

рядка функцiСЧ:}HiNoIndepRow>=(Length (Self. CurHeadCol) - 1) thenSelf. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_NoTableAreaToWork);;

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_ExcludingZeroRows);

{############## ВиключаСФмо 0-рядки. ШукаСФмо СЧх: ##############}:=HiNoIndepRow;CurRowNum<=(Length (Self. CurHeadCol) - 2) do:=False;Self. CurHeadCol[CurRowNum].ElmType=bc_Number thenSelf. CurHeadCol[CurRowNum].AsNumber=0 then {якщо знайшли 0-рядок:}{Для помiтки 0-рядка на екраннiй таблицi:}. CurGridSolveCol:=HeadColNum;. CurGridSolveRow:=CurRowNum+HeadRowNum+bc_LTaskRowsBeforeVars;

(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{ПеревiряСФмо вiльний член рядка, чи вiн невiд'СФмний.

Якщо вiд'СФмний, то множимо обидвi частини рiвняння на -1:}CurTable [CurRowNum, Length (Self. CurHeadRow) - 1]<0 then(CurRowNum);

{ШукаСФмо у рядку перший додатний коефiцiСФнт:}CurColNum:=0 to Length (Self. CurHeadRow) - 2 doCurTable [CurRowNum, CurColNum]>0 then Break;

CurColNum>(Length (Self. CurHeadRow) - 2) then {Якщо усi недодатнi:}CurTable [CurRowNum, Length (Self. CurHeadRow) - 1]=0 then{Якщо вiльний член рiвний нулю, то помножимо рiвняння на -1:}(CurRowNum);

{ШукаСФмо у рядку перший додатний коефiцiСФнт:}CurColNum:=0 to Length (Self. CurHeadRow) - 2 doCurTable [CurRowNum, CurColNum]>0 then Break;

{Якщо знову додатних нема, значить усi нулi. ВидаляСФмо рядок:}CurColNum>(Length (Self. CurHeadRow) - 2) thenSelf. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_AllZeroInRow+_Space+IntToStr (CurRowNum+1));

(CurTable, CurRowNum, 1);(Self. CurHeadCol, CurRowNum, 1);. Continue; {переходимо одразу до наступного рядка};{Якщо вiльний член додатнiй, а коефiцiСФнти недодатнi, то

система несумiсна:}Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_DoubleSpot+_Space+sc_NoVals);

. WasNoRoots:=True;. WriteTableToGrid (HeadColNum, HeadRowNum, True);:=True; Exit;;;

{Якщо додатний коефiцiСФнт у 0-рядку обрано, шукаСФмо МНВ

(мiнiмальне невiд'СФмне серед вiдношень вiльних членiв до членiв

стовпця, у якому обрали цей коефiцiСФнт):}(CurColNum, HiNoIndepRow, Length (Self. CurHeadCol) - 2,N, False);CurRow2N<0 then {Якщо МНВ не знайдено:}. WriteTableToGrid (HeadColNum, HeadRowNum, True);:=False; Exit;;

{Якщо МНВ знайдено:}. CurGridSolveCol:=CurColNum + HeadColNum+bc_LTaskColsBeforeVars;. CurGridSolveRow:=CurRow2N + HeadRowNum+bc_LTaskRowsBeforeVars;(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{ОбробляСФмо таблицю модифiкованим Жордановим виключенням:}Not (Self.GI (CurColNum, CurRow2N, Self. CurHeadRow,. CurHeadCol, Self. CurTable, ColDeleted, True,)) then:=False; Exit;;

CurRow2N<>CurRowNum then {Якщо виключили не цей 0-рядок:}. Continue; {продовжуСФмо працювати з цим рядком}; {If Self. CurHeadCol[CurRowNum].AsNumber=0 thenтАж}; {If Self. CurHeadCol[CurRowNum].ElmType=bc_Number thenтАж}Not(RowDeleted) then Inc(CurRowNum);; {While CurRowNum<=(Length (Self. CurHeadCol) - 2) doтАж}

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_AllZeroRowsExcluded);

{ХоваСФмо розв'язувальну комiрку у екраннiй таблицi:}. CurGridSolveCol:=0; Self. CurGridSolveRow:=0;(HeadColNum, HeadRowNum); {вiдмiчаСФмо новий крок}Self. Stop then Goto LStopLabel;

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_SearchingBaseSolve);

{############## ШукаСФмо опорний розв'язок задачi: ##############}:=HiNoIndepRow;CurRowNum<=(Length (Self. CurHeadCol) - 2) do

{Якщо знайшли вiд'СФмний елемент у стовпцi вiльних членiв:}Self. CurTable [CurRowNum, Length (Self. CurHeadRow) - 1]<0 then

{Для помiтки поточного рядка на екраннiй таблицi:}. CurGridSolveCol:=HeadColNum;. CurGridSolveRow:=CurRowNum+HeadRowNum+bc_LTaskRowsBeforeVars;

(HeadColNum, HeadRowNum);Self. Stop then Goto LStopLabel;

{ШукаСФмо у рядку перший вiд'СФмний коефiцiСФнт:}CurColNum:=0 to Length (Self. CurHeadRow) - 2 doCurTable [CurRowNum, CurColNum]<0 then Break;

CurColNum>(Length (Self. CurHeadRow) - 2) then {Якщо усi невiд'СФмнi:}

{Якщо вiльний член вiд'СФмний, а коефiцiСФнт