2016-09-14 14 views
4

私はJava/Kotlinで学習エージェントを実装しています。このエージェントの機能の一部には、可能なオプションの大きなリストを検索する機能があります。可能性のある空間を検索するには、複数の良い方法がありますし、どちらが最善であるかについて頻繁に気が変わります。したがって、私はそれを戦略パターンとして実装することにしました。JSONの設定で戦略を選択する

最近、さまざまなシステムパラメータの有効性をテストする一連の実験を実行することに決めました。これはPythonスクリプトを通して行われます。このスクリプトは、異なるconfig.jsonファイルを引数としてコンパイルされたjarファイルを実行することによって各実験を開始します。次のようなものがあります。

{ 
    "numSamples" : 5000, 
    "environmentDifficulty" : 3, 
    "hazardProbability" : 0.4, 
    //etc.. 
} 

これで、エージェントが使用する戦略を構成する能力を実験者に与えたいと考えています。これを行う最善の方法は何ですか?そして、とき場合、または支店とメインシステムでそれを構築

{ 
    "numSamples" : 5000, 
    "environmentDifficulty" : 3, 
    "hazardProbability" : 0.4, 
    "agentStrategy": "FastSearch" 
} 

:私の即時の思考は、私はちょうどconfig.jsonに追加の文字列フィールドを追加する可能性があることです

val searchStrategy = when(config.agentStrategy){ 
    "FastSearch" -> FastSearch() 
    "AccurateSearch" -> AccurateSearch() 
    "ExperimentalSearch" -> ExperimentalSearch() 
val agent = agent(searchStrategy) 

しかし、これはそうです私がもっと戦略を追加し始めるなら、それは厄介な/維持するのが難しくなるようになり始めるでしょう。より良い方法がありますか?それを解決するために

答えて

5

一つの方法は、そのような戦略のインスタンスをロードし、作成するために、クラス名を使用することです。

val agentClass = classLoader.loadClass(config.agentStrategy)!! 
val agent = agentClass.newInstance() as SearchStrategy 

もう一つの方法は、すべての検索方針を登録してからのようconfigを与え使用したものと一致することですそう:

class SearchStrategies(val strategies: List<SearchStrategy>){ 
    fun findForConfig(config:Config) = strategies.find { it.javaClass.name.contains(config.agentStrategy) } 
} 


//somewhere at boot time 
val searchStrategies = SearchStrategies(listOf(FastSearch(), AccurateSearch())) 


//when needed 
val config = ... 
val agent = searchStrategies.findForConfig(config) 

最後に、それは複雑のコストでより高い拡張性と標準complianaceを達成するためにSPIを利用することも可能です。

関連する問題