如何修改Matlab linprog代码求解以v为目标的最优混合策略问题
原始问题
给定如下支付矩阵,求解玩家一的最优混合策略:
0 2 1 -1 3 4 0 -5 -1 3 0 2 -1 -1 2 1
构建的最大化问题
我建立了如下最大化模型:
max v
约束条件:
- 3p₁ - p₃ - 2p₄ ≤ v
- 2p₁ + 4p₂ + 3p₃ - p₄ ≤ v
- p₁ + 2p₄ ≤ v
- -p₁ -5p₂ +2p₃ + p₄ ≤ v(注:原表述中p4n应为笔误,修正为p4)
其中 pᵢ < 0
问题诉求
我曾用以下Matlab代码求解最大化问题,但不知道怎么调整代码来适配这个以v为目标函数的优化问题:
% max 6x - y s.t. % 4y - x >= 10 % 2x + y <= 10 % 2y - x <= 5 f = -[6;-1]; % objective function A = [1 -4; 2 1; -1 2]; % constraint matrix b = [-10 10 5]; % constraing rhs Aeq = []; % no equality constraints here beq = []; % no equality constraints here lb = []; ub = []; %% call linprog optimum = linprog(f,A,b,Aeq,beq,lb,ub)
调整后的Matlab代码及说明
Matlab的linprog函数默认求解最小化问题,因此需要将原最大化问题max v转换为等价的min -v,同时把所有变量(p₁,p₂,p₃,p₄,v)整合到优化变量中,整理约束条件为标准的Ax ≤ b形式:
% 目标函数:min -v,对应变量顺序[p1; p2; p3; p4; v] f = [0; 0; 0; 0; -1]; % 约束矩阵A:前4行是原问题的约束移项,后4行是pᵢ < 0的约束(即pᵢ ≤ 0) A = [ 3, 0, -1, -2, -1; % 3p1 - p3 - 2p4 - v ≤ 0 2, 4, 3, -1, -1; % 2p1 + 4p2 + 3p3 - p4 - v ≤ 0 1, 0, 0, 2, -1; % p1 + 2p4 - v ≤ 0 -1, -5, 2, 1, -1; % -p1 -5p2 +2p3 + p4 - v ≤ 0 1, 0, 0, 0, 0; % p1 ≤ 0 0, 1, 0, 0, 0; % p2 ≤ 0 0, 0, 1, 0, 0; % p3 ≤ 0 0, 0, 0, 1, 0; % p4 ≤ 0 ]; % 约束右侧向量b b = [0; 0; 0; 0; 0; 0; 0; 0]; % 无等式约束 Aeq = []; beq = []; % 变量下界:p1-p4无下界(可任意取负数),v无下界 lb = [-inf; -inf; -inf; -inf; -inf]; % 变量上界:p1-p4≤0,v无上界 ub = [0; 0; 0; 0; inf]; % 调用linprog求解 [x, fval] = linprog(f, A, b, Aeq, beq, lb, ub); % 输出结果 disp('玩家一的最优混合策略(p1,p2,p3,p4):'); disp(x(1:4)); disp('最优值v:'); disp(-fval); % 转换回原最大化问题的目标值
关键调整点
- 目标函数转换:原问题是最大化v,linprog默认求最小化,因此目标向量
f中v的系数设为-1,其余pᵢ的系数为0,等价于求解min -v。 - 约束条件整理:将所有原约束移项为
Ax ≤ b的形式,同时添加pᵢ ≤ 0的约束到矩阵A中。 - 变量边界设置:针对
pᵢ < 0设置每个p的上界为0、下界为负无穷;v无边界限制。
内容的提问来源于stack exchange,提问作者Georgia Bingham
相关产品推荐
相关产品推荐

