最小化问题的目标函数是,
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
使用 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;