CPLEXPythonの半連続制約

Sep 02 2020

MIQP最適化問題として再定式化された半連続最適化問題があります。

私の目的は二次形式です $x^{T}Qx$ と私 $x_{i}$ のような $x_{i} \in [m,M] \cup \{0\}$。したがって、バイナリ変数のベクトルを導入します$y$ といった $y_{i} \in \{0,1\}$ そして、次の制約を考慮してください。 $x_{i}$ : $m * y_{i} \leq x_{i} \leq M * y_{i}$。

したがって、私の最適化問題は、目的関数、 $x_{i}$ およびのバイナリ制約 $y_{i}$。

CPLEXの問題を解決しようとしていますが、範囲制約を指定するのに問題があります。 $x_{i}$。これが私がこれまでに制約について持っているものです:

myProblem=cplex.Cplex()

#define the variables
names_amounts=["amounts " + str(i) for i in range(50))]
names_binary=["binary " + str(i) for i in range(50))]
myProblem.variables.add(ub=[1]*50,
                        lb=[0]*50,
                        names=names_amounts)
myProblem.variables.add(ub=[1]*50,
                        lb=[0]*50,
                        names=names_binary)
for i in range(50):
    myProblem.variables.set_types("amounts " + str(i), myProblem.variables.type.continuous)
    myProblem.variables.set_types("binary " + str(i), myProblem.variables.type.integer)

#define the constraints
myProblem.linear_constraints.add(
        lin_expr=[[names_amounts,[1]*50]],
        senses=['E'],
        rhs=[1.0])

範囲制約を追加する必要がありますが、その方法がわかりません。私は自分のsenses属性がになることを知っていますが['E'] + ['R' for i in range(50)]、lin_exprとrhs属性はどうですか?rhsバイナリ変数を使用して属性の依存関係を指定するにはどうすればよいですか?

回答

6 AlexFleischer Sep 02 2020 at 22:12

これは、docplex pythonAPIを使用すると非常に簡単に実行できます。

変えさせて

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoosemiinteger.py

から

https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

半連続に

from docplex.mp.model import Model

# original model

mdl = Model(name='buses')
nbbus40 = mdl.semicontinuous_var(4,20,name='nbBus40')
nbbus30 = mdl.semicontinuous_var(4,20,name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

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