Как установить допуск разрыва в cplex-python? - PullRequest
2 голосов

Я хочу установить значение разрыва (GAP) таким образом, чтобы процесс оптимизации останавливался, когда текущий разрыв будет ниже, чем GAP.Я прочитал документацию cplex-python и обнаружил, что:

Model.parameters.mip.tolerances.absmipgap(GAP)

, но получаю следующее предупреждение:

Model.parameters.mip.tolerances.mipgap(float(0.1))
TypeError: 'NumParameter' object is not callable

есть идеи?Помогите мне, пожалуйста.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Ваша ошибка - вызывать параметр, как если бы он был функцией. Правильный способ изменить параметр - присвоить ему:

Model.parameters.mip.tolerances.absmipgap = GAP

Также убедитесь, что вы используете не класс Model, а экземпляр этого класса:

mdl = Model()
mdl.parameters.mip.tolerances.absmipgap = GAP

Также имейте в виду, что есть два параметра разрыва: абсолютный и относительный. Относительный разрыв является наиболее часто используемым. Вы можете найти документацию для здесь и здесь (параметр для относительного допуска называется просто mipgap).

1 голос
/ 21 мая 2019

Исходя из полученной ошибки, я думаю, что вы можете использовать CPLEX Python API, а не docplex (как в других ответах). Чтобы решить вашу проблему, рассмотрите следующий пример:

import cplex                                                                    
Model = cplex.Cplex()                                                           
# This will raise a TypeError                                                   
#Model.parameters.mip.tolerances.mipgap(float(0.1))                             
# This is the correct way to set the parameter                                  
Model.parameters.mip.tolerances.mipgap.set(float(0.1))                          
# Write the parameter file to check that it looks as you expect                 
Model.parameters.write_file("test.prm")

Вам необходимо использовать метод set(). Вы можете убедиться, что параметр изменился, как и ожидалось, записав файл параметров на диск с помощью метода write_file и просмотрев его.

1 голос
/ 21 мая 2019

Позвольте мне адаптировать мой пример автобуса к вашему вопросу:

from docplex.mp.model import Model

mdl = Model(name='buses')

# gap tolerance
mdl.parameters.mip.tolerances.mipgap=0.001;


nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

print("gap tolerance = ",mdl.parameters.mip.tolerances.mipgap.get())

, что дает:

nbBus40  =  6.0
nbBus30  =  2.0
gap tolerance =  0.001
...