Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在构造更复杂的目标函数时,古洛比误差因子必须是常数_Python_Gurobi - Fatal编程技术网

Python 在构造更复杂的目标函数时,古洛比误差因子必须是常数

Python 在构造更复杂的目标函数时,古洛比误差因子必须是常数,python,gurobi,Python,Gurobi,当我使用一个相当直接的成本函数作为优化目标函数时,gurobi给出了一个答案,但当我使用math.log()函数或甚至使用I**2而不是I*I将事情复杂化时,它会产生一个类似于以下其中一个的错误: GurobiError:除数必须是常量 TypeError:需要浮点数 TypeError:不支持**或pow()的操作数类型:'Var'和'int' 我试图将math.log((m-I)/I)重新格式化为math.log(m-I)-math.log(I)这会产生浮点值是必需的错误。将i*i更改为i*

当我使用一个相当直接的成本函数作为优化目标函数时,gurobi给出了一个答案,但当我使用
math.log()
函数或甚至使用
I**2
而不是
I*I
将事情复杂化时,它会产生一个类似于以下其中一个的错误:

GurobiError:除数必须是常量

TypeError:需要浮点数

TypeError:不支持**或pow()的操作数类型:'Var'和'int'

我试图将
math.log((m-I)/I)
重新格式化为
math.log(m-I)-math.log(I)
这会产生浮点值是必需的错误。将
i*i
更改为
i**2
会产生不支持的错误

现在我的问题是:在Gurobi中创建一个更复杂的函数是不可能的吗?或者我在别的地方犯了错误

这是我的模型的剪贴画

from gurobipy import *
import pandas as pd
import numpy as np
import time
import math

start_time = time.time()


# example NL (i, 20, 0.08, -6.7, 301)
def cost(i, j, k, l, m):
    cost = (j - l)*i + k*i*i - l*(m - i) * (math.log((m - i) / i ))
    return cost


def utility(i, j, k, l):
    utility = j + k*i + l*i*i
    return utility

"""
def cost(i, j, k, l):
    cost = j + k*i + .5*l*i*i
    return cost
"""

# assign files to use as input and as output
outputfile = 'model1nodeoutput.csv'
inputfile = 'marketclearinginput.xlsx'

# define dataframes
dfdemand = pd.read_excel(inputfile, sheetname="demand", encoding='utf8')
dfproducer = pd.read_excel(inputfile, sheetname="producer", encoding='utf8')

m = Model("1NodeMultiPeriod")

dofprod = [m.addVar(lb=3.0, ub=300, name=h) for h in dfproducer['name']]
dofdem = [m.addVar(lb=3.0, ub=300, name=h) for h in dfdemand['name']]

# Integrate new variables
m.update()

# Set objective
m.setObjective(quicksum([utility(i, j, k, l) for i, j, k, l
                        in zip(dofdem, dfdemand['c'], dfdemand['a'], dfdemand['b'])]) -
               quicksum([cost(i, j, k, l, m) for i, j, k, l, m
                        in zip(dofprod, dfproducer['c'], dfproducer['a'], dfproducer['b'], dfproducer['Pmax'])]),
               GRB.MAXIMIZE)

# Set constraints
# Set constraints for producers
for i, j, k in zip(dofprod, dfproducer['Pmin'], dfproducer['Pmax']):
    m.addConstr(i >= j)
    m.addConstr(i <= k)
# Set constraints for demand
for i, j, k in zip(dofdem, dfdemand['Pmin'], dfdemand['Pmax']):
    m.addConstr(i >= j)
    m.addConstr(i <= k)
# Build the timestamp list, pd or np unique both possible, pd faster and preserves order
# Timestamps skips the first 3 symbols (example L1T2034 becomes 2034)
timestamps = pd.unique([i.varName[3:] for i in dofprod])
# Set constraint produced >= demanded (this should be te last constraint added for shadow variables)
for h in timestamps:
    m.addConstr(quicksum([i for i in dofprod if i.varName.endswith(h)]) >=
                quicksum([i for i in dofdem if i.varName.endswith(h)]))


m.optimize()
从gurobipy导入*
作为pd进口熊猫
将numpy作为np导入
导入时间
输入数学
开始时间=time.time()
#示例NL(i,20,0.08,-6.7,301)
def成本(i、j、k、l、m):
成本=(j-l)*i+k*i*i-l*(m-i)*(数学日志((m-i)/i))
退货成本
def实用程序(i、j、k、l):
效用=j+k*i+l*i*i
返回实用程序
"""
def成本(i、j、k、l):
成本=j+k*i+5*l*i*i
退货成本
"""
#指定要用作输入和输出的文件
outputfile='model1nodeoutput.csv'
inputfile='marketclearinginput.xlsx'
#定义数据帧
dfdemand=pd.read\u excel(输入文件,sheetname=“demand”,encoding='utf8')
dfproducer=pd.read\u excel(输入文件,sheetname=“producer”,encoding='utf8')
m=模型(“1节点多时段”)
dofprod=[m.addVar(lb=3.0,ub=300,name=h)表示dfproducer['name']]中的h
dofdem=[m.addVar(lb=3.0,ub=300,name=h),用于dfdemand中的h['name']]
#整合新变量
m、 更新()
#设定目标
m、 setObjective(quicksum([实用程序(i,j,k,l))用于i,j,k,l
在zip中(dofdem、dfdemand['c']、dfdemand['a']、dfdemand['b']))-
quicksum([成本(i,j,k,l,m)为i,j,k,l,m
在zip中(dofprod、dfproducer['c']、dfproducer['a']、dfproducer['b']、dfproducer['Pmax']),
GRB(最大化)
#设置约束条件
#为生产者设置约束条件
对于拉链中的i、j、k(dofprod、dfproducer['Pmin'],dfproducer['Pmax']):
m、 addConstr(i>=j)
m、 addConstr(i=j)
m、 addConstr(i=required)(这应该是为阴影变量添加的最后一个约束)
对于时间戳中的h:
m、 addConstr(quicksum([i代表dofprod中的i,如果i.varName.endswith(h)])>=
quicksum([i表示dofdem中的i,如果i.varName.endswith(h)])
m、 优化()

您的问题可能与Gurobi quicksum()函数有关。或许可以尝试sum()。

您能详细说明一下吗?使用sum而不是quicksum不会改变任何事情!您能找到除数必须为常量的解决方案吗?我也有同样的问题!