2017-09-12 3 views
0

私は、オブジェクトの集合の中で最も評価の高いオブジェクトを返す関数を持っています。 enter image description here小さな違反を許す関数のargmax

ここで、特定のポイントに最も近い最も評価の高いオブジェクトを取得します。基本的に私は、このようなO_1がO_2より与えられた点に近い場合でも、いくつかの小さなため

enter image description here

場合 enter image description here

enter image description here

場合に、式に小さな違反を許可します固定$\epsilon$.

現在、私はプログラム内で約5つのif文で達成していますが、私は方法があるかどうか疑問に思っていましたおそらく数学的な公式でこれをより洗練されたよりエレガントな方法で表現していますか?このような問題があった場合、どのようにコード化しましたか?

ここに私が持っているコードのスニペットがありますが、私はifステートメントに実行できるリファクタリングがいくつかあることを知っています。これを解決するよりエレガントな方法はありますか?

public VisualDevice MostSuitableDevice(GameObject u, GameObject t, List<VisualDevice> D) 
{ 
    float maxSuitability = 0; 
    VisualDevice mostSuitableDevice = null; 
    float epsMaxSuitability = 0; 
    VisualDevice epsMSD = null; 


    foreach (VisualDevice d in D) 
    { 
     float suitability = Rating(d, u, t); 
     bool closerDevice = mostSuitableDevice != null ? Vector3.Distance(d.GetLightPosition(), t.transform.position) < Vector3.Distance(mostSuitableDevice.GetLightPosition(), t.transform.position) : false; 

     if (suitability > maxSuitability && closerDevice) 
     { 
      maxSuitability = suitability; 
      mostSuitableDevice = d; 
     } 
     else if (suitability > maxSuitability + epsilon) 
     { 
      maxSuitability = suitability; 
      mostSuitableDevice = d; 
     } 
     else if (suitability + epsilon > maxSuitability && closerDevice) 
     { 
      closerDevice = epsMSD != null ? Vector3.Distance(d.GetLightPosition(), t.transform.position) < Vector3.Distance(epsMSD.GetLightPosition(), t.transform.position) : false; 
      if (suitability > epsMaxSuitability && closerDevice) 
      { 
       epsMaxSuitability = suitability; 
       epsMSD = d; 
      } 
      else if (suitability > epsMaxSuitability + epsilon) 
      { 
       epsMaxSuitability = suitability; 
       epsMSD = d; 
      } 
      else if (suitability + epsilon > epsMaxSuitability && closerDevice) 
      { 
       epsMaxSuitability = suitability; 
       epsMSD = d; 
      } 
     }    

    } 
    bool epsCloser = epsMSD != null && mostSuitableDevice!=null ? Vector3.Distance(epsMSD.GetLightPosition(), t.transform.position) < Vector3.Distance(mostSuitableDevice.GetLightPosition(), t.transform.position) : false; 
    if (epsMaxSuitability + epsilon > maxSuitability && epsCloser) 
    { 
     maxSuitability = epsMaxSuitability; 
     mostSuitableDevice= epsMSD; 
    } 

    return mostSuitableDevice; 
} 
+0

"近さ"の尺度は何ですか? – MBo

+0

あなたの質問は、前のコメントが示すようにはっきりしていません。質問を明確にし、問題について重要な作業を行ったことを示すために、「約5つのif文」を表示してください。 「特定の点に最も近い」ことについてのより多くの説明もまた役立つだろう。 –

+0

@BOちょうどターゲットオブジェクト/位置への邪魔にならない – Girauder

答えて

0

最初に見つかる最大定格はrmaxです。次に、すべてのオブジェクトoから与えられた点に最も近いオブジェクトをRating(o) >= rmax - epsilonと選択します。 このように:

float maxSuitability = D.Max(d => Rating(d, u, t)); 
float minDistance = float.PositiveInfinity; 
VisualDevice mostSuitableDevice = null; 
foreach (VisualDevice d in D) 
{ 
    float suitability = Rating(d, u, t); 
    if (suitability < maxSuitability - epsilon) 
     continue; 
    float distance = Vector3.Distance(... 
    if (distance < minDistance) 
    { 
     minDistance = distance; 
     mostSuitableDevice = d; 
    } 
} 
+0

私はちょうどそれをちょうど複雑なやり方でやっていると思います。どのようにコードを改善するためのアドバイスを得ましたか? – Girauder

+0

@Girauder私の編集を参照してください – Henrik

+0

私は最初にそれについて完全には確信していませんでしたが、私はそれについて考えるほど、それはより意味があります。私はこれまでのものとは若干異なる結果を得ていますが、私が以前に持っていたものは完全に正しいとは限りません。明らかな違いはありますか?私はあなたのソリューションをもう少しテストし、あなたの答えを受け入れるでしょう。 – Girauder

関連する問題