Matlab-linprog中的最佳最差法(BWM)

Matlab-linprog中的最佳最差法(BWM),matlab,Matlab,我需要一个关于linprog问题的指导。我有一个优化问题,需要权重和目标函数的最小值,但我不能正确分配参数。问题的形式和主题是这样的。问题的图片附在附件中 任何关于理解问题和获得解决方案的帮助都将不胜感激。下图包含了该问题的公式 注:这里的目标是由Dr.在matlab中编写BWM(最佳-最差方法) clc;clear;close all; delete Data.mat DATA = xlsread("Data.xlsx"); NumOfExperts = size(DAT

我需要一个关于linprog问题的指导。我有一个优化问题,需要权重和目标函数的最小值,但我不能正确分配参数。问题的形式和主题是这样的。问题的图片附在附件中

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

注:这里的目标是由Dr.在matlab中编写BWM(最佳-最差方法)

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

Ws和Ksi是我们想要获得的最佳权重和目标函数,以及它的值所在的向量。

以下是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

他的个人网站上有一些幻灯片,解释了该方法,并链接到两篇原始论文。我只能建议你通读那些材料,然后试一试。当您遇到更具体的编程问题时,请返回SO。谢谢你的评论。我的问题是它的编码以及在matlab中使用适当的函数和参数。