Ошибка типа: должно быть действительным числом, а не gurobipy.LinExpr - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь использовать функцию, которая определяет расстояние между двумя координатами в моей модели 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 голосов
/ 25 апреля 2019

Трассировка указывает на функцию cos и смотрит на ваш код

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

похоже, что вы подключаете экземпляры от gurobipy.Var до lat1 и lon1 к этой функции, чтобы сформулировать свою целевую функцию. Это не будет работать, потому что

  • функция Python cos не будет знать, что делать с объектом gurobipy.LinExpr, созданным lat2 - lat1 (отсюда и сообщение об ошибке), и
  • Gurobi поддерживает только линейные, кусочно-линейные и квадратичные целевые функции (см. Также обзор продукта ).

Вы можете попытаться сформулировать свою целевую функцию как кусочно-линейную функцию с помощью функции Model.setPWLObj().

...