私はKakuro Game in javaで作業しています。カクローは、スドクに似たゲームです。 KakuroとSubset Sum、スーパーセットには連続する正の整数が含まれ、サブセットは固定サイズのkです
Kakuroの目的は、各「領域」に重複する番号がないように、1から9までの整数でそれらの空白ブロックを記入し、領域内の空白ブロックのすべての数値が地域の「ヒントブロック」の番号。領域の例は、上記の図では赤色で示されています。
ここで私がやっているのは、与えられたカクロのパズルを自動的に解決できるAIを書くことです。これはまず、K個の要素の可能なすべての組み合わせを整数の範囲集合(1,9)から見つける必要があり、そのK要素の合計がその領域の "hintblock"に示された数と等しくなるようにする必要があります。 (この場合、Kはその領域内の空白ブロックの数です)これは、スーパーセットがはるかに均一で(1から9までの連続する整数)、サブセットが固定サイズであることを除いて、「サブセット問題」のバリエーションですK. さらに良い点は、スーパーセットの範囲を手前に減らすことができることです。たとえば、画像の右側のブロックを参照してください。この場合の合計は24であり、Kは3である。この領域内の任意のブロックを選択し、他のすべてのブロックが可能な限り最大値であると仮定すると、任意のブロックが(24- 9 + 8))= 7となる。 (24-(1 + 2))= 21を計算することによって最大値を得ることもできますが、これは21> 9なので問題はありません。従って、スーパーセットは{7,8,9}になる。
この領域は、K =スーパーセットサイズのため、簡単なケースです。ただし、Kがスーパーセットサイズよりもはるかに小さい場合は、すべての組み合わせをチェックすると(SuperSize-K)が計算されます。時間。これは非効率的です。今私の質問は、このケースに最も適しているサブセットの合計問題の解決策がありますか?私はJavaでコードを作成しますが、SPLやBrainF * ckを含むプログラミング言語は大歓迎です。
これは素晴らしいアイデアです。私は間違いなくそれを試してみましょう!しかし、もし数が大きければどうなるでしょうか?整数の範囲が1から30の範囲であると仮定すると、このメソッドはどれくらいうまく機能しますか? – Ptolemorphism
n == 30の場合はほとんど機能しません。対称性を介してストレージの半分を節約することができます(サイズkとsumのすべての集合は、サイズn-kと合計n(n + 1)/ 2-sのセットの逆です)。セットを4バイトのビットマスクとして表現すると、そのすべてを保持するのに2GB必要になります。しかし、おそらく最適な解決策ではありません。 Otoh、n == 30のユニークなソリューションkakurosは、たくさんの四角形を埋めるのでなければ、簡単に見つけることができません。解決策を見つけることは難しいかもしれません。 – rici
あなたの答えは非常に洞察力と有用です! N = 30は、あまりにも多くの複雑さを生み出します。ですから、Nを9または15に制限したい場合は、言及したように、ソリューションを事前に計算するのが最善のソリューションですか?私はそれらのサイズ(k)とその合計に基づいて、2dリストまたは配列でそれらの事前計算されたサブセットを編成することを考えています。ソリューションを見つける必要があるときは、サイズと合計を使用して、潜在的なソリューションをすばやく見つけます。この考え方についてどう思いますか?私は一般的にプログラミングにかなり新しいですが、これはハッシュテーブルに似ていると思いますか?私が間違っているなら、私を修正してください。 – Ptolemorphism