我正在尝试使用一个函数来确定古罗比模型中两个坐标之间的距离。该函数使用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上发布问题的新手,所以我希望我的问题表达得足够清楚
答案 0 :(得分:0)
cos
函数的跟踪点,并查看您的代码
def distance(lat1, lon1, lat2, lon2):
p = 0.017453292519943295 #Pi/180
a = (0.5 - cos((lat2 - lat1) * p)/2 +
似乎您将gurobipy.Var
至lat1
和lon1
的实例插入此函数以制定目标函数。这将不起作用,因为
cos
函数将不知道如何处理gurobipy.LinExpr
产生的lat2 - lat1
对象(因此出现错误消息),并且您可以尝试通过Model.setPWLObj()
函数将目标函数表述为分段线性函数。