在可转移效用特征函数游戏(合作博弈论)中,最着名的解决方案概念是游戏的核心,被定义为任何联盟都无法改进的可行支付分配集合。在几何上,核心是一个封闭的凸多面体: http://www.jstor.org/stable/2630190
在这些游戏中,支付分配是核心与否。 TUGlab工具集有一个命令,可以计算支付分配是否在核心中: http://webs.uvigo.es/mmiras/TUGlab/ 但是没有命令可以告诉你某个支付分配到核心的确切距离。如果将核心的几何特征描述为闭合凸多面体,则应该有一种方法来计算点与该多面体之间的几何距离,并且距离核心的距离为#34;特征功能。不幸的是,我没有发现任何纸张实际上向我展示了计算这个距离的公式或算法,我可以在MATLAB中实现。
我的猜测是斯蒂芬卡梅隆在代码中可能有一条线索来计算两个多面体之间的距离。但我的问题应该比那更简单:只是一个点和一个多面体之间的距离。最后,我需要一个MATLAB程序,它将输入a)作为特征函数,b)支付分布,然后将支付分布与特征函数核心之间的距离作为输出。当然假设核心是非空的。
答案 0 :(得分:1)
虽然核心概念可能很复杂,但几何平移可以将其简化一个数量级!
知道核心描述是一个不等式系统,你可以在数值上最小化给定点到N-D凸多面体表面的欧几里德距离。
假设核心的特征是不等式和等式的系统:
A.x <= b
和
Aeq.x = beq
(这部分可能不存在于所有描述中)
可以简单地最小化距离|Cp-Gp|
,其中Gp
是给定点的坐标,Cp
是最接近Gp的点,满足上述描述核心的约束。
一个简单的数值解决方案是使用MATLAB中已有的lsqlin
函数。一行代码会为您提供距离D
以及凸起上最近点的位置Cp
:
[Cp,D,residual,exitflag,output,lambda] = lsqlin(speye(N),GP,A,b,Aeq,beq);
此外,如果返回的参数residual
为负数,则可以断定核心中包含Gp
。
答案 1 :(得分:0)
虽然我不明白为什么你对一个点的距离感兴趣 在核心本身之外,我会给你一个如何快速的程序 得到一个近似值。下面的例子可以用我的Matlab重现 Game Theory Toolbox 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)
ans =
1
由于返回值为1(true),因此示例游戏的核心存在。 此外,我们还检查凸性,平均凸性和超可加性
>> convex_gameQ(v)
ans =
0
>> average_convexQ(v)
ans =
0
>> super_additiveQ(v)
ans =
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)
ans =
9 5
现在,我们可以计算Shapley值与核心顶点的欧几里德距离。 因此,我们评估
>> for k=1:size(crv), ed(k,:)=norm(sh_v-crv(k,:)); end
>> ed
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,:)
ans =
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