为什么 CPLEX 对于简单的二次规划会输出错误的结果?

问题描述 投票:0回答:1

最小化问题的目标函数是,

f=x^2+y^2+z^2,

其中 x,y,z 是连续变量。

限制条件是

x+2y-z=4,

x-y+z=-2。

最优解是$f=2.8571$,$x=0.2857,y=1.4286,z=-0.8571$,但是Cplex输出$f=4,x=0,y=2,z=0$。

Python源代码:

import cplex

def solve_and_display(p):
    
    p.solve()

    # solution.get_status() returns an integer code
    print ("Solution status = " , p.solution.get_status(), ":",)
    # the following line prints the corresponding string
    print (p.solution.status[p.solution.get_status()])
    print ("Solution value  = ", p.solution.get_objective_value())

    numrows = p.linear_constraints.get_num()

    for i in range(numrows):
        print ("Row ", i, ":  ",)
        print ("Slack = %10f " %  p.solution.get_linear_slacks(i),)
        print ("Pi = %10f" % p.solution.get_dual_values(i))

    numcols = p.variables.get_num()

    for j in range(numcols):
        print ("Column ", j, ":  ",)
        print ("Value = %10f " % p.solution.get_values(j),)
        print ("Reduced Cost = %10f" % p.solution.get_reduced_costs(j))

import cplex
problem = cplex.Cplex()


problem.variables.add(names=['x', 'y', 'z'])

qmat = [[[0,1,2],[2, 0, 0]],
        [[0,1,2],[0, 2, 0]],
        [[0,1,2],[0, 0, 2]]]
problem.objective.set_quadratic(qmat)

# The solution is also wrong when using set_quadratic_coefficients
# problem.objective.set_quadratic_coefficients([('x', 'x', 1), ('y', 'y', 1), ('z', 'z', 1)])

problem.objective.set_sense(problem.objective.sense.minimize)

problem.linear_constraints.add(
    lin_expr=[[['x', 'y', 'z'], [1, 2, -1]], [['x', 'y', 'z'], [1, -1, 1]]],
    senses=['E', 'E'],
    rhs=[4, -2]
)

problem.solve()

print("Solution:")
print("Objective Value =", problem.solution.get_objective_value())
print("x =", problem.solution.get_values('x'))
print("y =", problem.solution.get_values('y'))
print("z =", problem.solution.get_values('z'))

Python版本:3.9

CPLEX版本:22.1.1.2

cplex
1个回答
0
投票

使用 OPL CPLEX API,您可以获得正确的结果:

dvar float x;
dvar float y;
dvar float z;

minimize x*x+y*y+z*z;

subject to
{

x+2*y-z==4;

x-y+z==-2;
}

给予

x = 0.28571;
y = 1.4286;
z = -0.85714;
© www.soinside.com 2019 - 2024. All rights reserved.