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

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

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



;

{Заповнення у комiрки рядка-заголовка числом:}FillHRowWithNum (SCol: Integer; Const SNumber:TWorkFloat);. CurHeadRow[SCol].VarInitPos:=SCol;. CurHeadRow[SCol].VarInitInRow:=True;. CurHeadRow[SCol].ElmType:=bc_Number;. CurHeadRow[SCol].AsNumber:=SNumber;;

{Заповнення iмен функцiй - iмен змiнних двоСЧстоСЧ задачi у стовпцi-заголовку:}FillHColFuncName (SRow: Integer);. CurHeadCol[SRow].VarInitPos:=SRow;. CurHeadCol[SRow].VarInitInRow:=False;. CurHeadCol[SRow].ElmType:=bc_FuncVal;. CurHeadCol[SRow].AsVarName:=sc_Minus+sc_DualTaskVarNameStart+(SRow+1);;

{Заповнення iменi функцiСЧ мети:}FillHColDFuncName (SRow: Integer);. CurHeadCol[SRow].VarInitPos:=SRow;. CurHeadCol[SRow].VarInitInRow:=False;. CurHeadCol[SRow].ElmType:=bc_DestFuncToMax;. CurHeadCol[SRow].AsVarName:=sc_DestFuncHdr;;LStopLabel;:=Length(SOptimFuncVals);

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

{Таблиця мiр неоптимальностi квадратна: кiлькiсть стовпцiв рiвна

кiлькостi функцiй мети; кiлькiсть рядкiв рiвна кiлькостi оптимальних

векторiв значень змiнних для кожноСЧ з цих функцiй (тобто тiй же самiй

кiлькостi). Додатково видiлимо один стовпець для вiльних членiв

i один рядок для коефiцiСФнтiв функцiСЧ мети задачi-iнтерпретацiСЧ

гри двох гравцiв з нульовою сумою, що буде сформована далi:}(Self. CurTable, FuncCount + 1, FuncCount + 1);

{Вiдповiдну довжину задаСФмо i заголовкам таблицi:}(Self. CurHeadCol, FuncCount + 1);(Self. CurHeadRow, FuncCount + 1);

{ПiдраховуСФмо мiри неоптимальностi векторiв значень змiнних для

кожноСЧ функцiСЧ мети, i записуСФмо СЧх у таблицю коефiцiСФнтiв -

формуСФмо матрицю неоптимальностi:}

{ШукаСФмо мiнiмальну (найбiльшу за модулем) мiру неоптимальностi.

Спочатку за неСЧ беремо мiру у верхньому лiвому кутi матрицi:}:=CalcQ (SFirstDFuncRow, SOptimXVecs[0], SOptimFuncVals[0]);. CurTable [0, 0]:=MinQ; {записуСФмо одразу цю мiру в матрицю}jCol:=0 to FuncCount-1 do:=SFirstDFuncRow+jCol;

{Комiрка [0, 0] вже порахована, СЧСЧ обходимо. Для всiх iнших виконуСФмо:}iRow:=Ord (jCol=0) to FuncCount-1 do {Ord (0=0)=1; Ord (CurQ then MinQ:=CurQ; {шукаСФмо найбiльшу за модулем мiру}. CurTable [iRow, jCol]:=CurQ; {записуСФмо мiру в матрицю неоптимальностi};;

:=-MinQ; {найбiльше абсолютне значення (модуль) усiх мiр в матрицi}

{ЗаповнюСФмо заголовки таблицi (це будуть заголовки задачi ЛП):}jCol:=0 to FuncCount-1 do FillHRowVarName(jCol);iRow:=0 to FuncCount-1 do FillHColFuncName(iRow);(FuncCount, 1);(FuncCount);

{КоефiцiСФнти функцiСЧ мети: усi однаковi i рiвнi одиницi (бо

вiдхилення чи наближення будь-якоСЧ з цiльових функцiй вiд свого

оптимального значення пропорцiйно (у вiдсотках) маСФ однакову цiну):}jCol:=0 to FuncCount-1 do Self. CurTable [FuncCount, jCol]:=1;

{Вiльнi члени: усi рiвнi одиницi:}iRow:=0 to FuncCount-1 do Self. CurTable [iRow, FuncCount]:=1;

{Комiрка значення функцiСЧ мети:}. CurTable [FuncCount, FuncCount]:=0;

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

{Якщо MinQ=0, то усi мiри рiвнi нулю (бо MinQ тут насправдi СФ

максимальним абсолютним значенням). Якщо кiлькiсть функцiй мети

багатокритерiальноСЧ задачi рiвна однiй (тобто задача однокритерiальна),

то i мiра СФ лише одна, i для неСЧ MinQ=-q [0,0], тому при додаваннi[0,0]+MinQ=q [0,0] - q [0,0]=0.

Щоб в обох цих випадках розв'язування симплекс-методом працювало

коректно, замiнимо MinQ на iнше число:}MinQ=0 thenSelf. CurOutConsoleNil then. CurOutConsole. Lines. Add (sc_CurProcName+sc_UniqueMeasureCantSetZero);:=MinQ+1; {збiльшимо на 1 - отримаСФмо матрицю з одною одиницею.};

{ДодаСФмо до усiх мiр неоптимальностi максимальну за модулем, i

отримуСФмо матрицю коефiцiСФнтiв, до якоСЧ можна застосувати

симплекс-метод:}iRow:=0 to FuncCount-1 dojCol:=0 to FuncCount-1 do. CurTable [iRow, jCol]:=Self. CurTable [iRow, jCol]+MinQ;

:;

TGridFormattingProcs. CalcComprVec (Const SVarVecs:TFloatMatrix;SWeightCoefs:TFloatArr; Var DComprVec:TFloatArr);

{ОбчислюСФ компромiсний вектор (масив) значень змiнних iз

iз заданих векторiв значень i вагових коефiцiСФнтiв для кожного iз

цих векторiв.

Вхiднi данi:- вектори значень змiнних;- ваговi коефiцiСФнти для кожного вектора.

Вихiднi данi:- компромiсний вектор значень змiнних.}VecNum, VarNum: Integer; CurComprVal:TWorkFloat;:=Nil;Length(SVarVecs)<=0 then Exit;(DComprVec, Length (SVarVecs[0]));

VarNum:=0 to Length(DComprVec) - 1 do {для кожноСЧ змiнноСЧ:}:=0;

{Множимо значення змiнноСЧ з кожного вектора на свiй ваговий

коефiцiСФнт, i знаходимо суму:}VecNum:=0 to Length(SVarVecs) - 1 do:=CurComprVal + SVarVecs [VecNum, VarNum]*SWeightCoefs[VecNum];

[VarNum]:=CurComprVal;;;

TGridFormattingProcs. CalcDFuncVal (Const SVarVec:TFloatArr;: Integer):TWorkFloat;

{ОбчислюСФ значення функцiСЧ мети за заданих значень змiнних.

Вхiднi данi:- вектор значень змiнних (в такому порядку, в якому змiннi

йдуть в рядку-заголовку умови багатокритерiальноСЧ задачi);- номер рядка функцiСЧ мети в умовi задачi у. CopyTable;. CopyTable - матриця коефiцiСФнтiв умови

багатокритерiальноСЧ лiнiйноСЧ задачi оптимiзацiСЧ.

Вихiднi данi:

ПовертаСФ значення функцiСЧ мети.}VarNum: Integer; FuncVal:TWorkFloat;:=0;VarNum:=0 to Length(SVarVec) - 1 do {для кожноСЧ змiнноСЧ:}:=FuncVal + SVarVec[VarNum]*Self. CopyTable [SDestFuncRowNum, VarNum];;:=FuncVal;;

TGridFormattingProcs. SolveMultiCritLTask: Boolean;

{Вирiшування задачi багатокритерiальноСЧ оптимiзацiСЧ лiнiйноСЧ форми

з використанням теоретико-iгрового пiдходу.

Умовою задачi СФ умови-нерiвностi, рiвняння та умови на невiд'СФмнiсть

окремих змiнних, i декiлька функцiй мети, для яких треба знайти

якомога бiльшi чи меншi значення.

Вхiднi данi:. CurTable - таблиця коефiцiСФнтiв та вiльних членiв;. CurHeadRow - рядок-заголовок зi змiнними та одиницею-множником

стовпця вiльних членiв (маСФ бути останнiм);. CurHeadCol - стовпець-заголовок з i