从GAMUT生成Polymatrix游戏

时间:2016-01-23 23:01:26

标签: java game-theory

我正在尝试从GAMUT java库生成Polymatrix游戏。

    try {
        PolymatrixGame polyGame = new PolymatrixGame();

        polyGame.setParameter("players", nbOfPlayers); //nbOfPlayers = 3L;
        polyGame.setParameter("actions", nbOfActions); //nbOfActions is a Vector<String> with three entries: each equal "2".
        polyGame.setParameter("graph", "RandomGraph");

        polyGame.setParameter("graph_params", new ParamParser(new String[] {"-nodes", "" + nbOfPlayers, "-edges", "" + 3, "-sym_edges", "1", "-reflex_ok", "0"}));
        polyGame.setParameter("subgame", "Chicken");
        polyGame.setParameter("subgame_params", new ParamParser());

        polyGame.initialize();

        polyGame.doGenerate();

    } catch (Exception e) {
        e.printStackTrace();
    }

我收到以下错误:

  

致命错误:无法生成polymatrix游戏(子游戏鸡)

     

显示java.lang.NullPointerException

我一直在挖掘源代码,但我找不到错误的来源。错误消息本身也不是很有用。

最终,我正在尝试使用给定数量的玩家生成随机Polymatrix游戏并为每个玩家提供一系列操作。

1 个答案:

答案 0 :(得分:0)

经过一些挖掘源代码和调试之后, 我发现导致NullPointerException

的原因

GAMUT假设您要求使用命令行生成游戏。它将命令的参数存储在String类中名为gArgs的{​​{1}}数组变量中。

Global

当生成 // -- Original command line public static String[] gArgs; 游戏时,会调用PolyMatrix类中的方法,将GameOutput gArgs数组更改为正常String然后将其存储在相关的String对象中。上面提到的方法如下。

PolyMatrix

public static String arrayToString(String[] args, String sep) { StringBuffer buff=new StringBuffer(); for(int i=0; i<args.length; i++) { buff.append(args[i]); if (i!=args.length-1) buff.append(sep); } return buff.toString(); } 类中调用如下。 Game

如果GameOutput.arrayToString(Global.gArgs, " ")Global.gArgs,则出于明显原因会抛出null。这正是原始帖子中代码示例中发生的情况,因为NullPointerException从未设置过。

快速解决方案:将Global.args设置为无意义的内容,例如Global.gArgs

最佳解决方案:实际上将Global.gArgs = new String[]{""};设置为Global.gArgs的数组,其中包含您从命令行生成游戏时所提供的参数。 像String

这样的东西

(如果要从命令行实际生成游戏,那么'最佳'解决方案的示例可能会与Global.gArgs = new String[]{"-players", "3", "-actions", "2", "-graph", "RandomGraph", "-graph_params", "[-nodes 3 - edges 3 - sym_edges 1 -reflex_ok 0]", "-subgame", "Chicken", "-subgame_params", "[]"}的实际值略有不同。

然而,奇怪的是,像PrisonersDilemma和Chicken这样的简单游戏不需要设置Global.gArgs变量。