You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解转移概率矩阵未知系数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))

代码说明

  1. 变量约束:保留x1、x2的0-1范围约束,确保转移概率矩阵每行元素和为1(x1 + (1-x1)=1,(1-x2)+x2=1)
  2. 分量展开:直接计算a*A - b的两个元素,避免函数嵌套导致的变量识别问题
  3. L1范数线性化:通过引入abs1、abs2两个非负辅助变量,将绝对值约束转化为线性不等式,适配线性规划求解逻辑
  4. 目标定义:以两个辅助变量之和作为最小化目标,等价于原问题的L1范数最小化

内容的提问来源于stack exchange,提问作者HeroldEcon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:34