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

{координати комірки мають бути записані у CurGridSolveRow і CurGridSolveCol:}Self. CurGridSolveRow=-bc_LTaskRowsBeforeVars then{якщо це комірка рядка-заголовка:}Length (Self. CurHeadRow)>Self. CurGridSolveCol then {якщо комірка

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

Дипломная работа

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

Другие дипломы по предмету

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

Сдать работу со 100% гаранией
тами (RozElmCol, RozElmRow). Окрім обробки матриці,

здійснюється заміна місцями елементів у рядку і стовпцю-заголовках

матриці (SDHeadRow, SDHeadCol).

 

Вхідні дані:- номер стовпця матриці, у якому лежить розв'язувальний елемент.

нумерація з нуля;- номер рядка матриці, у якому лежить розв'язувальний елемент.

нумерація з нуля.

Розв'язувальний елемент не повинен бути рівним нулю, інакше виконання

Жорданового виключення не можливе;, SDHeadCol - рядок і стовпець-заголовки матриці. Рядок-заголовокповинен мати не менше елементів, ніж є ширина матриці. Він

містить множники. Стовпець-заголовок SDHeadCol повинен бути не коротшим

за висоту матриці. Він містить праві частини рівнянь (чи нерівностей)

системи. Рівняння полягають у тому що значення елементів

стовпця-заголовка прирівнюються до суми добутків елементів відповідного

рядка матриці і елементів рядка-заголовка. Елементи у цих заголовках

можуть бути числами або рядками-іменами змінних. Якщо довжина

рядка-заголовка менша за ширину або стовпця-заголовка менша за висоту

матриці, то частина комірок матриці, що виходять за ці межі, буде

проігнорована;- матриця, у якій виконується Жорданове виключення;- прапорець, що вмикає режим модифікованого Жорданового виключення

(при ToDoMGI=True здійснюється модифіковане, інакше - звичайне).

Модифіковане Жорданове виключення використовується для матриці, у якій

було змінено знак початкових елементів, і змінено знаки елементів-

множників у рядку-заголовку. Використовується для симплекс-методу.- прапорець, що вмикає видалення стовпця матриці із

розв'язувальним елементом, якщо після здійснення жорданівського

виключення у рядок-заголовок зі стовпця-заголовка записується число нуль.

 

Вихідні дані:, SDHeadCol - змінені рядок та стовпець-заголовки. У них

міняються місцями елементи, що стоять навпроти розв'язувального елемента

(у його стовпці (для заголовка-рядка) і рядку (для заголовка-стовпця).

У заголовку-рядку такий елемент після цього може бути видалений, якщо

він рівний нулю і ToDelColIfZeroInHRow=True.

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

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

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

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

 

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

}

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

{Визначаємо кількість рядків і стовпців, які можна обробити:}:=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;

{Перевіряємо наявність розв'язуючого елемента у матриці (за координатами):}(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;;

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

неможливо:}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;;

 

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

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

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

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

 

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

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

 

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

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

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

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

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

 

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

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

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

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

:=False;

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

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

розв'язуючого елемента у матриці, то видаляємо:}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;

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

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

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

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

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

Вихідні дані:- таблиця;- стовпець-заголовок таблиці.}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;

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

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

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

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

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

Вихідні дані:- таблиця;- рядок-заголовок таблиці.}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);

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

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

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

виклику цієї процедури, то процедура не чекає встановлення прапорців.}

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

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

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

 

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

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

TGridFormattingProcs. SearchNozeroSolveCell (CurRowNum,, MaxRow, MaxCo

Похожие работы

<< < 1 2 3 4 5 6 7 8 9 > >>