首页 > 解决方案 > Matlab中的最佳最差方法(BWM) - linprog

问题描述

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

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

图片

PS:这里的对象是Jafar Rezaei博士在matlab中编写BWM(Best Worst Method)。

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

标签: matlab

解决方案


这是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

推荐阅读