Gurobi Remote Serviceを使用する場合、特にCompute Serverがローカルネットワーク上にない場合には、通信のオーバーヘッドを考慮することが重要です。 Compute ServerやInstant Cloudにおいて、変数や制約に名前で効率的にアクセスするための方法がいくつかあります。
制約の名前に一つ一つアクセスする:
Gurobi v9.0.1以降では、getVars()
と getConstrs()
を呼び出すと、変数名と制約名がローカルにキャッシュされます。 特にGurobi v9.0.1以降では、次のように実行すると:
constrs = model.getConstrs()
for c in constrs:
print(c.constrName)
遅延は最小に近くなります。したがって、制約名を使って制約属性にアクセスするときには、上記のような最も単純なアプローチが推奨されます。
1回の呼び出しですべての制約名を参照する:
制約名を検索するのに時間がかかる場合は、すべての制約名を一度に引き出すクエリを利用します:
Cnames = model.getAttr('constrName', model.getConstrs())
その後Cnames
配列を利用して制約名へアクセスすることで遅延を削減することができます。
モデル作成時に制約名を保存する:
以前のバージョンのGurobiでも利用可能なもう1つの方法は、モデル作成時に制約名の辞書をローカルに構築する方法です:
my_constr = {}
my_constr["myConstrName"] = model.addConstr(x + y <= 1, name="myConstrName")
同様のことが変数名でも可能です。
名前でクエリする:
getVarByName
や getConstrByName
を使った名前によるクエリは、顕著な通信のオーバーヘッドをもたらす可能性があります。変数名のような文字列の値はキャッシュされないので、大きな違いがあらわれます:
name_single = [v.VarName for v in model.getVars()] # time: 46.20
name_all = model.getAttr('VarName', model.getVars()) # time: 0.05
このような情報は通常(使用時に)多くのメモリを必要とするためキャッシュされません。Gurobiはこれらの値を内部的には気にせず、モデルの一部としてのみ保存します。ここで遅延が発生する理由は、属性の値を要求するたびに、サーバーに新しいリクエストが送信されるためです。
このため、クラウドやCompute Server環境では、以下のようなコードの実行は避けるべきです:
for name in names: x = model.getVarByName(name)
コメント
0件のコメント
記事コメントは受け付けていません。