【问题标题】:Quadratic optimization equation where optimization equation have summation using Gurobi二次优化方程,其中优化方程使用 Gurobi 求和
【发布时间】:2023-01-13 16:57:12
【问题描述】:

所以我正在尝试使用 gurobi 库在 python 中优化我的二次方程,我的目标方程中有求和。求和方程最有可能显示错误,因为它不能接受可变整数而需要常数整数。有什么办法可以将求和方程放在目标函数中吗?

我的代码是这样的:

from gurobipy import *
import sympy as sy

op1=sy.Symbol('op1')
op2=sy.Symbol('op2')

# Create a model
quadratic_model = Model('quadratic')

# Define decision variables
n = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='n')
t = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='t')
temp = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='temp')

# Define objective function
obj_fn = (1256*80/12.5)*n*t + 25*5*n*t + sy.summation(5*t*50*(365//n)*op1,(op1,1,n)) + sy.summation(5*24*op2,(op2,1,365))
quadratic_model.setObjective(obj_fn, GRB.MINIMIZE)

# Add constraints
quadratic_model.addConstr(50*n*t >= 4320)
quadratic_model.addConstr(n>=1)
quadratic_model.addConstr(t>=1)
quadratic_model.addConstr(n<=6*30/4)            

# Solve model
quadratic_model.setParam('NonConvex', 2)
quadratic_model.optimize()

# Print results
for v in quadratic_model.getVars():
    print('---------------------------------------')
    print('%s : %g' % (v.varName, v.x)) 

print("minimized solution for the equation is:", quadratic_model.objVal)`

我试图在优化方程式中运行这段代码并求和,我尝试了两件事,如下所述

  1. 我已经尝试通过使用变量 temp 并添加 temp == 365//n 的约束来消除 365//n,但我仍然无法解决这个问题。
  2. 也尝试过使用 for 循环,然后问题变得更加荒谬,因为它显示错误:模块“gurobipy”没有属性“INTEGER”,这没有意义,因为我之前通过定义变量运行了二次 gurobipy,但没有有这样的问题

【问题讨论】:

    标签: python gurobi quadratic-programming


    【解决方案1】:
    1. 您不能将 gurobi 与 sympy 混合使用(sympy 不理解 gurobi 变量)。

    2. 第二个求和是一个常数 (7625520)。您可以将其从目标中删除。

    3. 第一个求和可以重写为:

      t*125*floor(365/n)*n*(n+1) 
      

      我们可以分块做

         x1=365/n                      : n*x1=365
         x2=floor(365/n)               : x2 <= x1, x2 >= x1-0.9999, x2 integer
         x3=t*125*floor(365/n)         : x3 = t*125*x2
         x4=t*125*floor(365/n)*n       : x4 = x3*n
         x5=t*125*floor(365/n)*n*(n+1) : x5=x4*(n+1)
      

      注意:我这里用的是sy.summation(op1,(op1,1,n))=n*(n+1)/2

      在使用这个之前检查我的数学。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多