【问题标题】:Constraints not working in Optimization using Scipy约束在使用 Scipy 的优化中不起作用
【发布时间】:2021-01-14 00:02:02
【问题描述】:

我正在尝试解决利润最大化问题。该公司有一些促销计划。我为利润最大化制定了一个目标函数,但受到一些约束。我想提出一个限制条件,即公司不能同时运行超过 2 个促销计划。但是这种情况不起作用

这是我的代码:

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, 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。

有人能帮我解释一下为什么这不起作用吗?

另外一种思路是非线性优化中的影子价格。我知道它存在于线性规划中,但不确定非线性?

【问题讨论】:

    标签: python optimization scipy-optimize scipy-optimize-minimize


    【解决方案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.      ,   0.      ,   0.      ])
     message: 'Positive directional derivative for linesearch'
        nfev: 32
         nit: 7
        njev: 3
      status: 8
     success: False
           x: array([300.9,   1. ,   1. ,   1. ,   1. ])
    

    您的floor 函数使问题无法区分。 SLSQP 只喜欢平滑(即可微)的问题。

    我认为您的问题实际上是一个混合整数二次规划问题。所以我建议不要使用连续 NLP 求解器解决这个问题,而是使用 MIQP 求解器。这样你就不需要floor 函数。不幸的是 scipy 不包含 MIQP 求解器。


    问:非线性优化中是否有影子价格之类的东西?

    答:是的,对于连续性问题,大多数 NLP 求解器可以提供对偶或影子价格(scipy 求解器不这样做)。对偶不能用于离散问题。

    【讨论】:

    猜你喜欢
    • 2014-07-13
    • 2022-01-22
    • 2015-06-09
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-17
    相关资源
    最近更新 更多