类型错误:必须是实数,而不是 gurobipy.林·



我正在尝试使用一个函数来确定我的 gurobi 模型中两个坐标之间的距离。该函数使用哈弗斯公式来确定坐标之间的距离。我的 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

附言。我是在 Stackoverflow 上发布问题的新手,所以我希望我的问题足够清楚

跟踪指向cos函数,并查看代码

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

看起来你插入gurobipy.Var的实例到lat1lon1到这个函数中,以制定你的目标函数。 这是行不通的,因为

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

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

最新更新