TypeError:必须是实数,而不是gurobipy.LinExpr

时间:2019-04-25 14:01:32

标签: python gurobi

我正在尝试使用一个函数来确定古罗比模型中两个坐标之间的距离。该函数使用Haversine公式确定坐标之间的距离。我的gurobi模型的目标是找到一个x和y坐标,以最小化两个坐标之间的距离。我面临的问题是距离函数不接受GRB表达式。

我正在使用的代码如下

from gurobipy import Model, GRB
from math import cos

def distance(lat1, lon1, lat2, lon2):
    p  = 0.017453292519943295     #Pi/180
    a = (0.5 - cos((lat2 - lat1) * p)/2 +
        cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p))
         / 2)
    return 12742 * asin(sqrt(a)) 

# example customer location coordinates 
cuslat = [55.43, 55.57, 55.38]
cuslon = [9.84, 9.95, 9.85]

# create Model
m = Model('lat lon that min distance')

# create variables
lat = m.addVar(vtype = GRB.CONTINUOUS, name = 'lat')
lon = m.addVar(vtype = GRB.CONTINUOUS, name = 'lon')


# set Objective
m.setObjective(distance(lat,lon,cuslat[0],cuslon[0]),GRB.MINIMIZE)

# set constraints 

m.optimize()

我从运行这段代码中得到的错误是

Traceback (most recent call last):
  File "runme.py", line 24, in <module>
    m.setObjective(distance(lat,lon,cuslat[0],cuslon[0]),GRB.MINIMIZE)
  File "runme.py", line 6, in distance
    a = (0.5 - cos((lat2 - lat1) * p)/2 +
TypeError: must be real number, not gurobipy.LinExpr

PS。我是刚开始在Stackoverflow上发布问题的新手,所以我希望我的问题表达得足够清楚

1 个答案:

答案 0 :(得分:0)

cos函数的跟踪点,并查看您的代码

def distance(lat1, lon1, lat2, lon2):
    p  = 0.017453292519943295     #Pi/180
    a = (0.5 - cos((lat2 - lat1) * p)/2 +

似乎您将gurobipy.Varlat1lon1的实例插入此函数以制定目标函数。这将不起作用,因为

  • Python cos函数将不知道如何处理gurobipy.LinExpr产生的lat2 - lat1对象(因此出现错误消息),并且
  • Gurobi仅支持线性,分段线性和二次目标函数(另请参见product overview)。

您可以尝试通过Model.setPWLObj()函数将目标函数表述为分段线性函数。