虽然我不明白你为什么对核心之外的一点到核心本身的距离感兴趣,但我将给你一个快速的过程来获得一个近似值。下面的例子可以用我的 Matlab 博弈论工具箱 MatTuGames 复制,可以在以下 URL 下载:
http://www.mathworks.com/matlabcentral/fileexchange/35933-mattugames
首先,考虑以下五人游戏:
>> v=[2 0 1 0 0 0 4 2 0 0 1 0 0 0 2 0 0 0 1 0 0 2 4 1 1 1 4 1 2 4 8];
Shapley 值通过以下方式快速计算
>> tic;sh_v=ShapleyValue(v);toc
经过的时间是 0.002676 秒。
>> sh_v
sh_v =
1.7500 1.9167 1.1667 1.5000 1.6667
在下一步中,我们检查核心是否存在
>> CddCoreQ(v)
答案=
1
由于返回值为 1 (true),因此示例游戏的核心存在。此外,我们还检查了凸性、平均凸性和超可加性
>> convex_gameQ(v)
答案=
0
>> average_convexQ(v)
答案=
0
>> super_additiveQ(v)
答案=
0
这些属性都不满足。接下来,我们验证 Shapley 值是否属于核心。
>> crQ=belongToCoreQ(v,sh_v)
crQ =
0
不是这种情况。因此,我们使用 Shapley 值来计算到核心的近似距离。为了完成,我们计算核心的顶点,这可以通过
>> tic;crv=CddCoreVertices(v);toc
经过的时间是 0.001161 秒。
>> crv
crv =
2 2 0 2 2
4 2 0 2 0
2 4 0 2 0
2 2 0 4 0
2 0 2 4 0
4 0 2 2 0
2 0 2 2 2
2 0 4 2 0
4 0 0 2 2
>> size(crv)
答案=
9 5
现在,我们可以计算 Shapley 值到核心顶点的欧几里得距离。因此,我们评估
>> for k=1:size(crv), ed(k,:)=norm(sh_v-crv(k,:)); end
>> ed
编=
1.3385
3.0754
2.9651
3.2339
3.6686
3.5296
2.1890
3.8460
3.2339
挑出最小的距离值,它的位置是通过
>> [mn,id]=min(ed)
mn =
1.3385
id =
1
我们观察到上面列表中的第一个核心顶点与 Shapley 值的距离最小。如果您选择带顶点的面,您可能会得到更好的近似值
>> crv(id,:)
答案=
2 2 0 2 2
最接近 Shapley 值。然后计算人脸的中心,这可能会给你一个更好的近似值。
更新:
根据 Mehdi Pouragha 的回答,这给出了使用从核心外部点到核心本身的正交投影的正确方法。我提出了一个小的 Matlab 函数来计算核心与核心外任意点的最近点。
function DC=CPCore(v,x,tol)
% CPCORE computes the closest point of the core to x.
%
%
% Usage: DC=CPCore(v,x,tol)
% Define variables:
% output:
% Cp -- Closest point of the core to x.
% D -- The Euclidean distance between the points.
% resid -- The residual.
% ef -- Exitflag.
% lambda -- Containing the Lagrange multipliers.
%
% input:
% v -- A Tu-Game v of length 2^n-1.
% x -- The reference point from which the distance
% to core should be drawn.
% tol -- Tolerance value. Its default value is set to 10^6*eps.
if nargin<3
tol=10^6*eps;
end
N=length(v);
[~, n]=log2(N);
S=1:N;
for k=1:n, A(:,k) = bitget(S,k)==1;end
v1(S)=v(S)-tol;
v1(N)=v(N);
A=-A;
B=-v1;
Aeq=ones(1,n);
beq=v(N);
[Cp,D,residual,exitflag,~,lambda] = lsqlin(eye(n),x,A,B,Aeq,beq);
Cp=Cp';
resid=residual';
DC=struct('Cp',Cp,'D',D,'resid',resid,'ef',exitflag,'lambda',lambda);
现在,我们可以从上述五人游戏中计算出最接近 Shapley 值的核心点:
>> DC=CPCore(v,sh_v)
结果是
DC =
Cp: [2.0000 1.6667 0.9167 2.0000 1.4167]
D: 0.5000
resid: [0.2500 -0.2500 -0.2500 0.5000 -0.2500]
ef: 1
lambda: [1x1 struct]
正确性可以通过以下方式检查
>> tol=10^7*eps;
>> belongToCoreQ(v,DC.Cp,tol)
ans =
1