Почему GLPK выдает ошибку "не может выполнить glpsol.exe", в то время как решатель PuLP по умолчанию работает отлично?

Пытаясь решить проблему двоичного целочисленного программирования с PuLP и используя GLPK в качестве решателя, я получаю следующую ошибку. Я установил GLPK в Windows, а также установил путь. Результат pulp.pulpTestAll() шоу Solver <class 'pulp.solvers.GLPK_CMD'> passed

Traceback (most recent call last):
  File "C:\Python34\Cloud 5.py", line 464, in <module>
    resource(request, pmachine, l, q)
  File "C:\Python34\Cloud 5.py", line 238, in resource
    status = prob.solve(pulp.GLPK())
  File "C:\Python34\lib\site-packages\pulp-1.6.1-py3.4.egg\pulp\pulp.py", line 1643, in solve
    status = solver.actualSolve(self, **kwargs)
  File "C:\Python34\lib\site-packages\pulp-1.6.1-py3.4.egg\pulp\solvers.py", line 346, in actualSolve
    raise PulpSolverError("PuLP: cannot execute "+self.path)
pulp.solvers.PulpSolverError: PuLP: cannot execute glpsol.exe

Однако, когда я использую решатель PuLP по умолчанию, он работает отлично. я использую status = prob.solve(pulp.GLPK()) позвонить решателю. Полный код Python очень длинный, поэтому я не разместил его здесь. Выход получен из prob.writeLP('problem.txt') для PuLP выглядит следующим образом:

\* Resource *\
Maximize
OBJ: 2 _y11 + 2 _y12 + 10 _y21 + 10 _y22
Subject To
_dummy: __dummy = 0
_C1: __dummy = 0
_C10: 100 _x121 + 200 _x221 <= 1024
_C11: _y11 + _y12 <= 1
_C12: _y21 + _y22 <= 1
_C13: _x111 - _y11 <= 0
_C14: _x112 - _y11 <= 0
_C15: _x121 - _y12 <= 0
_C16: _x211 - _y21 <= 0
_C17: _x212 - _y21 <= 0
_C18: _x221 - _y22 <= 0
_C19: _x111 + _x121 = 0
_dummy: __dummy = 0
_C2: __dummy = 0
_C20: _x211 + _x221 = 0
_C21: _x111 + _x121 = 0
_C22: _x211 + _x221 = 0
_C23: _x111 = 0
_C24: _x121 = 0
_C25: _x211 = 0
_C26: _x221 = 0
_C27: _x111 + _x112 + _x121 = 1
_C28: _x211 + _x212 + _x221 = 1
_dummy: __dummy = 0
_C3: __dummy = 0
_dummy: __dummy = 0
_C4: __dummy = 0
_C5: _x111 + 2 _x211 <= 4
_C6: _x112 + 2 _x212 <= 8
_C7: _x121 + 2 _x221 <= 4
_C8: 100 _x111 + 200 _x211 <= 1024
_C9: 100 _x112 + 200 _x212 <= 2000
Bounds
__dummy = 0
Binaries
_x111
_x112
_x121
_x211
_x212
_x221
_y11
_y12
_y21
_y22
End

Почему GLPK выдает ошибку? Используя решатель по умолчанию, получается:

Optimal
Objective value: 12.0

The values of the variables : 

__dummy = None
_x111 = 0.0
_x112 = 1.0
_x121 = 0.0
_x211 = 0.0
_x212 = 1.0
_x221 = 0.0
_y11 = 1.0
_y12 = 0.0
_y21 = 1.0
_y22 = 0.0

1 ответ

Решение

На самом деле это не ответ. Я планировал добавить это как комментарий. Но я не могу написать комментарий, так как у меня сейчас нет 50 репутации. Так что я просто поставлю это как ответ здесь. Я чувствую, что проблема не в вашей программе. Ваша программа должна быть в порядке. Но может быть некоторая проблема в переменных окружения или разрешениях. Если pulp.pulpTestAll() хорошо сработало для вас, тогда предполагается, что по крайней мере такой ошибки нет cannot execute glpsol.exe, Но вы можете непреднамеренно изменить некоторые настройки, которые могут вызвать эту проблему.

Так что вот что может быть полезным. Проверьте этот блок кода в PuLP, который является причиной сбоя вашей программы.

def executable(command):
    if os.path.isabs(command):
        if os.path.exists(command) and os.access(command, os.X_OK):
            return command
    for path in os.environ.get("PATH", []).split(os.pathsep):
        new_path = os.path.join(path, command)
        if os.path.exists(new_path) and os.access(new_path, os.X_OK):
            return os.path.join(path, command)
    return False
    executable = staticmethod(executable)

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

Другие вопросы по тегам