Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求解一个简单的最大化博弈_Java_Algorithm_Language Agnostic_Maximize - Fatal编程技术网

Java 求解一个简单的最大化博弈

Java 求解一个简单的最大化博弈,java,algorithm,language-agnostic,maximize,Java,Algorithm,Language Agnostic,Maximize,关于我创建的一个游戏(这不是家庭作业),我有一个非常简单的问题:下面的方法应该包含什么来最大化回报: private static boolean goForBiggerResource() { return ... // I must fill this }; 我再次强调,这不是家庭作业:我试图理解这里的工作内容 “战略”是微不足道的:只有两个选择:正确或错误 “游戏”本身非常简单: P1 R1 R2 P2 R5 P3 R3

关于我创建的一个游戏(这不是家庭作业),我有一个非常简单的问题:下面的方法应该包含什么来最大化回报:

private static boolean goForBiggerResource() {
    return ... // I must fill this
};
我再次强调,这不是家庭作业:我试图理解这里的工作内容

“战略”是微不足道的:只有两个选择:正确或错误

“游戏”本身非常简单:

P1  R1        R2 P2


          R5


P3  R3        R4 P4
  • 有四个玩家(P1、P2、P3和P4)和五个资源(R1、R2、R3、R4都值1,R5、2)

  • 每个玩家都有两个选择:要么选择一个接近其起始位置的资源,该位置为1,并且玩家肯定会获得(没有其他玩家可以先获得该资源),要么玩家可以尝试选择一个值2的资源。。。但其他玩家可能也会这么做

  • 如果两个或两个以上的玩家选择更大的资源(价值2的一个),那么他们将同时到达更大的资源,并且只有一个玩家随机获得该资源,而另一个玩家选择该资源将获得0(他们不能返回价值1的资源)

  • 每个玩家使用相同的策略(方法goForBiggerResource()中定义的策略)

  • 玩家不能通过“对话”来达成一致的策略

  • 这个游戏运行了一百万次

所以基本上我想填充方法goForBiggerResource(),它返回true或false,以最大化收益

下面是允许测试解决方案的代码:

private static final int NB_PLAYERS = 4;
private static final int NB_ITERATIONS = 1000000;

public static void main(String[] args) {
    double totalProfit = 0.0d;
    for (int i = 0; i < NB_ITERATIONS; i++) {
        int nbGoingForExpensive = 0;
        for (int j = 0; j < NB_PLAYERS; j++) {
            if ( goForBiggerResource() ) {
                nbGoingForExpensive++;
            } else {
                totalProfit++;
            }
        }
        totalProfit += nbGoingForExpensive > 0 ? 2 : 0;
    }
    double payoff = totalProfit / (NB_ITERATIONS * NB_PLAYERS);
    System.out.println( "Payoff per player: " + payoff );
}
private static boolean goForBiggerResource() {
    return true;
};
然后,所有四个玩家都会选择更大的资源。他们中只有一个人会随机得到它。在一百万次迭代中,每个玩家的平均收益为2/4,即0.5,程序应输出:

每位玩家的收益:0.5


我的问题很简单:goForBiggerResource()方法(返回true或false)中应该包含哪些内容以最大化平均回报?为什么?

我认为您尝试了以下方法:

private static boolean goForBiggerResource() {
    return false;
};
没有一个玩家试图获取价值2英镑的资源。因此,他们保证每次获得价值1的资源,因此:

每位玩家的收益:1.0

我还认为,如果你问这个好问题,是因为你认为有更好的答案

诀窍在于,你需要所谓的“混合战略”

编辑:好的,我有一个混合策略。。。我不明白Patrick怎么会这么快找到20%(当他发表评论时,就在你发布问题几分钟后),但是,是的,我也发现了基本相同的值:

private static final Random r = new Random( System.nanoTime() );

private static boolean goForBiggerResource() {
    return r.nextInt(100) < 21;
}
private static final Random r=new Random(System.nanoTime());
私有静态布尔goForBiggerResource(){
返回r.nextInt(100)<21;
}
例如:

每位玩家的报酬:1.0951035

基本上,如果我没弄错的话,你想阅读维基百科页面上的“纳什均衡”,尤其是:

纳什均衡是用混合策略来定义的,在混合策略中,参与者选择概率分布而不是可能的行动

如果我没有弄错的话,你的问题/简单的例子也可以用来说明为什么勾结玩家可以获得更好的平均回报:如果玩家可以勾结,他们平均得到1.25,这比我得到的1.095好


还要注意的是,我的答案包含近似误差(我只检查0到99之间的随机数),这有点取决于随机PRNG,但你应该明白这一点。

嗯,我认为你的基本问题是,所描述的游戏很琐碎。在所有情况下,最佳策略都是坚持使用本地资源,因为使用R5的预期收益只有0.5(1/4*2)。将R5奖励提高到4,奖励变为均等;没有比这更好的策略了。奖励(R5)>4,而获得R5总是值得的。

因为每个玩家都使用与您的
goForBiggerResource
方法中描述的相同策略,并且您尝试最大化总体回报,最好的策略是三名玩家坚持使用本地资源,一名玩家参与大型游戏。不幸的是,由于他们无法就策略达成一致,而且我认为没有一个玩家不能被区分为大型狩猎者,所以事情变得棘手起来

我们需要随机化一个球员是否参加大型比赛。假设p是他选择它的概率。然后根据有多少大型狩猎者来划分案例,我们可以计算案例数量、概率、收益,并基于此计算预期收益

  • 0 BGH:(4选择0)个案例,(1-p)^4个问题,4个回报,预期4个(p^4-4p^3+6p^2-4p+1)
  • 1 BGH:(4选1)个案例,(1-p)^3*p概率,5个回报,预期20(-p^4+3p^3-3p^2+p)
  • 2 BGH:(4选择2)个案例,(1-p)^2*p^2个问题,4个回报,预期24(p^4-2p^3+p^2)
  • 3 BGH:(4选3)例,(1-p)*p^3概率,3回报,预期12(-p^4+p^3)
  • 4 BGH:(4选择4)个案例,p^4概率,2回报,预期2(p^4)
然后我们需要最大化预期收益的总和。如果我计算正确的话,也就是-2p^4+8p^3-12p^2+4p+4。因为第一项是-2<0,所以它是一个凹函数,希望它的导数的一个根-8p^3+24p^2-24p+4将使预期收益最大化。将其插入在线多项式解算器,它返回三个根,其中两个是复数,第三个是p~0.2062994740159。第二个导数是-24p^2+48p-24=24(-p^2+2p-1)=-24(p-1)^2,这对于所有p都是<0!=1,所以我们确实找到了一个最大值。(总体)预期收益是在该最大值下评估的多项式,约为4.3811015779523,即每个玩家的收益为1.095275394488075

因此,获胜的方法是这样的

private static boolean goForBiggerResource ()
{
    return Math.random() < 0.2062994740159;
}

如果玩家无法合作且没有内存,则只有一种可能的方法来实现
goForBiggerResource
:随机选择一个值。现在的问题是什么是最好的利率使用

现在简单数学(与编程无关):

  • 假设利率
    private static int cheat = 0;
    
    private static boolean goForBiggerResource ()
    {
        cheat = (cheat + 1) % 4;
        return cheat == 0;
    }