一个线性规划问题

我用 Optimization.jl 解一个简单的 线性规划问题, 但是结果不对, 不知道哪里写错了.

using Optimization
using OptimizationOptimJL
using OptimizationMOI
# using Clp

function test1()
    # book\数据建模\0课件集合\3数学规划\数学规划建模.ppx  例1 运输问题
    t1(u,p) = p[1]*u[1] + p[2]*u[2] + p[3]*u[3] + p[4]*u[4] + p[5]*u[5] + p[6]*u[6]
    u0 = [1.0,1,1,1,3,4]  # zeros(Float64, 6)  # 变量初始值
    p  = [12.0,24.0,8.0,30.0,12.0,24.0]   # 参数初始值

    # 约束条件
    inf = Inf  # 10000.0
    cons = (x,p) -> [x[1] + x[2] + x[3], x[4] + x[5] + x[6], 
                     x[1] + x[4], x[2] + x[5], x[3] + x[6]]   # 约束表达式 数组
    lcons = [0.0,0.0,2.0,4.0,5.0]    # 约束下限 数组
    ucons = [4.0,8.0,inf,inf,inf]    # 约束上限 数组
    lb = [0.0,0,0,0,0,0]  # 限制变量x下限
    ub = [inf,inf,inf,inf,inf,inf]    # 限制变量x上限

    optf = OptimizationFunction(t1, Optimization.AutoForwardDiff(); cons=cons)
    prob = OptimizationProblem(optf, u0, p; lb=lb, ub=ub, lcons=lcons, ucons=ucons)

    # Import a solver package and solve the optimization problem
    sol = solve(prob, BFGS()) # SAMIN BFGS  NelderMead Clp.Optimizer
    println(sol)
    println(sol.original)
end

test1()

结果:

retcode: false
u: [Inf, Inf, Inf, Inf, Inf, Inf]
Final objective value:     Inf

 * Status: failure

 * Candidate solution
    Final objective value:     Inf

 * Found with
    Algorithm:     Fminbox with BFGS

 * Convergence measures
    |x - x'|               = NaN ≰ 0.0e+00
    |x - x'|/|x'|          = NaN ≰ 0.0e+00
    |f(x) - f(x')|         = NaN ≰ 0.0e+00
    |f(x) - f(x')|/|f(x')| = NaN ≰ 0.0e+00
    |g(x)|                 = NaN ≰ 1.0e-08

 * Work counters
    Seconds run:   1  (vs limit Inf)
    Iterations:    1000
    f(x) calls:    1
    ∇f(x) calls:   1

这结果不对, 不知道哪里问题

optim包里只有IPNewton算法支持 Equality and Inequality Constraints。内点法的初始值需要调教。

# book\数据建模\0课件集合\3数学规划\数学规划建模.ppx  例1 运输问题
t1(u,p) = p[1]*u[1] + p[2]*u[2] + p[3]*u[3] + p[4]*u[4] + p[5]*u[5] + p[6]*u[6]
u0 = [1.1,1.1,1.1,1.1,3.1,4.1]  # zeros(Float64, 6)  # 变量初始值
p  = [12.0,24.0,8.0,30.0,12.0,24.0]   # 参数初始值

# 约束条件
inf = Inf  # 10000.0
cons(res, x, p)=(res .= [x[1] + x[2] + x[3], x[4] + x[5] + x[6], x[1] + x[4], x[2] + x[5], x[3] + x[6]])   # 约束表达式 数组)
lcons = [0.0,0.0,2.0,4.0,5.0]    # 约束下限 数组
ucons = [4.0,8.0,inf,inf,inf]    # 约束上限 数组
lb = [0.0,0,0,0,0,0]  # 限制变量x下限
ub = [inf,inf,inf,inf,inf,inf]    # 限制变量x上限

optf = OptimizationFunction(t1, Optimization.AutoForwardDiff(); cons=cons)
prob = OptimizationProblem(optf, u0, p, lb=lb, ub=ub, lcons=lcons, ucons=ucons)

# Import a solver package and solve the optimization problem
sol = solve(prob, IPNewton()) # SAMIN BFGS  NelderMead Clp.Optimizer
println(sol)
println(sol.original)
retcode: true
u: [2.0, 8.577708939843775e-19, 2.0, 1.2008792515782457e-17, 4.0, 2.9999999999999996]
Final objective value:     160.0

 * Status: success

 * Candidate solution
    Final objective value:     1.600000e+02

 * Found with
    Algorithm:     Interior Point Newton

 * Convergence measures
    |x - x'|               = 8.65e-18 ≰ 0.0e+00
    |x - x'|/|x'|          = 2.16e-18 ≰ 0.0e+00
    |f(x) - f(x')|         = 0.00e+00 ≤ 0.0e+00
    |f(x) - f(x')|/|f(x')| = 0.00e+00 ≤ 0.0e+00
    |g(x)|                 = 3.00e+01 ≰ 1.0e-08

1 个赞