2014-09-28 8 views
0

Я написал небольшую программу в 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); 

из документации по адресу:

http://www.mathworks.de/de/help/symbolic/generate-matlab-functions.html?searchHighlight=matlabFunction

Это должно дать

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 высоко ценятся.


+0

@Amro Большое спасибо. Ты прав!! Я был слеп, чтобы не видеть эту неудачу. Тем не менее, очень жаль, что MATLAB не отображает предупреждение, подобное Mathematica, когда переменная/функция затеняется встроенной функцией. –

+0

Да, это сообщение об ошибке было немного загадочным. Мне пришлось пройти через отладчик и проверить стек вызовов, чтобы выяснить, что происходит. – Amro

ответ

1

Я думаю, что знаю, в чем проблема; К началу ShapleyValueML функции, то есть переменная int которые Shadows встроенной integration function:

... 

int=0:-1:1-n; %# <-- problem! 

... 

shv(jj)=int(dfy,0,1) 

... 

Это объясняет ошибку приходя из sym/subsindex, вы использовали символический объект как индекс в числовой массив int.

Измените имя переменной на что-то еще, и прокомментированный код работает отлично (символическая интеграция)! Просто как это :)

Смежные вопросы