使用Scipy.optimize.minimize使用SLSQP方法

时间:2015-08-13 22:37:58

标签: python function numpy optimization scipy

我很难尝试使用scipy.optimize优化任意数量的变量。目标是找到每种类型的冰棒的最佳数量,以最大化冰棒商店的利润。限制如下:

  1. 每种香料的量必须在1至20之间
  2. 冰棍的成本需要等于冰棒预算
  3. 以下是变量名称的解释。

    1. popsicle_types是冰棒类型的列表
    2. popsicle_profits是每个冰棒的总利润的向量 过去一个月的类型
    3. popsicle_costs是每种类型冰棒的成本向量
    4. popsicle_budget是商店必须在冰棒上花多少钱

      def func(x):     "在名为arb_vars"的列表中存储x [0] ... x [N];     arb_vars = []     j = 0     对于范围内的我(len(popsicle_types)):         arb_vars [j] = x [j]     "将arb_vars转换为数组"     arb_vars = np.asarray(arb_vars)     "最大化这两个向量之间的点积"     return - (np.dot(arb_vars,popsicle_profits))

    5. 上面的功能是我想要优化的。下面是我创建的一个函数,以便我可以在func函数之外使用arb_vars列表。

      def arb(x):
          arb_vars = []
          j = 0 
          for i in range(len(popsicle_types)):
              arb_vars[j] = x[j]
          return arb_vars
      arb_vars = arb(x)  
      

      我不明白第一个界限(0,0)的要点。所有的界限 之后它在1到20之间,因为这是我想要的每种类型的数量范围。

      bnds = ((0,0),(1,20)*len(popsicle_types))
      
      popsicle_budget = 1000 
      
      cons = ({'type':'eq','fun':lambda x: np.dot(arb_vars, popsicle_costs)-popsicle_budget})  
      
      x0 = [0]*len(popsicle_types)
      
      res = optimize.minimize(func,x0,method='SLSQP',bounds=bnds,constraints=cons)
      
      print res
      

      当我运行此代码时,我收到错误:IndexError:标量变量的索引无效。突出显示arb_vars [j] = x [j]的行。

      有没有办法在Python中优化任意数量的变量?如果是这样,你如何做,以及使用的正确语法是什么?

0 个答案:

没有答案