我读到scipy的linprog返回最小解,人们可以通过将目标函数乘以-1来获得最优解。
我在这里读到:我已经测试了他们提供的例子,看看我是否也能得到最小的解决方案--我可以。
关于我试图解决的问题,我希望解决方案是:
opt_sol1.x = [0.61538462 0.38461538]
opt_sol2.x = [0.0, 1.0]
但我得到相同的结果[0.61538462 0.38461538]在这两种情况下,为什么?我的猜测是,它与目标函数中的值有关,彼此接近,但只是一个猜测,有没有一种方法可以得到我想要的第二个解?
from scipy.optimize import linprog
obj_fct1 = [0.5, 0.5]
obj_fct2 = [-0.5, -0.5]
lhs_ineq = [[1.5, 0.2]]
rhs_ineq = [1]
lhs_eq = [[1,1]]
rhs_eq = [1]
bnds = [(0, 1),
(0, 1)]
opt_sol1 = linprog(c=obj_fct1,
A_ub=lhs_ineq,
b_ub=rhs_ineq,
A_eq=lhs_eq,
b_eq=rhs_eq,
bounds=bnds)
print(opt_sol1.x)
print("------------------------------------------")
opt_sol2 = linprog(c=obj_fct2,
A_ub=lhs_ineq,
b_ub=rhs_ineq,
A_eq=lhs_eq,
b_eq=rhs_eq,
bounds=bnds)
print(opt_sol2.x)
>>> [0.61538462 0.38461538]
>>> ------------------------------------------
>>> [0.61538462 0.38461538]
1条答案
按热度按时间pwuypxnk1#
这里的“问题”是这个问题有无限多个最小值和最大值,目标函数对于所有最优解都等于相同的值(忽略最大化的符号翻转)。这可以通过检查相对于目标函数的等式约束并注意到它们是彼此的线性组合来看出。在线性规划的情况下,最优解位于边界上,无论是直线还是顶点。如果它位于一个顶点而不是一条直线上,那么就有唯一解,但如果它位于一条直线上,那么就有无穷多个解。因为目标函数和等式约束是彼此的线性组合,所以结果是有无限多个解,最小值和最大值是相同的。
在你的例子中,你的目标是
f(x1, x2) = 0.5*x1 + 0.5*x2
,或者等价地,f(x1, x2) = 0.5*(x1 + x2)
。你的等式约束说x1 + x2 = 1
,所以我们看到f(x1, x2) = 0.5
是结果。(如果我们要最大化,我们会像你一样改变目标函数的符号,得到所有可行解的f(x1,x2) = -0.5
。考虑到最大化和最小化问题都有无穷多个解,为什么求解器总是返回
[0.61538462 0.38461538]
?默认解算器使用SIMPLEX算法的一种形式,该算法始终返回顶点值(即使存在一行解,顶点值仍然是一个解,这会缩小需要检查的可能解的数量)。在这种情况下,当x1 + x2 = 1
和1.5*x1 + 0.2*x2 = 1
相交时,存在一个顶点,该顶点位于x1 = 8/13
和x2 = 5/13
处。