web-dev-qa-db-ja.com

最良の結果を生み出す入力の組み合わせを見つけるために、どのようなプログラミング手法がありますか?

私は現在、大量のデータを扱っており、いくつかの入力に基づいて結果を計算するプログラムを作成しました。私には10個の入力があり、それぞれに約20個の異なる可能な値があります。最大の結果を生み出すこれらの入力の組み合わせを見つけるためにどの手法を使用すればよいかわかりません。

これは、本質的には本物と同等ですが、より簡単に説明できる構成例です。

映画、ユーザー、ユーザー評価があります。ユーザーの年齢、国、性別、星座、髪の色などに関する情報があるとします。このシナリオの目標は、平均が最大になる年齢間隔、国、性別などの組み合わせを見つけることです。特定の映画の評価。最後に、最小投票数の制限を追加して、映画に満点を与えた1人のユーザーを返す入力の組み合わせを取得したときに、この組み合わせを無視するようにします。

私がすでに試したこと:

  1. ネストされたforループ。このようにして、考えられるすべての組み合わせがテストされますが、1か月間実行されます-長すぎます。
  2. ある種の遺伝的アルゴリズム。プログラムに入力のランダムな値を選択させ、最良の結果に貢献した値を保存して再利用します。プログラムが同じ値で長時間スタックする場合は、ミューテーションを適用します。この方法を使用していくつかの良い結果が得られましたが、異なる実行でそれらを頻繁に再現できなかったため、このアプローチを使用した場合のさらに良い結果を見逃している可能性があります。
  3. 私は各入力を個別に分析し、残りの入力にデフォルト値を与えてから、最良の個々の入力を組み合わせようとしました。方法2と同じ結果。

この種の問題を解決するための既知のアルゴリズム/手法があるかどうかを知りたいです。

2
Limbo Exile

これは具体的な助けにはなりませんが、おそらくいくつかの励ましです。

  • すべてをチェックする余裕がないことはすでに計算済みです20^10値の組み合わせ。大丈夫。これは、近似解を使用する必要があるかもしれないことを意味しますが、ほとんどの実際の問題では、近似解は理論上の最適値と比較してそれほど悪くはありません。
  • これは、値を変更する必要があることを意味しますnon-体系的に。それを完全にランダムに行うことは、突然変異がランダムで生存のみが指示される遺伝的プログラミングに相当します。
  • 体系的に価値観を変えるということは、おそらく、改善をもたらした個々の価値観を維持し、他の価値観を変えることを意味します。その希望は、あるコンテキストでうまく機能する設定が別のコンテキストでもうまく機能する可能性があるため、個別に最適な設定を組み合わせることで、最適な組み合わせ設定を概算できることです。
  • この仮定が正当化されるかどうかは、通常、問題のドメインによって異なります。数独パズルは悪夢になります。すべてのセルのすべての選択は、all行と列の隣人に依存します。値を自分で明確に推測し、それらを組み合わせると、どこにもつながりません。しかし、多くの入力、出力、およびマテリアルフローを伴う複雑な製造プロセスは、個別のサブコンポーネントを一度に1つずつ最適化することで、非常にうまく近似できる可能性があります。
2
Kilian Foth

線形計画法 を見てください。そのような操作を実行するいくつかの商用ツールがあります(例:IBM ILOG CPLEX、GAMS)。

ウィキペディアのページの説明を読んで、使用できる最も重要なアルゴリズムを確認できます。

0
djvuk