何千ものIF…THEN…ELSEルールをどのように管理できますか?


214

私はアプリケーションを構築することを検討しています。そのアプリケーションのコアは、数千のif ... then ... elseステートメントで構成されます。このアプリケーションの目的は、あらゆる風景で牛がどのように動き回るかを予測できるようにすることです。彼らは太陽、風、食物源、突然の出来事などの影響を受けます。

このようなアプリケーションはどのように管理できますか?数百のIFステートメントの後、プログラムがどのように反応するかは予測不可能であり、特定の反応につながることをデバッグすると、毎回IFステートメントツリー全体を走査する必要があることを意味すると思います。

ルールエンジンについて少し読みましたが、この複雑さをどのように回避できるかわかりません。


22
DSLプログラミングを見る必要があります:en.wikipedia.org/wiki/Domain-specific_languageさらに、データ駆動型のメタルールエンジンを作成することもできます。たとえば、データからモデルを生成できます(データマイニングKDDなど)
ダークナイト

14
「エキスパートシステム」と「rete net」のgoogle。幸運を。
スティーブンA.ロウ

9
ハードコードされたif / thenステートメントをソースコードからシミュレーションを駆動する外部データに移動します。
-Kwebble

6
テキストファイルにいくつかの値を入れ、ループを使用して名前を含むHashMapを調べました。
ジェームズP.

2
David-プログラマーの質問は、15を超える回答が投稿されるとCWに変換されます。16番目の回答を投稿するユーザーを制御することはできません。
ChrisF

回答:


73

ロジックプログラミング言語のPrologは、あなたが探しているものかもしれません。あなたの問題声明は、それが適切かどうかを評価するほど具体的ではありませんが、あなたの言うこととかなり似ています。

Prologプログラムは、適用されるファクトとルールで構成されます。「牛が空腹で、古い場所よりも新しい場所に多くの食物がある場合、牛はその場所に移動する」というルールの簡単な例を次に示します。

moves_to(Cow, Location) :-
  hungry(Cow),
  current_location(Cow, OldLoc),
  food_in(OldLoc, OldFood), food_in(Location, NewFood),
  NewFood > OldFood.

大文字のすべてのものは変数であり、価値がわからないものです。プロローグは、すべての条件を満たすこれらの変数の値を見つけようとします。このプロセスは、Prologおよび類似のロジックプログラミング環境の中心である統合と呼ばれる強力なアルゴリズムで実行されます。

ルールに加えて、事実のデータベースが提供されます。上記のルールで動作する簡単な例は、次のようなものです。

current_location(white_cow, pasture).

current_location(black_cow, barn).
hungry(black_cow).

current_location(angry_bull, forest).
hungry(angry_bull).

food_in(barn, 3).
food_in(pasture, 5).
food_in(forest, 1).

white_cowや牧草地などは大文字で書かれていないことに注意してください。それらは変数ではなく、アトムです。

最後にクエリを作成し、何が起こるかを尋ねます。

?- moves_to(white_cow, Destination).
No.
?- moves_to(black_cow, Destination).
Destination = pasture
?- moves_to(Cow, Destination).
Cow = black_cow, Destination = pasture
Cow = angry_bull, Destination = barn
Cow = angry_bull, Destination = pasture

最初のクエリは、白い牛がどこに移動するかを尋ねます。上記の規則と事実を考えると、答えは「いいえ」です。これは、あなたが望むものに応じて「わからない」または「動かない」と解釈できます。

2番目のクエリは、黒牛がどこに移動するかを尋ねます。牧草地に移動して食べます。

最後のクエリは、すべての牛がどこに移動するかを尋ねます。結果として、あなたは理にかなったすべての可能なもの(牛、目的地)を手に入れます。この場合、予想通りに黒牛が牧草地に移動します。ただし、怒っている雄牛には、ルールを満たす2つの選択肢があり、牧草地または納屋に移動できます。

注:最後にPrologを書いてから数年が経ちました。すべての例は構文的に有効ではないかもしれませんが、考え方は正しいはずです。


10
-1:Prologが正しい答えになるとは思いません。はい、Prologでif-elseルールを取得するのは簡単かもしれません。しかし、確かに他のことをしなければなりません。そして、それが何であろうと(IO、GUI、Web開発など)、Prologには苦痛が伴うでしょう。
マーティントーマ

4
learnprolognow.comをご覧ください。プロローグを別の言語に埋め込むのは、以前よりもずっと簡単になりました
Zachary K 14年

@ZacharyK:リンクが壊れています。
-RenniePet

@MartinThoma:コメントを説明できますか?Prolog IMHOの主な問題は、1。検索を制御する宣言的な方法と2.入力の欠如です。あなたのアプリケーションは、これら2つに大きく依存していない場合しかし、その後、私は先験的には、ここでプロローグを使用して問題が表示されていない
SN

139

if webの問題に取り組む場合、特定のルールを個別にコーディングするルールエンジンを作成できます。これのさらなる改良は、ルールを作成するためのドメイン固有言語(DSL)を作成することですが、DSLだけでは、あるコードベース(メイン)から別のコードベース(DSL)に問題を置き換えます。構造がなければ、DSLはネイティブ言語(Java、C#など)を上回ることはないので、改善された構造的アプローチを見つけた後、DSLに戻ります。

基本的な問題は、モデル化の問題があることです。このような組み合わせの状況に遭遇するときはいつでも、状況を説明するモデルの抽象化が粗すぎるという明確な兆候です。ほとんどの場合、単一のエンティティ内の異なるモデルに属する要素を組み合わせます。

モデルを分解し続けると、最終的にこの組み合わせ効果が完全に解消されます。ただし、この方法をとる場合、設計で迷子になりやすくなり、さらに大きな混乱が生じます。ここでの完璧主義は必ずしもあなたの友人ではありません。

有限状態マシンとルールエンジンは、この問題をどのように分解して管理しやすくするかの例にすぎません。ここでの主なアイデアは、このような組み合わせの問題を取り除く良い方法は、多くの場合、デザイン作成し、システムが十分に機能するまでネストされた抽象化レベルで繰り返し吐き出すことです。フラクタルを使用して複雑なパターンを作成する方法に似ています。システムを顕微鏡で見る場合でも、高い鳥瞰図で見る場合でも、ルールは同じです。

これをドメインに適用する例。

牛が地形をどのように動いているかをモデル化しようとしています。あなたの質問には詳細が欠けていますが、大量のifには決定フラグメントが含まれif cow.isStanding then cow.canRun = trueていると思いますが、たとえば地形の詳細を追加すると行き詰まってしまいます。したがって、実行するすべてのアクションについて、考えられるすべての側面をチェックし、次の可能なアクションに対してこれらの検証を繰り返す必要があります。

まず、繰り返し可能な設計が必要です。この場合、シミュレーションの変化する状態をモデル化するFSMになります。したがって、最初に行うことは、参照FSMを実装し、状態インターフェイス、遷移インターフェイス、およびおそらく遷移コンテキストを定義することです他の2人が利用できる共有情報を含めることができます。基本的なFSM実装は、コンテキストに関係なく、ある遷移から別の遷移に切り替えます。これがルールエンジンの出番です。ルールエンジンは、遷移を行う場合に満たす必要がある条件を明確にカプセル化します。ここでのルールエンジンは、それぞれがブール値を返す評価関数を持つルールのリストと同じくらい簡単です。遷移を行う必要があるかどうかを確認するために、ルールのリストを繰り返し、それらのいずれかが偽と評価された場合、遷移は行われません。遷移自体には、FSM(およびその他の可能なタスク)の現在の状態を変更するための動作コードが含まれます。

ここで、シミュレーションをGODレベルで単一の大きなFSMとして実装し始めると、可能性のある状態、遷移などが多数発生します。if-elseの混乱は固定されているように見えますが、実際にはただ広がっています:各IF現在、コンテキストの特定の情報(この時点ではほとんどすべてを含む)に対してテストを実行するルールがあり、各IF本体は遷移コードのどこかにあります。

フラクタルの内訳を入力します。最初のステップは、状態が牛自身の内部状態(立っている、走っている、歩く、放牧など)である各牛のFSMを作成することです。グラフが完全ではない可能性があります。たとえば、放牧は立った状態からのみアクセスでき、他の遷移はモデルに単に存在しないため拒否されます。ここでは、牛と地形という2つの異なるモデルのデータを効果的に分離します。それぞれ独自のプロパティが設定されています。この内訳により、エンジン設計全体を簡素化できます。すべてを決定する単一のルールエンジンを使用する代わりに、非常に具体的な詳細を決定する複数の単純なルールエンジン(遷移ごとに1つ)を使用します。

私はFSMに同じコードを再利用しているため、これは基本的にFSMの構成です。 DSLについて以前に言及したときのことを覚えていますか?これは、書くべきルールとトランジションがたくさんある場合、DSLが多くのことを行える場所です。

さらに深く

現在、GODは牛の内部状態の管理に関する複雑さをすべて処理する必要がなくなりましたが、さらに推進することができます。たとえば、地形の管理には依然として多くの複雑さが伴います。これは、内訳が十分である場所を決定する場所です。たとえば、あなたのGODで地形のダイナミクス(長い草、泥、乾いた泥、短い草など)を管理することになった場合、同じパターンを繰り返すことができます。すべての地形状態(長い草、短い草、泥、乾燥など)を新しい地形FSMに抽出することで、そのようなロジックを地形自体に埋め込むことを妨げるものはありません。たとえば、泥だらけの状態にするには、ルールエンジンがコンテキストをチェックして液体を見つける必要があります。そうでない場合は不可能です。今、神はさらにシンプルになりました。

FSMを自律的にして、それぞれにスレッドを与えることにより、FSMのシステムを完成させることができます。この最後の手順は必要ありませんが、意思決定の委任方法を調整することで、システムの相互作用を動的に変更できます(特殊なFSMを起動するか、単に所定の状態を返すだけです)。

遷移が「他の可能なタスク」を行う可能性があることを説明したことを覚えていますか?異なるモデル(FSM)が互いに通信する可能性を追加することで、それを探ってみましょう。イベントのセットを定義し、各FSMがこれらのイベントにリスナーを登録できるようにすることができます。したがって、たとえば牛が地形へクスに進入した場合、そのへクスは遷移の変化に対してリスナーを登録できます。ここでは、各FSMがそれがハーバーする特定のドメインの知識なしで非常に高いレベルで実装されるため、少し注意が必要です。しかし、牛にイベントのリストを公開させることでこれを達成でき、セルが反応できるイベントを見つけた場合にセルを登録できます。ここでのイベントファミリの優れた階層は、優れた投資です。

草の栄養レベルと成長サイクルをモデリングすることで、さらに深く推し進めることができます。地形パッチの独自のモデルに埋め込まれた草のFSMです。

アイデアを十分に推し進めれば、すべての側面がほとんど自己管理されているため、神はほとんど何もすることができず、より信心深い事柄に時間を割くことができます。

要約

上記のように、ここでのFSMは解決策ではなく、そのような問題の解決策はコードごとにではなく、問題のモデル化方法にあることを示すための手段にすぎません。私のFSMの提案よりも可能性が高く、おそらくはるかに優れた他の解決策が存在する可能性があります。ただし、「フラクタル」アプローチは、この困難を管理するための優れた方法です。正しく実行すれば、重要な場合はより深いレベルを動的に割り当て、重要でない場合はより単純なモデルを提供できます。変更をキューに入れて、リソースが使用可能になったときに適用できます。アクションシーケンスでは、牛から牧草への栄養移動を計算することはそれほど重要ではないかもしれません。ただし、これらの遷移を記録し、後で変更を適用したり、ルールエンジンを単に置き換えたり、FSM実装を直接フィールドにない要素の単純な単純なバージョンに置き換えたりするだけで、経験に基づいた推測で近似することができます関心(フィールドの反対側の牛)により、より詳細な相互作用が焦点を獲得し、リソースをより多く共有できるようにします。システム全体を再確認することなく、これらすべてを実行できます。各パーツは十分に分離されているため、モデルの深さを制限または拡張するドロップイン置換を作成するのが簡単になります。標準設計を使用することで、その上に構築し、DSLなどのアドホックツールへの投資を最大限に活用して、イベントのルールや標準語彙を定義し、再び非常に高いレベルから開始し、必要に応じて改良を加えることができます。各パーツは十分に分離されているため、モデルの深さを制限または拡張するドロップイン置換を作成するのが簡単になります。標準設計を使用することで、その上に構築し、DSLなどのアドホックツールへの投資を最大限に活用して、イベントのルールや標準語彙を定義し、再び非常に高いレベルから開始し、必要に応じて改良を加えることができます。各パーツは十分に分離されているため、モデルの深さを制限または拡張するドロップイン置換を作成するのが簡単になります。標準設計を使用することで、その上に構築し、DSLなどのアドホックツールへの投資を最大限に活用して、イベントのルールや標準語彙を定義し、再び非常に高いレベルから開始し、必要に応じて改良を加えることができます。

私はコード例を提供しますが、これで今できることはこれだけです。


1
私はこの答えを受け入れました。それは他の解決策よりも解決策を説明する上で桁違いに優れているからです。しかし、より良いものが現れた場合、受け入れられた答えを変更するかもしれません。あなたの解決策は、変化を起こすのに十分に急進的なようにも見えます。ただし、さまざまなモデルがどのように相互作用するかについてのルールを定義する方法を理解するのにまだ問題があります。例を挙げていただけますか?
デビッド

-1決定木を介してこれを単純に解決できない理由がわかりませんか?(モデルを取得して実行可能なコードに変換するDSLと組み合わせて)?
ダークナイト

14
GOD対FSM?
ジョンクロマティー

1
デシジョンツリーとルールエンジンは、単に計算を終了するための手段であるため、手元のアスペクトをモデリングすることに本質的な価値がない場合に使用されます。これは、ヘルスケアソフトウェアで常に見られます。実際の動作をモデル化しようとしている場合は、それを試してみてください。問題で見つけられる唯一のロジックが何千ものifの結果である場合、その無限に続くケースがたくさんあります。そして、その有効性、それが我々がそれに対処するツールを持っている理由です。
-deleted_user

1
これは、ゲームプログラミングの世界で非常に成功していることが証明されています。ルールまたはプロパティを変更して動作を出現させ、値を調べてそれに基づいて行動する方法を決定する方がはるかに高速で簡単です。
ベンレジェロ

89

あなたが話しているこれらすべての条件文は、プログラム自体の一部ではなく、実際にプログラムを構成するデータでなければならないようです。それらをそのように扱うことができれば、モデルを改善するたびにコードを修正して再コンパイルする代わりに、構成を変更するだけでプログラムの動作を自由に修正できます。

問題の性質に応じて、実世界をモデル化するさまざまな方法があります。さまざまな条件が、シミュレーションに適用されるルールまたは制約になる場合があります。次のようなコードを持つ代わりに:

if (sunLevel > 0.75) {
   foreach(cow in cows) {
       cow.desireForShade += 0.5;
   }
}
if (precipitation > 0.2) {
   foreach(cow in cows) {
       cow.desireForShelter += 0.8;
   }
}

代わりに次のようなコードを使用できます。

foreach(rule in rules) {
   foreach (cow in cows) {
      cow.apply(rule);
   }
}

または、多数の入力が与えられた牛の行動をモデル化する線形プログラムを開発できる場合、各制約は方程式系の線になる場合があります。次に、それをマルコフモデルに変換して、反復することができます。

あなたの状況に適したアプローチが何であるかを言うのは難しいですが、制約をコードではなくプログラムへの入力と見なすと、はるかに楽になると思います。


4
「cow.apply(rule);」の方法を説明してください 構成ファイルで動作しますか?
クロムスター

8
@Krom、私たちが実際に話しているシステムの種類を知らずに具体的な言葉で言うのは難しいです。上記の私のポイントは、数千の条件をプログラムへの入力として扱い、それぞれのコードを記述する必要がなく、プログラムを変更せずに条件を変更できるようにすることです。しかし、はい、条件をデータとして扱うことができる場合は、何らかのドキュメントまたは構成ファイルにプログラムとは別に保存します。
カレブ

2
@Krom-シンプル。ルールを読んでから、指定された牛に適用します。
ラムハウンド

5
構成ファイルへのコードの移動は、常に良いアプローチとは限りません。マジックはデバッグが困難です。
リッキークラークソン

44

誰もこれに言及していないので、私はそれを明示的に言うと思った:

数千の「If .. Then .. Else」ルールは、設計が不適切なアプリケーションの兆候です。

ドメイン固有のデータ表現はこれらの規則のように見えるかもしれませんが、実装がドメイン固有の表現に似ていることを絶対に確信していますか?


18
必ずしもそうではありません。膨大な決定木によってのみ解決できる問題があります。しかし、もちろん、if-then-elseのリテラルツリーで構成されたソリューションは、設計が不十分です。これを行うには、はるかに柔軟で保守可能な方法があります。
SF。

43
それが問題のポイントだと思いました。OPには、彼のドメインに固有の問題があり、単純な実装では、if ... then ... elseの数千を必要とします。彼はこれが面倒であると直感し、このコミュニティにこれを行うためのより良い方法を尋ねました。質問が尋ねられたという事実は、これがすでに理解されているという良い歌です。あなたの答えは、正しいとはいえ、決して質問を助けません。
ニュートピア

@Newtopian上級ユーザーまたはプログラマーはそれを理解し、それを明らかにするでしょう。しかし、素朴なユーザーやプログラマーはそれを理解しないかもしれません。私はここのほとんどの人が自明であると知っていることを知っています-私はOPが問題であるという彼の仮定で正しいことを確認しました。
blueberryfields

私は同意します。もしそうでなければ、多型とDIで置き換えることができます。もし他に何十億ものあるなら、あなたのデザインはひどく悪いです。
DarthVader

17

タスクに適したソフトウェア/コンピューター言語を使用してください。Matlabは、文字通り何千もの条件を持つことができる複雑なシステムのモデリングに非常に頻繁に使用されます。if / then / else節を使用せず、数値分析によって。Rは、同じことを行うためのツールとパッケージで満たされたオープンソースのコンピューター言語です。しかし、これはまた、より数学的な用語でモデルを再記述しなければならないことを意味するため、モデルに主な影響と影響間の相互作用の両方を含めることができます。

まだ行っていない場合は、モデリングとシミュレーションに関するコースに従ってください。最後にすべきことは、if-then-elseの観点からそのようなモデルを書くことを検討することです。モンテカルロマルコフチェーン、サポートベクターマシン、ニューラルネットワーク、潜在変数分析などがあります。利用可能なモデリングツールの富を無視して100年前に戻らないでください。


この質問があまり注目されなかったのには驚いた。数値解析とモデリングは、心臓部のif-elseマシンです。ただし、アプリケーションでルールの厳密な遵守が必要な場合、容認されない可能性のある誤検知の影響を受けます。(銀行業を考えてください)
アルンホセ

13

ルールエンジンは、非常に多くのif / thenルールが存在する場合、プログラミング言語を知らなくてもユーザーが編集できるプログラム外の1か所ですべてを取得するのに役立つため、役立つ場合があります。また、視覚化ツールが利用できる場合があります。

また、ロジックプログラミングソリューション(Prologなど)も見ることができます。if / thenステートメントのリストをすばやく変更し、入力の組み合わせが特定の結果につながるかどうかなどを確認させることができます。また、手続きコードとして(または、オブジェクト指向コード)。


11

それは突然私に明かされました:

決定学習ツリー(ID3アルゴリズム)を使用する必要があります。

誰かがあなたの言語でそれを実装している可能性が高いです。そうでない場合は、既存のライブラリを移植できます


上記のDSLのアイデアを活用してください。問題を何らかの形の記号代数に抽象化し、それを実装する方法を考えてみてください。
ザカリーK

11

これは、他の回答で提案されたさまざまなモデリングツールを集約したコミュニティWikiの回答です。リソースへの追加リンクを追加しました。

何千ものハードコーディングされたif / elseステートメントに対して異なるアプローチを使用する必要があることを再度述べる必要はないと思います。


9

すべての大規模なアプリケーションにはif-then-else、他のフロー制御をカウントしない数千のステートメントが含まれており、それらのアプリケーションは複雑にもかかわらず、引き続きデバッグおよび保守されます。

また、ステートメントの数によってフローが予測不能になることはありません。非同期プログラミングは行います。決定論的アルゴリズムを同期的に使用すると、毎回100%の予測可能な動作が得られます。

あなたは、おそらく必要があり、より良い説明あなたがスタックオーバーフローまたは上でやろうとしているものコードレビュー の人は正確なリファクタリング技術があなたを示唆することができるように使用します。「どのように多くのifステートメントをネストするのを避けるには<コードを与えます>」のような、より正確な質問をすることもできます。


1
ほとんどのアプリには、2〜3レベルのネストと1行の条件があります。50レベル下にネストされたディシジョンツリーを必要とする問題、および多くの条件がそれぞれ30以上の変数の論理的複合物である場合はどうでしょうか。
SF。

「非常に大規模なアプリケーション...」は確かに真実ですが、OPがモデルのルールを本質的に形成する条件式の長いシーケンスについて話していることはかなり明らかです。ifステートメントの巨大なネストされたグループは、せいぜいすぐに扱いにくくなるため、より良いアプローチが必要です。
カレブ

@カレブ:あなたは正しい、それは明らかである、質問の冒頭に正確な例があります。答えを書いたのは、質問が編集される前ではありませんでした。これは、私と同時に投稿された他の2つの回答の実際の矛盾を説明しています。
アルセニムルゼンコ

2

適切に設計して、アプリケーションを管理しやすくします。さまざまなビジネスロジックを個別のクラス/モジュールに分割して、アプリケーションを設計します。これらのクラス/モジュールのそれぞれを個別にテストする単体テストを作成します。これは非常に重要であり、ビジネスロジックが期待どおりに実装されていることを確認するのに役立ちます。


2

問題から抜け出す方法を設計する方法はおそらく1つではありませんが、ifステートメントの大きなブロックを作成してソリューションを適用するさまざまな領域を分離しようとすると、その複雑さを少しずつ管理できます。これらの小さな問題のそれぞれに。

大規模な条件を管理可能なチャンクに分割する方法については、リファクタリングで説明したルールのようなテクニックを見てください。たとえば、共通のインターフェースを持つ複数のクラスがcaseステートメントを置き換えることができます。

早期終了も大きな助けです。エラー条件がある場合、例外をスローするか、ネストさせるのではなくリターンすることにより、関数の開始時にそれらを邪魔にならないようにします。

条件を述部関数に分割すると、それらを追跡しやすくなります。また、標準形式に変換できる場合は、ハードコーディングされたデータ構造ではなく、動的に構築されたデータ構造で取得できる場合があります。


2

ルールエンジンを使用することをお勧めします。Javaの場合、jBPMまたはOracle BPMが役立ちます。ルールエンジンを使用すると、基本的にXMLを介してアプリケーションを構成できます。


+1私は最近、ルールを表現するための言語としてMvelとともにDroolsを使用していますが、まさにそれがあなたが探しているものです。それは非常に高速であるという事実にもかかわらず。
ジャレイン

Droolsは良い選択です。私は現在、Oracle BPMを使用しています。Feugoもあります。多くのオープンソースおよび利用可能なツールがあります。
シド

2

この問題は、「if-then」手続き型コードで記述されていても、ビジネスアプリケーション用に考案された多数のルールソリューションで記述されていても、「ルール」によって十分に解決されるものではありません。機械学習は、このようなシナリオをモデル化するための多くのメカニズムを提供します。

基本的に、「システム」(すなわち、牧草地の牛)に影響を与える要因(例えば、太陽、風、食物源、突然の出来事など)の離散表現のためのスキームを策定する必要があります。離散とは対照的に、真の価値のある機能的表現を作成できるという誤った信念にもかかわらず、実世界(人間の神経系を含む)にあるコンピューターは、真の価値に基づいたり、真の価値に基づいて計算したりしません。

関連する因子の数値表現が得られたら、いくつかの数学モデルのいずれかを構築できます。1つのノードセットが牛を表し、もう1つのノードセットが牧草地のある単位領域である2部グラフを提案します。どのような場合でも、牛は牧草地の単位面積を占有します。各牛には、現在および他のすべての牧草ユニットに関連付けられたユーティリティ値が存在します。牛が牧草の単位の効用価値を最適化しようとする場合(牛にとってそのような手段が何であれ)、牛は最適化のために単位から単位に移動します。

セルラー自動化は、モデルの実行に適しています。牛の動きを動機づける真の価値のある数学の世界の基礎となる数学は、場の勾配モデルです。牛は、効用価値が低いと認識されている位置から効用値が高いと認識されている位置に移動します。

環境の変化をシステムに注入すると、牛のポジショニングの定常状態ソリューションに移行しません。また、ゲーム理論の側面を適用できるモデルにもなります。そのようなことが必ずしもこのケースに多くを追加するというわけではありません。

ここでの利点は、モデルの実行中に2部グラフに「牛」細胞を減算して追加することにより、屠殺牛または新しい牛の取得を容易に管理できることです。


1

そんなに多くのif-elseステートメントを定義する必要はないと思います。私の観点から、問題には複数のコンポーネントがあります。

  • 性格や構成が異なる複数の牛がいるため、非同期またはマルチスレッドにする必要があります。各牛は、次の移動の前にどの方向に進むかを自問します。私の意見では、同期コードはこの問題に対する貧弱なツールです。

  • デシジョンツリーの構成は常に変化します。実際の牛の位置、天候、時間、地形などに依存します。複雑なif-elseツリーを構築する代わりに、風の上昇や方向-重み関数に問題を減らすべきだと思います: 図1 図1-方向-いくつかのルールの重み関数

    牛は、常に総重量が最大になる方向に移動する必要があります。したがって、大きな意思決定ツリーを構築する代わりに、一連のルール(異なる方向-重み関数)を各牛に追加し、方向を尋ねるたびに結果を単純に処理できます。これらのルールは、位置の変更ごとに、または時間の経過ごとに再構成できます。また、これらの詳細をパラメーターとして追加すると、すべてのルールが取得できます。これは実装の決定です。方向を取得する最も簡単な方法。1°のステップで0°から360°までの単純なループを追加します。その後、各360方向の合計重量をカウントし、max()関数を実行して適切な方向を取得できます。

  • これを行うためにニューラルネットワークは必ずしも必要ではありません。各ルールに1つのクラス、牛、おそらく地形などに1つのクラスなど、シナリオに1つのクラス(たとえば、異なるルールと1つの特定の地形)。 図2 図2-牛アプリの非同期決定ノードと接続

    • メッセージング方向の赤-ルールによるウェイトマップ
    • 意思決定後の向きと位置の更新は青
    • 方向と位置の更新後の入力更新の場合は緑
    • 入力を取得するための黒

    注:このようなものを実装するには、おそらくメッセージングフレームワークが必要になります

    したがって、学習用の牛を作ることがあなたの問題の一部ではない場合、ニューラルネットワークや遺伝的アルゴリズムは必要ありません。私はAIの専門家ではありませんが、牛を実際の牛に適応させたい場合は、遺伝的アルゴリズムと適切なルールセットを使用して簡単に行うことができます。私がよく理解していれば、ランダムなルール設定を持つ牛の集団が必要です。その後、実際の牛の行動をモデル母集団の行動と比較し、実際の牛に最も近い道を歩く10%を維持できます。その後、保持している10%に基づいて新しいルール構成制約を牛工場に追加し、新しいランダムな牛を母集団に追加するなどして、実際の牛と同じように動作するモデル牛を取得します...


0

本当に何千ものIF ... THENルールがある場合は、過剰に指定している可能性があります。価値のあるものとして、私が参加したニューラルネットワークモデリングの講演では、「単純な一連のルール」を使用して、かなり複雑で合理的に現実に一致する動作(この場合は実際のニューロンの動作)を生成する方法を説明することから始めます。だから、本当によろしいです何千もの条件が必要ですか?天気、食料源の場所、突然の出来事、群れ、地形の4-5の側面に加えて、あなたは本当にもっと多くの変数を持つつもりですか?確かに、これらの条件を組み合わせて可能なすべての順列を行おうとすると、数千のルールを簡単に持つことができますが、それは正しいアプローチではありません。ファジーロジックスタイルのアプローチでは、さまざまな要因が各牛の位置に偏りをもたらし、全体的な決定に結びつくため、より少ないルールでこれを行うことができます。

また、プログラムを変更せずに簡単に調整できるように、ルールセットはコードの一般的なフローとは別にする必要があることにも同意します。競合するルールセットを考え出し、実際の牛の動きデータに対してどのように機能するかを確認することもできます。楽しそう。


0

AIの分野であるExpert Systemsが言及されています。これらを少し拡張するには、推論エンジンを読んで参考にしてください。Google検索の方が使いやすいかもしれません-DSLを書くのは簡単な部分です。GoldParserのようなパーサーで簡単にこれを行うことができます。難しい部分は、意思決定ツリーを構築し、それらを効率的に実行することです。

英国のNHS Direct Webサイトなど、多くの医療システムはすでにこれらのエンジンを使用しています。

あなたは.NET'erしている場合、Infer.NETはあなたのための役に立つかもしれません。


0

あなたは牛の動きを見ているので、彼らは360度の方向で立ち往生しています(牛は飛ぶことができません。)あなたはあなたが旅行する速度も持っています。これはベクトルとして定義できます。

では、太陽の位置、丘の傾斜、大きな音などをどのように処理しますか?

各学位は、その方向に進みたいという欲求を表す変数になります。90度で小枝が牛の右側にスナップするとします(牛が0度を向いていると仮定します)。右に行く欲求は下がり、270(左)に行く欲求は上がります。ある方向に進むことを望む牛への影響を加減するすべての刺激を通過します。すべての刺激が適用されると、牛は最高の欲求の方向に進みます。

刺激がバイナリである必要がないように、グラデーションを適用することもできます。たとえば、丘は一方向にまっすぐではありません。たぶん、牛が谷にあるか、丘の上の道をまっすぐ前に、45 *わずかに上り坂で、90 *わずかに下り坂にあります。180 *の急な坂道。

その後、イベントの重みを調整し、それが影響の方向になります。if thensのリストではなく、最大値を探している1つのテストがあります。また、刺激を追加したい場合は、テストの前に刺激を適用するだけでよく、複雑さを追加する必要はありません。

そうではなく、牛が360方向に進むと言うと、36方向に分解できます。それぞれ10度

そうではなく、牛が360方向に進むと言うと、36方向に分解できます。それぞれ10度です。どの程度具体的にする必要があるかによって異なります。


-2

OOPを使用します。基本条件を処理するクラスの束を作成し、ランダムメソッドを実行して、実行中の動作をシミュレートします。

プログラマーを助けてください。

class COW_METHODS {

    Function = array('Action1','Action2',....'ActionX');

    function doAction() {
       execute(Function[random(1,5000]);
    }

    function execute(DynamicFunction) {
        exec(DynamicFunction());
    }

    Function Action1() {
        turnRight();
        eatGrass();
    }
    /*  keep adding functions for COW Methods ...  etc  */
    /*  and add classes for conditions inherit them as needed  */
    /*  keep an object to define conditions =  Singleton etc.  */
}

これが最後の答えなのはなぜですか。要するに、数千のif elseステートメントが単にプログラムを設計する方法になっているということです。
wfbarksdale

1
推薦ので「使用OOPは。助けるために、プログラマを取得します。」の助言を与えると同じ価値がある「より電話を作るの!」尋ねられたとき「私は私の売り上げを4倍するにはどうすればよいです?」。厳密に間違っているわけではありませんが、あまり役に立ちません。
JensG

2
これは悪い答えだからです。技術的に; あなたの答えはOOPとはほとんど関係ありません。呼び出さCOW_METHODSれるクラスは、大まかに関連するメソッドのコレクションに過ぎないようです。懸念の分離はどこですか?質問に関連して、これは質問者をどのように助けますか?
oɔɯǝɹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.