矩阵游戏(GLPK)中的石头剪刀不可行的解决方案

时间:2014-06-02 08:30:38

标签: glpk mathprog

我尝试使用GLPK实现this线性问题。当我用摇滚剪刀游戏(混合策略中有均衡x=(1/3, 1/3, 1/3)y=(1/3, 1/3, 1/3)进行测试时,我已经得到了不可行的解决方案。

我回到MathProg检查它是否会成功。不幸的是它也失败了。我想这是由于-1值,因为基本的单纯形法不允许负变量,并且需要进行一些转换才能绕过它(虽然我认为它只涉及变量而GLPK会自动执行此操作)

我已经定义了这样的问题:

  • 玩家1的模型:

    set P1S;
    set P2S;
    
    param Payoff{P1S, P2S};
    
    var y{P1S} >= 0;
    
    minimize GameValue: sum{i in P1S} y[i];
    
    s.t. Condition2{j in P2S}:
        sum{i in P1S} Payoff[i,j] * y[i] >= 1;
    
    solve;
    
    printf "Value: %s\n", GameValue;
    
    printf "Player 1 strategies:\n";
    
    for{i in P1S}
        printf "Found %s, actual %s\n", y[i], y[i]/GameValue;
    
    end;
    
  • 数据:

    data;
    
    set P1S := r p s;
    set P2S := r p s;
    
    param Payoff
        :  r  p  s :=
        r  0 -1  1
        p  1  0 -1
        s -1  1  0;
    
    end;
    

我跑了:

$ glpsol --model rps.mod --data rps.dat
GLPSOL: GLPK LP/MIP Solver, v4.54
Parameter(s) specified in the command line:
 --model rps.mod --data rps.dat
Reading model section from rps.mod...
22 lines were read
Reading data section from rps.dat...
12 lines were read
Generating GameValue...
Generating Condition2...
Model has been successfully generated
GLPK Simplex Optimizer, v4.54
4 rows, 3 columns, 9 non-zeros
Preprocessing...
3 rows, 3 columns, 6 non-zeros
Scaling...
 A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part is 3
      0: obj =   0.000000000e+00  infeas =  3.000e+00 (0)
LP HAS NO PRIMAL FEASIBLE SOLUTION
glp_simplex: unable to recover undefined or non-optimal solution
Time used:   0.0 secs
Memory used: 0.1 Mb (126428 bytes)

我猜对了,我可以应用一些简单的解决方法(例如设置一些标志)?或者是我搞砸了的其他事情(以错误的方式写下问题或忽略了某些事情)?

修改

通过常量1增加矩阵的每个值(使所有值都为非负值)后,我获得了正确的解决方案(GameValue也被1移动了所以我可以通过减去它)。它是否仅在这种情况下有效,或者如果(在运行GLPK之前)我会将所有参数增加常数以使它们全部为非负值?我可以在GLPK中设置一些标志来自动完成吗?

1 个答案:

答案 0 :(得分:0)

我们被允许通过常数增加支付矩阵以使所有元素都为正 - 这将使我们的GameValue也增加该常数(wiki)。

因此,在将问题委托给GLPK之前,我们应该找到矩阵的最小元素(比如m),并计算m' = min(m, 0)。然后我们应该按abs(m')增加所有元素,像往常一样解决问题,并通过abs(m')获得GameValue减少。

在MathProg和GLPK中都可以手动完成(实际上MathProg有很好的minabs函数来计算参数 - 参见manual),但显然没有标志为了它。这种转变并没有改变NE问题的正确性,但可能会影响其他LP问题的正确性,我们不能认为这是理所当然的。