0

在可转移效用特征函数博弈(合作博弈论)中,最著名的解决方案概念是博弈的核心,定义为任何联盟都无法改进的可行收益分配的集合。在几何上,核心是一个封闭的凸多面体: http: //www.jstor.org/stable/2630190

在这些游戏中,收益分配要么在核心,要么不在。TUGlab 工具集有一个命令可以计算支付分配是否在核心中: http ://webs.uvigo.es/mmiras/TUGlab/ 但是没有命令可以告诉你确切的一定的收益分配距离是核心。如果核心的几何表征是一个封闭的凸多面体,那么应该有一种方法可以将点与该多面体之间的几何距离计算为特征函数的“到核心的距离”。不幸的是,我没有找到任何论文真正向我展示了我可以在 MATLAB 中实现的计算这个距离的公式或算法。

我的猜测是斯蒂芬卡梅隆的代码中可能有一个计算两个多面体之间距离的线索。但我的问题应该比这更简单:只是一个点和一个多面体之间的距离。最后,我需要一个 MATLAB 程序,将 a) 特征函数和 b) 收益分布作为输入,然后将收益分布与特征函数核心之间的距离作为输出。当然假设核心是非空的。

4

2 回答 2

1

尽管核心概念可能很复杂,但几何平移可以将其简化一个数量级!

知道核心描述是一个不等式系统,您可以在数值上最小化给定点到 ND 凸多面体表面的欧几里得距离。

假设核心的特征在于不等式和等式系统为:

A.x <= b  

Aeq.x = beq

(这部分可能不存在于所有描述中)

可以简单地最小化距离|Cp-Gp|whereGp是给定点的坐标并且Cp是最接近 Gp 的点,它满足上述描述核心的约束。

一个简单的数值解决方案是使用lsqlinMATLAB 中已有的函数。一行代码将为您提供距离D以及凸面上最近点的位置,Cp如下所示:

[Cp,D,residual,exitflag,output,lambda] = lsqlin(speye(N),GP,A,b,Aeq,beq);

此外,如果返回的参数residual是否定的,则可以断定它Gp包含在核心中。

于 2015-05-13T00:37:53.413 回答
0

虽然我不明白你为什么对核心之外的一点到核心本身的距离感兴趣,但我将给你一个快速的过程来获得一个近似值。下面的例子可以用我的 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
于 2014-06-28T16:34:21.583 回答