2017-09-12 52 views
0

我有一个函数返回一组对象中具有最佳评分的对象。 enter image description here功能的argmax允许小违规

现在我想获得最接近某一点的最佳评级的对象。基本上我想允许小违反公式,这样如果O-1比0-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

@MBo只是对目标对象/位置的永久性失去 – Girauder

回答

0

首先找到最高评分rmax。然后从所有对象oRating(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