Багатокритер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