Я написал небольшую программу в MATLAB, чтобы вычислить значение Shapley , используя многолинейное расширение игры TU. Тем не менее, я запускаю в проблему с Symbolic Math Toolbox MATLAB. В программе я должен интегрировать набор функций, чтобы получить значение Shapley . Однако, в программе MATLAB я не могу использовать команду INT()Что такое хорошая замена для matlabFunction?
Error using sym/subsindex (line 663) Ivalid indexing or function definition. When defining a function, ensure that the body of the function is a SYM object. When indexing, the input must be numeric, logical or ':'.
Error in ShapleyValueML (line 65)shv(jj)=int(dfy,0,1)
как следствие, я должен использовать интеграл() вместо этого. В этом случае I необходимо переписать набор выражений в дескриптор функции MATLAB с помощью функции matlabFunction(). Однако на всех машинах Linux (MATLAB R2014a) на , к которым у меня есть доступ, эта команда не работает (см. Обсуждение ниже). В качестве обходного пути программа MATLAB возвращает набор функций в текущую рабочую область, там значение Shapley может быть вычислено с использованием команды int().
Чтобы сделать обсуждение более конкретным, рассмотрим эту небольшую программу MATLAB.
function [shv,F,dfm]=ShapleyValueML(v)
N=length(v);
[~, n]=log2(N);
S=1:N;
int=0:-1:1-n;
mat=(rem(floor(S(:)*pow2(int)),2)==1);
cmat=(rem(floor(S(:)*pow2(int)),2)==0);
x=sym('x',[1 n]);
mx=1-x;
y = sym('y');
vy=ones(1,n)*y;
F=0;
shv=zeros(1,n);
dfm=cell(1,n);
for ss=1:N
pd1=x(mat(ss,:));
pd2=mx(cmat(ss,:));
pd=prod(pd1)*prod(pd2)*v(ss);
F=pd+F;
end
F=expand(F);
for jj=1:n
dF=diff(F,x(jj));
dfy=subs(dF,x,vy);
%% Does not work!! MATLAB bug???
% mf=matlabFunction(dfy);
% shv(jj)=integral(mf,0,1);
%%
%% The best would be to use:
%%
% shv(jj)=int(dfy,0,1)
%% but it cannot be used inside a program.
dfm{jj}=dfy;
end
end
комментируемой части являются частями, которые не работают внутри программы, но необходимы для вычисления значения Шепли с этой программой, которая является ее целью. Я протестировал эту программу до 12 игроков, и я смог успешно вычислить значение Shapley с помощью двухэтапной процедуры. Следовательно, указанная выше программа правильно определяет рассматриваемую проблему. Чтобы получить лучшее понимание этой двухэтапной процедуры и функциональности вышеуказанной программы, давайте сосредоточимся на игре трех человек. Значения коалициями задаются следующим массивом данных
>> v = [0,0,90,0,100,120,220];
Обратите внимание, что коалиции упорядочены в соответствии с их уникальными целочисленных представлений. Игра определена, теперь мы можем оценить многолинейное расширение и набор частных производных с вышеуказанной программой, но не значением Шепли.
>> [shv,F,dfm]=ShapleyValueML(v);
Интеграция множества частных производных пробегает по диагонали единичной-куба, но тогда мы можем установить переменные из [x1, x2, x3] к [у, у, у], и интеграция выполняется от 0 до 1.
>> for k=1:3, shv(k)=int(dfm{k},0,1);end;
Решение интегрирования значение Шепли определяется по формуле:
>> shv
shv =
65 75 80
Проверка, что это действительно значение Шепли может быть достигнуто с потенциальной функцией подхода, реализованного в
>> sh_v=ShapleyValue(v)
sh_v =
65 75 80
, который поставляется с моей MATLAB Game Theory Toolbox MatTuGames от
http://www.mathworks.com/matlabcentral/fileexchange/35933-mattugames
Вместо интеграции с междунар() можно также использовать интеграл(), но затем содержимое как
>> dfm{1}
ans =
- 90*y^2 + 190*y
должен быть переписан с matlabFunction() в функции ручки. Как уже упоминалось выше, это не работает под Linux (MATLAB R2013a, R2013b, R2014a). Чтобы увидеть это давайте попробуем воспроизвести пример
>> syms x y
>> r = sqrt(x^2 + y^2);
из документации по адресу:
Это должно дать
ht =
@(x,y)tanh(sqrt(x.^2+y.^2))
, но я получаю
>> ht = matlabFunction(tanh(r))
Cell contents reference from a non-cell array object.
Error in vectorize (line 15)
c = cells{i};
Error in sym/matlabFunction>mup2mat (line 319)
res = vectorize(res(2:end-1)); % remove quotes
Error in sym/matlabFunction>mup2matcell (line 304)
r = mup2mat(c{1});
Error in sym/matlabFunction (line 123)
body = mup2matcell(funs);
вот теперь мой вопрос: существует ли альтернативная процедура получить от
>> dfm{1}
ans =
- 90*y^2 + 190*y
функция обрабатывать
>> [email protected](y) (- 90.*y.^2 + 190.*y)
df =
@(y)(-90.*y.^2+190.*y)
интегрировать его
>> integral(df,0,1)
ans =
65
Или, иначе говоря , Есть ли альтернативный метод, доступный для смену умножения * на умножение по элементам. * И операцию питания ^ до элементарной мощности. ^?
Конечно, любые предложения по улучшению вышеуказанной программы MATLAB высоко ценятся.
@Amro Большое спасибо. Ты прав!! Я был слеп, чтобы не видеть эту неудачу. Тем не менее, очень жаль, что MATLAB не отображает предупреждение, подобное Mathematica, когда переменная/функция затеняется встроенной функцией. –
Да, это сообщение об ошибке было немного загадочным. Мне пришлось пройти через отладчик и проверить стек вызовов, чтобы выяснить, что происходит. – Amro