Ошибка GurobiError: слишком длинное имя (максимальная длина имени — 255 символов)

#python #optimization #gurobi

#python #оптимизация #gurobi

Вопрос:

Я определяю параметр t[i,s] следующим образом:

 for i in Trucks:
    for s in Slots:
        t[i,s]=m.addVar(vtype=GRB.CONTINUOUS, name="t[%s,%s]"%(i,s))
  

Я вызываю значения t[i,s] из файла Excel. I — это список, содержащий числа от 0 до 263, также s — это список от 1 до 24. Проблема возникает, когда я запускаю код, возникает следующая ошибка:

 GurobiError: Name too long (maximum name length is 255 characters)
  

Как я могу это исправить?

Ответ №1:

В случае, если элементы в Trucks и Slots являются просто строками, вы можете ограничить длину, передаваемую имени переменной, следующим образом:

 maxlen = 250
for i in Trucks:
  for s in Slots:
    t[i,s] = m.addVar(vtype=GRB.CONTINUOUS, name="t[%s,%s]"%(i[:maxlen],s[:maxlen]))
  

Строки в Python можно обрабатывать так же, как любой другой массив, и поддерживают нарезку.

Комментарии:

1. i — это список, содержащий числа от 0 до 263, также s — это список от 1 до 24.

2. Это кажется неправильным и также не должно вызывать вышеуказанную ошибку. Если i и s являются списками, какие переменные должны представлять?

3. Я имею в виду, что элементы в наборе «Грузовики» содержат список чисел от 0 до 263. i принадлежит набору грузовиков.

4. Просто поделитесь примером, пожалуйста. Вы попробовали мое предложение? Вам нужно найти какую-либо форму подписи или сокращения, если желаемое имя слишком длинное.

5. Я решил проблему. Спасибо за ваш ответ. Ошибка заключалась в ошибке ввода.

Ответ №2:

к сожалению, нет отличного способа справиться с этим или что ограничение вообще существует. Конструкторы переменных gurobipy хорошо работают при использовании списков последовательностей для определения наборов / индексов, над которыми существует переменная.

Но тогда имена переменных, которые являются строками, становятся функцией списка кортежей, имеют ограничение в 255 символов, и, похоже, нет никакого хорошего способа управлять этим (если вы не начнете манипулировать своими кортежами, и в этом случае вы можете потерять информацию, которую хотели сохранить).

  1. почему вы не можете настроить ограничение в 255 символов, если это необходимо? Если есть, я его не нашел
  2. учитывая, что существует ограничение, почему бы gurobipy просто не сократить имя до 255 символов? насколько я могу судить, это на самом деле не повлияет ни на что, кроме того, как переменная отображается при печати в файле модели (например, в формате .lp).

разочаровывает, что ответ просто «к сожалению, это работает таким образом». это может привести к сбою модели, хотя на самом деле нет никаких серьезных причин для ее сбоя