並び替え問題を、設計変数制約を使って、簡単に行う方法


始めに

例えば、設計変数 a1, a2, a3, a4, a5 が 1, 2, 3, 4, 5 を、一度限りで重複なく選択するようにさせる、簡単な方法をお伝えします。

実は、Templex (HyperStudy 内蔵のプログラミング言語) や Python などで、ベクトル(プログラミング言語的には配列) の要素をごにょごにょごにょとしなくてはならないのではないかと、思っていたのですが、設計変数に制約を与えるだけで、簡単に実現できます。

 

方法

 

まず、↓のように、設計変数に、離散値で 1, 2, 3, 4, 5 を与えます。このままだと当然重複してしまいます。

(クリックで拡大)

 

重複させないために、制約を与えるのですが、「重複するな」という便利な命令はないので、数式で考えます。こういう重複問題を考えるときに便利なのが 2進数です。だまされたと思って、まずは、次の制約を与えてみてください。

 

2^(a1-1)+2^(a2-1)+2^(a3-1)+2^(a4-1)+2^(a5-1) = 31

 

「等しい」と言う制約がないので、 31以上、31以下でサンドイッチしています。

(クリックで拡大)

 

これ、(2進数)11111 = (10進数)31 となります。10進数の 31 以外の数値が 31になることはできないのと同様に、2進数も 11111 以外に 11111 になれるものは無いのです。

 

せっかくなので、試しに

 

a1+a2+a3+a4+a5=15

 

と言う評価式を考えてみましょう。残念ながら、この場合だと

 

1+2+3+4+5 = 15

1+1+4+4+5 = 15

1+2+2+5+5 = 15

 

というように、いくらでもパターンができてしまうのです。

 

ということで、この制約を与えておけば DOE でも最適化でも、HyperStudy が実際のジョブを実行する前に、違反している組み合わせは除外するので、結果には、重複のないものだけが並びます。

(クリックで拡大)

 

(クリックで拡大)

 

スクリーンショットに使った HyperStudy ファイルを置いておくので、ぜひ確認してみてください。

ダウンロード: Study_1.hstx