如何解决约束在使用Scipy的优化中不起作用
我正在尝试解决利润最大化问题。公司有一些促销计划。在某些约束下,我为利润最大化制定了目标函数。我想说一个约束条件,即该公司不能同时运行两个以上的促销计划。但是这种情况不起作用
这是我的代码:
from scipy.optimize import minimize
from math import floor
#Objective function
def objective(x):
return -((-14.12*x[0]+1*floor(x[1])+2*floor(x[2])+4*floor(x[3]))*x[0] \ #total revenue (qty*price)
-(-14.12*x[0]+1*floor(x[1])+2*floor(x[2])+4*floor(x[3]))*10000*0.05\ #Gold price cost
-(-14.12*x[0]+1*floor(x[1])+2*floor(x[2])+4*floor(x[3]))*x[0]*0.1\ #Rebate cost
-(-14.12*x[0]+1*floor(x[1])+2*floor(x[2])+4*floor(x[3])/15000*100000))
#Points constraint
#Constraints
def PriceConstraint(x):
return x[0]-3000
def GoldCoinConstraint(x):
return floor(x[1])-1
def PointsConstraint(x):
return floor(x[2])-1
def ProgressiveRebateConstraint(x):
return floor(x[3])-1
def CombinationConstraint(x):
return 2-floor(x[1])+floor(x[2])+floor(x[3])
#Initial guesses
n=5
x0=np.zeros(5)
x0[0]=1
x0[1]=2
x0[2]=2
x0[3]=1
x0[4]=3
# show initial objective
print('Initial Objective: ' + str(objective(x0)))
# optimize
b = (0.0,1.0)
pricebound = (1,3000)
bnds = (pricebound,b,b)
con1= {'type':'ineq','fun':PriceConstraint}
con2= {'type':'ineq','fun':GoldCoinConstraint}
con3= {'type':'ineq','fun':PointsConstraint}
con4= {'type':'ineq','fun':ProgressiveRebateConstraint}
con5= {'type':'ineq','fun':CombinationConstraint}
cons = ([con1,con2,con3,con4,con5])
solution = minimize(objective,x0,method='SLSQP',\
bounds=bnds,constraints=cons)
x = solution.x
# show final objective
print('Final Objective: ' + str(objective(x)))
# print solution
print('Solution')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))
print('x4 = ' + str(x[3]))
正如您所看到的,我使用combinationconstrain函数将销售方案的数量限制为不超过2个。不知何故似乎不起作用?对于x [1],x [2]和x [3],我的输出为1。
有人可以帮我为什么这不起作用吗?
在不同的思路上,非线性优化中也有类似影子价格的问题。我知道它存在于线性编程中,但是不确定非线性吗?
解决方法
2-floor(x[1])+floor(x[2])+floor(x[3])
应该阅读
2-(floor(x[1])+floor(x[2])+floor(x[3]))
那并不能真正帮助您。运行它时,您可能会得到类似以下内容的信息:
fun: -976376.097853337
jac: array([567.265625,0.,0. ])
message: 'Positive directional derivative for linesearch'
nfev: 32
nit: 7
njev: 3
status: 8
success: False
x: array([300.9,1.,1. ])
您的floor
函数使问题不可区分。 SLSQP只喜欢平滑(即可微)的问题。
我认为您的问题实际上是混合整数二次编程问题。因此,我建议不使用连续的NLP求解器来解决此问题,而应使用MIQP求解器来解决。这样,您就不需要floor
函数。不幸的是,scipy不包含MIQP求解器。
问:非线性优化中是否有像影子价格之类的东西?
A:是的,对于连续的问题,大多数NLP求解器可以提供对折价格或影子价格(scipy求解器不会那样做)。对偶不适用于离散问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。