matlab - Matlab中的最佳最差方法(BWM) - linprog
问题描述
我需要有关 linprog 问题的指导。我有一个优化问题,需要目标函数的权重和最小值,但我无法正确分配参数。题目和题目的形式是这样的。附上问题图片。
任何有关理解问题和获得解决方案的帮助将不胜感激。下图包含问题的公式。
PS:这里的对象是Jafar Rezaei博士在matlab中编写BWM(Best Worst Method)。
Ws 和 Ksi 是我们想要获得的最优权重和目标函数,As 是其值存在的向量。
解决方案
这是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
推荐阅读
- simulation - 竞赛策略开发的观察空间 - 强化学习
- java - 如何在 java 中动态连接到 Swagger / OpenAPI 端点?
- docker - 带有用户令牌的 Docker config.json
- javascript - React - 与不记名令牌链接
- swift - 日期字符串到 Swift 日期
- java - 如何从 HashMap 中检索 id
- javascript - 如何从 Firestore 查询 Expo 中嵌套集合的数据
- reactjs - 托管在 Firebase 托管中的 React 应用程序 - 未捕获的语法错误:意外的令牌 '<'
- responsive - Swiper.js 在移动和中型屏幕上滑动
- sql - 我如何设计一个具有适当数据库引擎的模式来根据 clickhouse 或任何其他数据库的需要来积累数据?