Matlab中最差的方法(BWM)-Linprog

时间:2018-08-23 17:19:44

标签: matlab

我需要有关linprog问题的指导。我有一个优化问题,需要权重和目标函数的最小值,但我无法正确分配参数。问题的形式和主题是这样的。问题图已附上。

任何有关理解问题和获得解决方案的帮助将不胜感激。下图包含了问题的公式。

IMAGE

P.S .:此处的目的是在Jafar Rezaei中用Matlab编写BWM(最佳最差方法)代码。

Ws和Ksi是我们想要获得的最佳权重和目标函数,而As是其值存在的向量。

1 个答案:

答案 0 :(得分:0)

这是matlab中的代码。

clc;clear;close all;

delete Data.mat
DATA = xlsread("Data.xlsx");

NumOfExperts        = size(DATA , 1) / 2;
NumOfCriteria       = size(DATA , 2);
BestData            = DATA( 1:NumOfExperts , : );
WorstData           = DATA( NumOfExperts + 1: end , :);
WorstData           = WorstData';
ConsistencyIndex    = [0 , .44 , 1 , 1.63 , 2.3 ,3 , 3.73 , 4.47 , 5.23];

DATA = struct;

for i = 1:NumOfExperts

    IndexOfBest     = find(BestData(i , :) == 0);
    IndexOfWorst    = find(WorstData(: , i) == 0);

    BestData(i , IndexOfBest)   = 1;
    WorstData(IndexOfWorst , i) = 1;

    DATA(i).Best        = BestData(i , :);
    DATA(i).Worst       = WorstData(: , i);
    DATA(i).BestIndex   = IndexOfBest;
    DATA(i).WorstIndex  = IndexOfWorst;   

end
clear BestData .. WorstData .. IndexOfBest .. IndexOfWorst;

MeanWeight = zeros(1 , NumOfCriteria);
for i = 1:NumOfExperts
    Data = DATA(i);
    save Data

    EqualCoefftMat  = ones(1 , NumOfCriteria);
    InitialPoints   = rand(1 , NumOfCriteria);
    LowerBound = zeros(1 , NumOfCriteria);
    UpperBound = ones(1 , NumOfCriteria);
    options = optimoptions(@fmincon , 'Algorithm' , 'interior-point' , 'MaxFunctionEvaluations' , 50000 , 'MaxIterations' , 5000 );

    [DATA(i).Weights , DATA(i).Ksi] = fmincon(@Epsilon , InitialPoints , [] , [] , EqualCoefftMat , 1 , LowerBound , UpperBound , [],  options);

    DATA(i).ConsistencyRatio = DATA(i).Ksi/ConsistencyIndex(max(max(DATA(i).Best) , max(DATA(i).Worst)));
    MeanWeight = MeanWeight + DATA(i).Weights; 
end

MeanWeight = MeanWeight/NumOfExperts;
bar(MeanWeight);
xlabel('Criterias');
ylabel('Weights');
title(['Mean Of Weights is: ', num2str(mean(MeanWeight))]);

[Result.Weights , Result.IndexOfWeight] = sort(MeanWeight , 'descend');

function Out = Epsilon(x)
    load Data

    for i = 1:NumOfCriteria
        f(i) = abs(x(Data.BestIndex)/x(i) - Data.Best(i));
        g(i) = abs(x(i)/x(Data.WorstIndex) - Data.Worst(i));
    end
    Out = (sum(f) + sum(g) - g(Data.BestIndex))*2/NumOfCriteria;
end