Почему 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

person kauray    schedule 08.06.2016    source источник


Ответы (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)

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

person fmars    schedule 26.07.2016