制約式種の変更

3.8.7. 制約式種の変更#

今回はソフト制約関数などの 制約式種 のテクニックを紹介します.

ソフト制約を含む最適化問題を多段階求解したいとします. 一度目の求解でソフト制約 cons を満たせるようであれば,cons をハード制約として二回目の求解をします. このような場合,どのように記述するのがよいでしょうか.

単純に考えられるのが,一度目の求解後にソフト制約 cons を問題から削除し, 再度ハード制約として追加し直す方法です. なお,制約式 cons の制約式種は weight 属性で確認することができます.:

>>> x = Variable(name='x')
>>> p = Problem()
>>> cons = x >= 1
>>> p += cons, SoftConstraint(1), 'cons'
>>> p['cons'].weight
SoftConstraint(1, 0.0, 1.0)
>>> del p['cons']
>>> p += cons, HardConstraint(), 'cons'
>>> p['cons'].weight
HardConstraint()

実は,この weight 属性は読み取りだけでなく,変更も可能です. weight 属性を直接変更する場合,次のように記述します.

>>> x = Variable(name='x')
>>> p = Problem()
>>> p += x >= 1, SoftConstraint(1), 'cons'
>>> p['cons'].weight
SoftConstraint(1, 0.0, 1.0)
>>> p['cons'].weight = HardConstraint()
>>> p['cons'].weight
HardConstraint()

前述のように問題から制約式を削除することなく,同等の操作ができています.

やっていることは同じですが,PySIMPLE では,より便利かつ直観的な記述ができるよう, 痒い所に手が届く設計となっております.