2018年4月19日木曜日

CPLEX の前処理をパズル感覚で楽しむ

最近、CPLEX で LP を解いているが、CPLEX の前処理が思っていた以上に優秀である。
例えば、A*x = b という等式制約を A*x <= b と (-A)*x <= (-b) と2つの不等式制約に分解すると一般的には内点がなくなるので、内点法では解きにくいはずである。しかも、A と (-A) が両方入ると行の線形独立も失われれる。
単純に内点法を組むとうまく行かない、という典型例なのだが、CPLEX だと前処理がきちんと働いて、それなりに数値的に安定して解ける。

ということで、CPLEX の前処理ではうまく処理できないような LP の例を簡単に作れないだろうか?ということを試してみているのだが、これがパズル感覚でなかなかに面白い。
単純に A と (-A) を入れるだけでなくて、もう少し細工をしたりすると CPLEX が CPX_STAT_NUM_BEST を返すようになる。

もっと単純な例で CPX_STAT_NUM_BEST を出せないだろうか?と、ついついいじり倒してしまう。

ただ、「こういう例で CPX_STAT_NUM_BESTを出せるよ」という例題をインターネットに公開してしまうと、CPLEX の開発者がうっかり見つけてしまって、それを回避してしまう前処理を入れてしまうかもしれないから、イタチごっごかもしれないけど。

0 件のコメント:

コメントを投稿