![]() |
|
|
Курсовая работа: Багатокритеріальна задача лінійного програмуванняEnd; End Else if Self. CurGridSolveCol=-bc_LTaskColsBeforeVars then Begin {якщо це комірка стовпця-заголовка:} If Length (Self. CurHeadCol)>Self. CurGridSolveRow then {якщо комірка існує:} Begin {задаємо тип комірки:} Self. CurHeadCol [Self. CurGridSolveRow].ElmType:=TypeForCell; End Else {якщо в стовпці-заголовку немає такої комірки:} Begin ReportUnsupportedCell; Exit; End; End Else {якщо комірка у таблиці коефіцієнтів або правіше чи нижче неї:} Begin ReportUnsupportedCell; Exit; End; {Якщо тип комірки змінено, то перемальовуємо екранну таблицю для відображення нового типу комірки:} If Self. CurGrid<>Nil then Self. CurGrid. Invalidate; End; Procedure TGridFormattingProcs. AddCellTypeItemToMenu (SMenu:TPopupMenu; SCaption: String; IsCurrentItem: Boolean; SAssocType:THeadLineElmType; ToSetReactOnClick: Boolean=True); {Додає пункт меню для вибору типу комірки в таблиці з заданим написом SCaption і кругом того кольору, що асоційований з даним типом SAssocType. Для нового пункту меню настроює виклик процедури обробки комірки для задавання їй обраного типу SAssocType. Значення SAssocType записує у поле Tag об'єкта пункту меню. Вхідні дані: SMenu – контекстне меню для комірки, що формується; SCaption – підпис для пункту меню (назва типу комірки); IsCurrentItem – ознака того, що даний пункт меню має бути поточним (ввімкненим, відміченим) – що це поточний тип комірки; SAssocType – тип комірки, що прив'язаний до цього пункта меню, і буде присвоєний комірці при виборі цього пункту; ToSetReactOnClick – вмикач настройки виклику процедури задавання нового типу комірки (при виборі елемента меню). При ToSetReactOnClick=False це не виконується, і натискання елемента меню не викликає ніяких дій.} Var CurMenuItem:TMenuItem; SAssocColor:TColor; Begin If SMenu=Nil then Exit; {якщо меню не задано – елемент не додаємо в нього} {Створюємо новий тункт меню:} CurMenuItem:=TMenuItem. Create(Application); {Отримуємо колір для даного типу комірки:} SAssocColor:=Self. GetColorByElmType(SAssocType); {Біля тексту малюємо круг такого кольору, який асоційований з типом комірки, і буде присвоєний їй у разі вибору цього пунтку меню:} CurMenuItem. Bitmap. Height:=bc_MenuItemColorCircleDiameter; CurMenuItem. Bitmap. Width:=bc_MenuItemColorCircleDiameter; CurMenuItem. Bitmap. Canvas. Pen. Color:=SAssocColor; CurMenuItem. Bitmap. Canvas. Brush. Color:=SAssocColor; CurMenuItem. Bitmap. Canvas. Ellipse (CurMenuItem. Bitmap. Canvas. ClipRect); {0 – картинка задана у самому об'єкті, а не в SMenu. Images:} CurMenuItem. ImageIndex:=0; CurMenuItem. RadioItem:=True; {промальовувати перемикач, якщо не буде картинки} {Текст пункту меню:} CurMenuItem. Caption:=SCaption; CurMenuItem. Checked:=IsCurrentItem; If ToSetReactOnClick then {якщо обробка вибору елемента меню ввімкнена} Begin {Тип для комірки у випадку вибору цього пунтку меню:} CurMenuItem. Tag:=Integer(SAssocType); {Процедура-обробник вибору пункта меню:} CurMenuItem. OnClick:=Self. ProcOnCellTypeSelInMenu; CurMenuItem. AutoCheck:=True; End; SMenu. Items. Add(CurMenuItem); End; (* {Ідентифікатор для типу елемента масиву чисел та імен змінних. Типи змінних: залежні, незалежні, функції (умови-нерівності). Залежні змінні – це змінні, для яких діє умова невід'ємності:} THeadLineElmType=(bc_IndependentVar, bc_DependentVar, bc_FuncVal, bc_Number, bc_DestFuncToMax);} *) procedure TGridFormattingProcs. EdLineTaskOnMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); {Процедура реагує на відпускання правої кнопки миші на комірках рядка-заголовка та стовпця-заголовка таблиці. Формує та відкриває контекстне меню для вибору типу комірки із можливих типів для цієї комірки.} Const sc_CurProcName='EdLineTaskOnMouseUp'; Var CurCol, CurRow, ArrayRow, ArrayCol: Integer; CurElmType:THeadLineElmType; MouseScrCoords:TPoint; Begin {Якщо до вмикання форматування був якийсь обробник події, запускаємо його:} If @Self. OldOnMouseUp<>Nil then Self. OldOnMouseUp (Sender, Button, Shift, X, Y); If Sender=Nil then Exit; {Якщо задано екранну таблицю даного об'єкта TGridFormattingProcs:} If Sender = Self. CurGrid then Begin If Button=mbRight then {якщо була відпущена права кнопка миші} Begin {Пробуємо узнати, на яку комірку натиснула миша:} CurCol:=-1; CurRow:=-1; Self. CurGrid. MouseToCell (X, Y, CurCol, CurRow); MouseScrCoords:=Self. CurGrid. ClientToScreen (Point(X, Y)); {Координати комірки у масивах таблиці і її заголовків:} ArrayRow:=CurRow-Self.CHeadRowNum-bc_LTaskRowsBeforeVars; ArrayCol:=CurCol-Self.CHeadColNum-bc_LTaskColsBeforeVars; {Якщо натиснуто на комірку рядка-заголовка:} If (CurRow=Self.CHeadRowNum) and (ArrayCol>=0) and (ArrayCol<Length (Self. CurHeadRow)) then Begin {очищаємо меню перед заповненням:} Self. InitGridPopupMenu (Self. CurGrid); {Якщо в екранній таблиці були зміни з часу останнього її читання, то читаємо комірку, для якої треба сформувати меню:} If Self. CurGridModified then Self. ReadHeadRowCell(ArrayCol); {Читаємо поточний тип комірки:} CurElmType:=Self. CurHeadRow[ArrayCol].ElmType; {Додаємо пункти меню:} {Якщо в комірці число-то тип комірки може бути тільки числовий:} If CurElmType=bc_Number then Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_ValInHeadColOrRow, True, CurElmType) Else {якщо в комірці не число:} Begin {незалежна змінна:} Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_IndependentVar, CurElmType = bc_IndependentVar, bc_IndependentVar); {залежна змінна:} Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_DependentVar, CurElmType = bc_DependentVar, bc_DependentVar); End; End Else If (CurCol=Self.CHeadColNum) and (ArrayRow>=0) and (ArrayRow<Length (Self. CurHeadCol)) then Begin {якщо натиснуто на комірку стовпця-заголовка:} Self. InitGridPopupMenu (Self. CurGrid); {Якщо в екранній таблиці були зміни з часу останнього її читання, то читаємо комірку, для якої треба сформувати меню:} If Self. CurGridModified then Self. ReadHeadColCell(ArrayRow); {Читаємо поточний тип комірки:} CurElmType:=Self. CurHeadCol[ArrayRow].ElmType; {Додаємо пункти меню:} {Якщо в комірці число-то тип комірки може бути тільки числовий:} If CurElmType=bc_Number then Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_ValInHeadColOrRow, True, CurElmType) Else {якщо в комірці не число:} Begin {назва фінкції – рядка нерівності:} Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_InequalFuncName, CurElmType = bc_FuncVal, bc_FuncVal); {назва функції мети, що максимізується:} Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_DestFuncToMaxName, CurElmType = bc_DestFuncToMax, bc_DestFuncToMax); {назва функції мети, що мінімізується:} Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_DestFuncToMinName, CurElmType = bc_DestFuncToMin, bc_DestFuncToMin); End; End Else {якщо для даної комірки вибір типу не передбачено} Begin {ставимо в меню координати комірки (щоб користувач взагалі помітив, що меню є…)} Self. InitGridPopupMenu (Self. CurGrid); Self. AddCellTypeItemToMenu (Self. CurGrid. PopupMenu, sc_Row+sc_DoubleSpot+sc_Space+IntToStr (ArrayRow+1)+sc_KrKm+ sc_Space+sc_Col+sc_DoubleSpot+sc_Space+IntToStr (ArrayCol+1), True, bc_OtherType); End; {Записуємо координати комірки для обробника вибору типу з меню:} Self. CurGridSolveCol:=ArrayCol; Self. CurGridSolveRow:=ArrayRow; {Відображаємо меню:} Self. CurGrid. PopupMenu. Popup (MouseScrCoords.X, MouseScrCoords.Y); End; {If Button=mbRight then…} End {If Sender = Self. CurGrid then…} Else {якщо обробник викликала «чужа» таблиця або невідомий об'єкт:} Begin If Self. CurOutConsole<>Nil then Self. CurOutConsole. Lines. Add (sc_CurProcName+sc_UnknownObjectCall+ sc_DoubleQuot+Sender. ClassName+sc_DoubleQuot); End; End; procedure TGridFormattingProcs. ReactOnSetEditText (Sender: TObject; ACol, ARow: Longint; const Value: string); {Процедура для реагування на редагування вмісту комірок під час редагування вхідних даних. Встановлює прапорець CurGridModified:=True про те, що екранна таблиця має зміни.} Begin {Старий обробник теж викликаємо, якщо він є:} If @Self. OldOnSetEditText<>Nil then Self. OldOnSetEditText (Sender, ACol, ARow, Value); Self. CurGridModified:=True; End; Procedure TGridFormattingProcs. SetNewState (Value:TTableFormatState); Const sc_CurProcName='SetNewState'; Var StateSafe:TTableFormatState; OldHColPos, OldHRowPos: Integer; {Процедура для зміни режиму форматування GrowingStringGrid} Procedure GoSolveLTask; Begin {Вирішування задачі ЛП симплекс-методом:} CurGrid. ColCount:=bc_FixedCols+1; CurGrid. RowCount:=bc_FixedRows+1; CurGrid. FixedRows:=bc_FixedRows; CurGrid. FixedCols:=bc_FixedCols; If Not (Self. PrepareToSolveLTask) then Begin {Якщо не вдається підготувати таблицю до вирішування задачі:} StateSafe:=Self. CurFormatState; {Перемикаємо на режим fs_NoFormatting, і назад у поточний, щоб встановити усі настройки цього режиму (повернутися до них):} Self. TableFormatState:=fs_NoFormatting; Self. TableFormatState:=StateSafe; Exit; End; CurGrid. OnNewCol:=NumerationOnNewCol; CurGrid. OnNewRow:=NumerationOnNewRow; CurGrid. OnDrawCell:=EdLineTaskOnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; CurGrid. OnSetEditText:=OldOnSetEditText; {Вимикаємо редагування екранної таблиці:} CurGrid. Options:=CurGrid. Options – [goEditing]; End; Begin If InSolving then Begin If Self. CurOutConsole<>Nil then Self. CurOutConsole. Lines. Add (sc_CurProcName+sc_CantChangeStateInSolving); Exit; End; If Self. CurGrid=Nil then {Якщо екранну таблицю не задано:} Begin {запам'ятовуємо поточний режим, і більше нічого не робимо тут:} Self. CurFormatState:=Value; Exit; End; {Якщо задано новий режим:} If Self. CurFormatState<>Value then Begin {Якщо форматування було вимкнене:} If Self. CurFormatState=fs_NoFormatting then Begin {Запам'ятовуємо обробники подій, які замінимо на свої форматувальники:} OldOnNewCol:=CurGrid. OnNewCol; OldOnNewRow:=CurGrid. OnNewRow; OldOnDrawCell:=CurGrid. OnDrawCell; OldOnDblClick:=CurGrid. OnDblClick; OldOnSetEditText:=CurGrid. OnSetEditText; OldOnMouseUp:=CurGrid. OnMouseUp; End; {Якщо таблиця редагована, то приймаємо останні зміни перед зміною режиму:} If Self. CurGridModified then Self. Refresh; Case Value of fs_EnteringEqs: {редагування таблиці системи лінійних рівнянь:} Begin {Встановлюємо потрібну кількість рядків і стовпців екранної таблиці для фіксованих заголовків («тільки для читання»). Для цього забезпечуємо щоб кількість рядків і стовпців не була меншою за потрібну кількість фіксованих, плюс хоч один стовпець / рядок (хоч одна комірка) для редагування:} If CurGrid. ColCount<bc_FixedCols+1 then CurGrid. ColCount:=bc_FixedCols+1; If CurGrid. RowCount<bc_FixedRows+1 then CurGrid. RowCount:=bc_FixedRows+1; CurGrid. FixedRows:=bc_FixedRows; CurGrid. FixedCols:=bc_FixedCols; {Позиціювання таблиці до зміни режиму:} OldHColPos:=Self.CHeadColNum; OldHRowPos:=Self.CHeadRowNum; {Позиціювання відображення таблиці у даному режимі редагування:} Self.CHeadColNum:=CurGrid. FixedCols-1; Self.CHeadRowNum:=CurGrid. FixedRows-1; {Якщо позиціювання змінилося, то відображаємо таблицю в новому місці:} If (OldHColPos<>Self.CHeadColNum) or (OldHRowPos<>Self.CHeadRowNum) then Self. Refresh; CurGrid. OnNewCol:=EditLineEqsOnNewCol; CurGrid. OnNewRow:=EditLineEqsOnNewRow; CurGrid. OnDrawCell:=EditLineEqsOnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; {Вмикаємо можливість редагування:} CurGrid. Options:=CurGrid. Options+[goEditing]; CurGrid. OnSetEditText:=ReactOnSetEditText; InSolving:=False; End; fs_EnteringLTask: Begin {Редагування таблиці задачі ЛП (максимізації/мінімізації):} {Встановлюємо потрібну кількість рядків і стовпців екранної таблиці для фіксованих заголовків («тільки для читання»). Для цього забезпечуємо щоб кількість рядків і стовпців не була меншою за потрібну кількість фіксованих, плюс хоч один стовпець / рядок (хоч одна комірка) для редагування:} If CurGrid. ColCount<bc_FixedCols+1 then CurGrid. ColCount:=bc_FixedCols+1; If CurGrid. RowCount<bc_FixedRows+1 then CurGrid. RowCount:=bc_FixedRows+1; CurGrid. FixedRows:=bc_FixedRows; CurGrid. FixedCols:=bc_FixedCols; {Позиціювання таблиці до зміни режиму:} OldHColPos:=Self.CHeadColNum; OldHRowPos:=Self.CHeadRowNum; {Позиціювання відображення таблиці у даному режимі редагування:} Self.CHeadColNum:=CurGrid. FixedCols-1 + bc_LTaskColsBeforeVars; Self.CHeadRowNum:=CurGrid. FixedRows-1; {Якщо позиціювання змінилося, то відображаємо таблицю в новому місці:} If (OldHColPos<>Self.CHeadColNum) or (OldHRowPos<>Self.CHeadRowNum) then Self. Refresh; CurGrid. OnNewCol:=EdLineTaskOnNewCol; CurGrid. OnNewRow:=EdLineTaskOnNewRow; CurGrid. OnDrawCell:=EdLineTaskOnDrawCell; CurGrid. OnDblClick:=EdLineTaskOnDblClick; CurGrid. OnMouseUp:=EdLineTaskOnMouseUp; {Вмикаємо можливість редагування:} CurGrid. Options:=CurGrid. Options+[goEditing]; CurGrid. OnSetEditText:=ReactOnSetEditText; InSolving:=False; End; fs_SolvingEqsM1: {вирішування системи лінійних рівнянь способом 1:} Begin CurGrid. ColCount:=bc_FixedCols+1; CurGrid. RowCount:=bc_FixedRows+1; CurGrid. FixedRows:=bc_FixedRows; CurGrid. FixedCols:=bc_FixedCols; {Пробуємо підготувати таблицю до вирішування. Якщо не вдається, то залишаємось у режимі, який був до спроби його змінити:} If Not (Self. PrepareToSolveEqsWithM1) then Begin StateSafe:=Self. CurFormatState; {Перемикаємо на режим fs_NoFormatting, і назад у поточний, щоб встановити усі настройки цього режиму:} Self. TableFormatState:=fs_NoFormatting; Self. TableFormatState:=StateSafe; Exit; End; CurGrid. OnNewCol:=NumerationOnNewCol; CurGrid. OnNewRow:=NumerationOnNewRow; CurGrid. OnDrawCell:=SolveLineEqsM1OrM2OnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; {Вимикаємо редагування екранної таблиці:} CurGrid. Options:=CurGrid. Options – [goEditing]; CurGrid. OnSetEditText:=OldOnSetEditText; End; fs_SolvingEqsM2: {вирішування системи лінійних рівнянь способом 2:} Begin CurGrid. ColCount:=bc_FixedCols+1; CurGrid. RowCount:=bc_FixedRows+1; CurGrid. FixedRows:=bc_FixedRows; CurGrid. FixedCols:=bc_FixedCols; {Пробуємо підготувати таблицю до вирішування. Якщо не вдається, то залишаємось у режимі, який був до спроби його змінити:} If Not (Self. PrepareToSolveEqsWithM2) then Begin StateSafe:=Self. CurFormatState; {Перемикаємо на режим fs_NoFormatting, і назад у поточний, щоб встановити усі настройки цього режиму:} Self. TableFormatState:=fs_NoFormatting; Self. TableFormatState:=StateSafe; Exit; End; CurGrid. OnNewCol:=NumerationOnNewCol; CurGrid. OnNewRow:=NumerationOnNewRow; CurGrid. OnDrawCell:=SolveLineEqsM1OrM2OnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; CurGrid. OnSetEditText:=OldOnSetEditText; {Вимикаємо редагування екранної таблиці:} CurGrid. Options:=CurGrid. Options – [goEditing]; End; fs_SolvingLTask: GoSolveLTask; fs_FreeEdit: {Режим вільного редагування таблиці:} Begin CurGrid. OnNewCol:=OldOnNewCol; CurGrid. OnNewRow:=OldOnNewRow; CurGrid. OnDrawCell:=OldOnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; {Вмикаємо редагування екранної таблиці:} CurGrid. Options:=CurGrid. Options+[goEditing]; {Вмикаємо стеження за змінами в екнанній таблиці:} CurGrid. OnSetEditText:=ReactOnSetEditText; InSolving:=False; End; Else {Без форматування (fs_NoFormatting), або невідомий режим:} Begin CurGrid. OnNewCol:=OldOnNewCol; CurGrid. OnNewRow:=OldOnNewRow; CurGrid. OnDrawCell:=OldOnDrawCell; CurGrid. OnDblClick:=OldOnDblClick; CurGrid. OnMouseUp:=OldOnMouseUp; CurGrid. OnSetEditText:=OldOnSetEditText; InSolving:=False; End; End; CurGrid. Invalidate; {перемальовуємо таблицю з новими форматувальниками} Self. CurFormatState:=Value; {запам'ятовуємо новий режим форматування} End; End; Procedure TGridFormattingProcs. SetNewGrid (Value:TGrowingStringGrid); Var SafeFormatState:TTableFormatState; Begin If Self. CurGrid<>Value then {якщо задано новий об'єкт таблиці:} Begin SafeFormatState:=Self. TableFormatState; {Знімаємо усі процедури-форматувальники, перемальовуємо таблицю (якщо вона була) перед заміною її на задану:} Self. TableFormatState:=fs_NoFormatting; Self. CurGrid:=Value; {запам'ятовуємо вказівник на новий об'єкт таблиці} {Застосовуємо форматування для нової таблиці (якщо вона не відсутня, вказівник на неї не рівний Nil):} Self. TableFormatState:=SafeFormatState; Self. Refresh; End; End; Procedure TGridFormattingProcs. SetHeadColNum (Value: Integer); Begin If Self. CurFormatState=fs_FreeEdit then Begin If Value<0 then Value:=0; Self.CHeadColNum:=Value; End; End; Procedure TGridFormattingProcs. SetHeadRowNum (Value: Integer); Begin If Self. CurFormatState=fs_FreeEdit then Begin If Value<0 then Value:=0; Self.CHeadRowNum:=Value; End; End; Procedure TGridFormattingProcs. SetNewMemo (Value:TMemo); Begin If Self. CurOutConsole<>Nil then Self. CurOutConsole. Lines. Add (Self. ClassName+': повідомлення вимкнені.'); Self. CurOutConsole:=Value; If Self. CurOutConsole<>Nil then Self. CurOutConsole. Lines. Add (Self. ClassName+': повідомлення ввімкнені.'); End; end. лінійний програмування компромісний розв'язок Хоч кожній залежній змінній одної задачі відповідає функція-умова (нерівність) двоїстої, і кожній функції-умові відповідає залежна змінна, ці пари величин приймають різні значення у розв’язку пари задач. Компромісний розв’язок багатокритеріальної задачі ЛП зручно застосовувати для об’єктів управління з такими вихідними параметрами (функціями мети), які є практично рівноправними (мають однаковий пріоритет до оптимізації, або їх пріоритети складно оцінити). За допомогою нього можна отримати розв’язок з мінімальним сумарним програшем оптимізації параметрів. 1. Левин С.В., Александрова В.В.: «БАГАТОКРИТЕРІАЛЬНА ОПТИМІЗАЦІЯ З ВИКОРИСТАННЯМ ТЕОРЕТИКО-ІГРОВОГО ПІДХОДУ»: методичні вказівки до виконання курсової роботи з курсу «Математичні методи дослідження операцій» – Харків, Національний аерокосмічний університет ім. М.Є. Жуковського «Харківський авіаційний інститут», 2008 р. 2. Довідка з Borland Delphi 6. |
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |