Багатокритер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;
{Пошук ненульовоСЧ роз