読者です 読者をやめる 読者になる 読者になる

PythonからCplexを呼び出す

PythonからCplexを呼び出す方法のメモ
Cplexはすでにインストール済みとする.


まずは,pythonからcplexモジュールを使えるようにする.
Windowsの場合は

 C://Program Files/IBM/ILOG/CPLEX_Studio1263/cplex/python/2.7/x64_win64/

Macの場合は

 ~/Applications/IBM/ILOG/CPLEX_Studio126/cplex/python/x86-64_osx/

にあるsetup.pyを以下のように実行する:

 python setup.py install

次のLPを解くことを考える.

max  20 x + 30 y
s.t. x + 2 y <= 800
     3 x + 4 y <= 1800
     3 x + y <= 1500
     x,y >= 0

次のようなpythonプログラムを書くことで最適解を求めることができる.

import cplex

var = ['x', 'y'] # variables
b = [20, 30] # objective function
c = [800, 1800, 1500] # constraints
A = [
      [var, [1, 2]],
      [var, [3, 4]],
      [var, [3, 1]],
    ]

prob = cplex.Cplex()
prob.objective.set_sense(prob.objective.sense.maximize) # maximization problem
prob.variables.add(obj=b, names=var)
prob.linear_constraints.add(lin_expr=A, senses=['L']*3, rhs=c)
prob.solve()

x = prob.solution.get_values()
for i in range(len(var)):
    print "{} = {}".format(var[i], x[i])
print prob.solution.get_objective_value()
  • 目的関数
    • 最小化問題を解きたい場合は,
 prob.objective.set_sense(prob.objective.sense.minimize)
  • 制約
    • 不等式の向き(sense)は,'L', 'E', 'G'で,≦,=, ≧を表す.
    • 各行について,リストの0番目を変数の一部にすることで,係数0の変数を省略できる.
  • 変数
    • デフォルトは非負実数
    • variables.addをするときに,下界をlbで,上界をubで,変数の型をtypeで指定できる.
    • typeは'B','I','N','C','S'があり,それぞれ{0,1},整数,非負整数,実数,非負実数
    • 例えば -3<=x<=7 なる整数変数を用意したい場合は,
 prob.variables.add(names=['x'], lb=[-3], ub=[7], types=['I'])