「半人前」を実現するために導入した制約関数であり、通常の制約関数とは異なります。
この関数は、2種類のリストの一部としか機能しません。2種類のリストとは、
■sc3.SeqError(min,max,allowable_errors,list)
■sc3.SoftLinearComp(eq_mode, CoffA, CoffB, offset, allowable_errors,listA,listB);
です。この2種類しかサポートしません。
パラメータは、二つしかなく、
■sc3.UnaryCounter(bitstart,bit_interval)
です。
UnaryCounterとは、1進加算器のことであり、ビットの桁数は、入力の個数だけあります。
つまり桁上がりがないカウンタになります。
ビットスタート0、ビットインターバル1だと、そのままの出力になります。
ビットインターバル2だと、一つ飛びに出力されます。/2されるイメージです。
ビットスタートは、mod演算に対応します。下図は、bit interval=2のときの様子ですが、
同じbit interval=2でも、bitstartによって、エンコードの様子が異なります。
余りがないときは、どちらも同じですが、一人のときを1人と数えるか0人と数えるかの違いがあります。どちらのエンコードを指定するかは、bit_startを指定すれば決まります。
これは、アルゴリズム3/4でのグラフ構造になります。アルゴリズム1は、同じ1進加算を使いますが、また別の構造により実現します。
アルゴリズム2と3/4の数理表現では、次のような記述になっています。
上のような回路構造の記述と異なり、数理的な表現になります。
ip.add_constraint(num_working <= (bit_interval) * x+bit_start, x);
ip.add_constraint(num_working >= (bit_interval) * x-(bit_interval-1-bit_start), x);
つまり、同じUnaryCouter機能を実現するのに、アルゴリズム毎に記述を変える必要があります。どれも、同じ機能には違いないのですが、テクノロジーが違うと全く違う表現になる様子を紹介しました。
組み合わせ最適化は、一つのテクノロジだけでは、網羅できません。広範囲のテクノロジーを組み合わせて、スケジュールナース最適化は成っているのです。
0 件のコメント:
コメントを投稿