非常に計算が複雑になるアルゴリズムを実装しています。不要な作業を行わないようにしたいと考えています。
nxnxnの立方格子があります。たとえば、n = 2の場合、これは(0,0,0)、(0,1,0)、(1,0,0)、(1,1,0)、(0、 1,1)、(0,0,1)、(1,0,1)、(1,1,1)。
このラティスから、次のようなmポイントのすべてのセットを再帰的に生成します。
solve(set_of_points) {
if set_of_points.size = m, finish
do some useful computation here
for each point in lattice not in set_of_points:
solve(set_of_points + new_point);
}
これは、空のset_of_pointsから開始して呼び出すことができます。
問題の性質上、実際にはm個の点のすべての順列が必要なわけではなく、立方体の自然な対称性の下で一意であるものだけが必要です。
たとえば、2x2x2の立方体を取り、1点のすべてのセットが必要だとします。上記の基本的なアルゴリズムの下では、1つのポイントの8つの異なるセットがあります。
ただし、立方体の対称性を使用すると、元の8はすべて立方体の対称性の下で同等であるため、これを1ポイントの一意の1セットに減らすことができます(この場合、それらはすべて「コーナー」です)。
立方体が2x2x2でm = 2の場合、基本アルゴリズムには28セットありますが、これは対称性の下では3に減少します(例{(0,0,0)、(1,0,0)}、{(0 、0,0)、(1,1,0)}、{(0,0,0)、(1,1,1)})
明らかに、3つのポイントセットで計算を行う方が28よりもはるかに優れているので、私の質問は、すでに生成されたセットと対称的に等しいポイントのセットを生成しないようにするにはどうすればよいですか?または、これが不可能な場合は、少なくともセットの数を少し減らすにはどうすればよいですか。
(注-m = 1の場合、これは比較的簡単です。他のどの頂点よりも(0,0,0)に近い点を選択し、境界を少しぼかします。m> 1の場合、本当の問題になる)