求解转移概率矩阵未知系数x1、x2,最小化[a*A(x1,x2)-b]的L1范数(Julia实现)
Julia转移概率矩阵系数优化问题修正方案
原代码核心问题
- 目标函数直接代入固定数值
f(0.75,0.25),未使用优化变量x1、x2,完全失去优化意义 - 未正确处理L1范数的线性化:L1范数是向量各元素绝对值之和,JuMP作为线性规划工具,需要通过引入辅助变量将绝对值约束转化为线性约束
修正后的完整代码
using JuMP, GLPK # 创建优化模型 m = Model(GLPK.Optimizer) # 声明优化变量,满足非负且≤1(保证转移概率矩阵每行和为1) @variable(m, 0 ≤ x1 ≤ 1) @variable(m, 0 ≤ x2 ≤ 1) # 初始状态向量与目标状态向量 a = [0.25; 0.5] b = [0.375; 0.375] # 计算a*A - b的两个分量 # 转移概率矩阵A = [x1 1-x1; 1-x2 x2],a'*A的结果展开为两个分量 component1 = 0.25*x1 + 0.5*(1 - x2) - b[1] component2 = 0.25*(1 - x1) + 0.5*x2 - b[2] # 引入辅助变量处理绝对值,用于L1范数计算 @variable(m, abs1 ≥ 0) @variable(m, abs2 ≥ 0) # 绝对值的线性约束:|component| ≤ abs_var 等价于 -abs_var ≤ component ≤ abs_var @constraint(m, abs1 ≥ component1) @constraint(m, abs1 ≥ -component1) @constraint(m, abs2 ≥ component2) @constraint(m, abs2 ≥ -component2) # 目标函数:最小化L1范数,即两个绝对值之和 @objective(m, Min, abs1 + abs2) # 打印模型(可选) print(m) # 求解优化问题 JuMP.optimize!(m) # 输出结果 println("最优x1值: ", JuMP.value(x1)) println("最优x2值: ", JuMP.value(x2)) println("最小L1范数: ", JuMP.value(abs1) + JuMP.value(abs2))
代码说明
- 变量约束:保留
x1、x2的0-1范围约束,确保转移概率矩阵每行元素和为1(x1 + (1-x1)=1,(1-x2)+x2=1) - 分量展开:直接计算
a*A - b的两个元素,避免函数嵌套导致的变量识别问题 - L1范数线性化:通过引入
abs1、abs2两个非负辅助变量,将绝对值约束转化为线性不等式,适配线性规划求解逻辑 - 目标定义:以两个辅助变量之和作为最小化目标,等价于原问题的L1范数最小化
内容的提问来源于stack exchange,提问作者HeroldEcon
相关产品推荐
相关产品推荐

