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

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

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



eroInHRow=True.

Тобто Жорданове виключення змiнюСФ ролями цi елементи (виражаСФ один

через iнший у лiнiйних рiвняннях чи нерiвностях);- матриця пiсля виконання Жорданового виключення;- ознака того, що при виконаннi Жорданового виключення

був видалений розв'язувальний стовпець iз матрицi (у його комiрцi

у рядку-заголовку став був нуль).

Функцiя повертаСФ ознаку успiшностi виконання Жорданового виключення.

}

Var CurRow, CurCol, RowCount, ColCount: Integer;:TValOrName;:TWorkFloat;: String;

{ВизначаСФмо кiлькiсть рядкiв i стовпцiв, якi можна обробити:}:=Length(SDMatrix);RowCount<=0 then Begin GI:=False; Exit; End;:=Length (SDMatrix[0]);

Length(SDHeadCol)<RowCount then RowCount:=Length(SDHeadCol);Length(SDHeadRow)<ColCount then ColCount:=Length(SDHeadRow);

(RowCount<=0) or (ColCount<=0) then Begin GI:=False; Exit; End;

{ПеревiряСФмо наявнiсть розв'язуючого елемента у матрицi (за координатами):}(RozElmCol>(ColCount-1)) or (RozElmRow>(RowCount-1)) then:=sc_InvCoordsOfResolvingElm+': ['+IntToStr (RozElmCol+1)+';'+(RozElmRow+1)+']'+sc_CrLf+_MatrixSize+': ['+IntToStr(ColCount)+';'+IntToStr(RowCount)+']';

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add(CurMessage);

(CurMessage, mtError, [mbOk], 0);:=False; Exit;;

{Якщо розв'язуючий елемент рiвний нулю, то виконати Жорданове виключення

неможливо:}SDMatrix [RozElmRow, RozElmCol]=0 then:=sc_ZeroResolvingElm+': ['+IntToStr (RozElmCol+1)+';'+(RozElmRow+1)+']='+FloatToStr (SDMatrix[RozElmRow, RozElmCol]);

Self. CurOutConsole<>Nil then. CurOutConsole. Lines. Add(CurMessage);

(CurMessage, mtError, [mbOk], 0);:=False; Exit;;

{ВиконуСФмо Жорданове виключення у матрицi:}

{ОбробляСФмо усi елементи матрицi, що не належать до рядка i стовпця

розв'язуючого елемента:}CurRow:=0 to RowCount-1 doCurCol:=0 to ColCount-1 do(CurRowRozElmCol) then[CurRow, CurCol]:=

(SDMatrix [CurRow, CurCol]*SDMatrix [RozElmRow, RozElmCol] -[CurRow, RozElmCol]*SDMatrix [RozElmRow, CurCol]) /[RozElmRow, RozElmCol];;

{+1, якщо задано зробити звичайне Жорданове виключення;

- якщо задано модифiковане:}:=(1-2*Abs (Ord(ToDoMGI)));

{Елементи стовпця розв'язуючого елемента (окрiм його самого)

дiлимо на розв'язуючий елемент:}CurRow:=0 to RowCount-1 doCurRow<>RozElmRow then[CurRow, RozElmCol]:=MultiplierIfMGI*SDMatrix [CurRow, RozElmCol]/[RozElmRow, RozElmCol];

{Елементи рядка розв'язуючого елемента (окрiм його самого)

дiлимо на розв'язуючий елемент з протилежним знаком:}CurCol:=0 to ColCount-1 doCurCol<>RozElmCol then[RozElmRow, CurCol]:=-MultiplierIfMGI*SDMatrix [RozElmRow, CurCol]/[RozElmRow, RozElmCol];

{ЗамiняСФмо розв'язуючий елемент на обернене до нього число:}[RozElmRow, RozElmCol]:=1/SDMatrix [RozElmRow, RozElmCol];

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

стовпцi i рядку розв'язуючого елемента:}:= SDHeadRow[RozElmCol];[RozElmCol]:=SDHeadCol[RozElmRow];[RozElmRow]:=SafeHeadElm;

{Якщо виконуСФмо модиiвковане Жорданове виключення, то змiнюють

знаки i цi елементи, що помiнялись мiiями:}ToDoMGI then(SDHeadRow[RozElmCol]);(SDHeadCol[RozElmRow]);;

:=False;

{Якщо у рядку-заголовку навпроти розв'язуючого елемента опинився нуль,

i задано видаляти у такому випадку цей елемент разом iз стовпцем

розв'язуючого елемента у матрицi, то видаляСФмо:}ToDelColIfZeroInHRow and (SDHeadRow[RozElmCol].ElmType=bc_Number) thenSDHeadRow[RozElmCol].AsNumber=0 then(SDHeadRow, RozElmCol, 1);(SDMatrix, RozElmCol, 1);:=True;;

:=True;;

ChangeRowsPlaces (Var SDMatr:TFloatMatrix; Row1, Row2: Integer);;SafeCurRow:TFloatArr;:=SDMatr[Row1];[Row1]:=SDMatr[Row2];[Row2]:=SafeCurRow;;

ChangeRowsPlaces (Var SDMatr:TFloatMatrix; Var SDHeadCol:TValOrNameMas;, Row2: Integer; ToChangeInitPosNums: Boolean=False); overload;

{Процедура мiняСФ мiiями рядки у таблицi зi стовпцем-заголовком.

Вхiднi данi:- таблиця;- стовпець-заголовок таблицi;, Row2 - рядки, що треба помiняти мiiями;- вмикач змiни номерiв по порядку у

стовпцi-заголовку. Якщо рiвний True, то рядки, що помiнялися мiiями,

мiняються також i позначками про номер по порядку та розмiщення

як рядка чи стовпця (що присвоювалися СЧм при створеннi).

Вихiднi данi:- таблиця;- стовпець-заголовок таблицi.}SafeCurHeadCell:TValOrName;:=SDHeadCol[Row1];[Row1]:=SDHeadCol[Row2];[Row2]:=SafeCurHeadCell;

ToChangeInitPosNums then[Row2].VarInitPos:=SDHeadCol[Row1].VarInitPos;[Row2].VarInitInRow:=SDHeadCol[Row1].VarInitInRow;[Row1].VarInitPos:=SafeCurHeadCell. VarInitPos;[Row1].VarInitInRow:=SafeCurHeadCell. VarInitInRow;;

(SDMatr, Row1, Row2);;

ChangePlaces (Var SDMas:TFloatArr; Elm1, Elm2: Integer);SafeElm:TWorkFloat;:=SDMas[Elm1];[Elm1]:=SDMas[Elm2];[Elm2]:=SafeElm;;

ChangeColsPlaces (Var SDMatr:TFloatMatrix; Col1, Col2: Integer);;CurRow: Integer;CurRow:=0 to Length(SDMatr) - 1 do(SDMatr[CurRow], Col1, Col2);;

ChangeColsPlaces (Var SDMatr:TFloatMatrix; Var SDHeadRow:TValOrNameMas;, Col2: Integer; ToChangeInitPosNums: Boolean=False); overload;

{Процедура мiняСФ мiiями стовпцi у таблицi з рядком-заголовком.

Вхiднi данi:- таблиця;- рядок-заголовок таблицi;, Row2 - рядки, що треба помiняти мiiями;- вмикач змiни номерiв по порядку у

стовпцi-заголовку. Якщо рiвний True, то рядки, що помiнялися мiiями,

мiняються також i позначками про номер по порядку та розмiщення

як рядка чи стовпця (що присвоювалися СЧм при створеннi).

Вихiднi данi:- таблиця;- рядок-заголовок таблицi.}SafeCurHeadCell:TValOrName;:=SDHeadRow[Col1];[Col1]:=SDHeadRow[Col2];[Col2]:=SafeCurHeadCell;

ToChangeInitPosNums then[Col2].VarInitPos:=SDHeadRow[Col1].VarInitPos;[Col2].VarInitInRow:=SDHeadRow[Col1].VarInitInRow;[Col1].VarInitPos:=SafeCurHeadCell. VarInitPos;[Col1].VarInitInRow:=SafeCurHeadCell. VarInitInRow;;

(SDMatr, Col1, Col2);;

TGridFormattingProcs. WaitForNewStep (HeadColNum, HeadRowNum: Integer);

{ЗупиняСФ хiд вирiшування, вiдображаСФ поточний стан таблицi, i чекаСФ,

доки не буде встановлений один з прапорцiв:. Continue, Self. GoToEnd або Self. Stop.

Якщо прапорцi Self. GoToEnd або Self. Stop вже були встановленi до

виклику цiСФСЧ процедури, то процедура не чекаСФ встановлення прапорцiв.}

{Якщо процедуру викликали, то треба почекати, доки не встановиться. Continue=True, незважаючи на поточний стан цього прапорця:}. Continue:=False;

{ВiдображаСФмо поточний стан таблицi, якщо не ввiмкнено режим

роботи без зупинок:}Not (Self. GoToEnd) then. WriteTableToGrid (HeadColNum, HeadRowNum, True);

{ЧекаСФмо пiдтвердження для наступного кроку, або переривання

розв'язування:}Not (Self. Continue or Self. GoToEnd or Self. Stop) do. ProcessMessages;;

TGridFormattingProcs. SearchNozeroSolveCell (CurRowNum,, MaxRow, MaxCol: Integer;, HeadColNum: Integer;: Boolean=True):Boolean;

{Пошук ненульовоСЧ роз