2022年3月21日月曜日

Python中SeqErrorの使い方

下記のような制約文を例に説明します。

s="週あたりの勤務回数設定"+str(week)+' '+"person"+str(person) sc3.AddSoft(sc3.SeqError(min,max,2,VList),s,7) 

 SeqErrorの中身はとりあえず無視して、AddSoftの中身です。 s=は、エラー解析表示用のための文字列です。ハードエラーが出て、その原因表示のときに使われるのみです。空白行でもよいのですが、ハードエラー時に何も表示されなくて手がかりが無くなってしまうので、 付加しています。 

 sc3.AddSoft(sc3.SeqError(..),s,7)

 次に、7ですが、これは、ソフトレベルで、求解画面で、言語:7となっている筈です。 つまり、上記文は、「ソフトレベル7のソフト制約を実行しなさい、」という意味になります。 次に、sc3.SeqErrorの意味ですが、アドバンストユーザマニュアル、エラー許容量の設定が、対応するGUIの説明になります。(GUIの設定ですが、エンジン内部では、SeqErrorが動いています。) 
 SeqError(最小値、最大値、エラー許容量、対象集合) 

となっています。たとえば、min=6,max=6, エラー許容量=2だと、min-2<==x<=max+2となって、 ソフト制約の範囲は、4-8までに制約されます。言い換えると暗黙のハード制約 4<=x<=8 が制約として入っているということになります。これ以上は、いくらなんでも許容できない、というときのリミッタとすることがその目的です。

 で、私が作成するプロジェクトでは、この辺の設定を大体3位に設定していることが多いと思いますが、 これは、もちろんその制約毎に相応しい値が存在すると思います。これでエラーが出た場合は、調整が必要になる場合もあります。 エラーが出た場合は、見直して、たとえば、上記の場合、 エラー許容量を 2→4 とすれば、 2<=x<=10 に拡大されます。この範囲であれば、ソフト制約として作用し、6からの偏差が目的関数値に加算されます。 しかし、xが1以下または、11以上しかとり得ないときは、ハードエラーとして報告されます。

0 件のコメント:

コメントを投稿