我有一个函数返回一组对象中具有最佳评分的对象。 功能的argmax允许小违规
现在我想获得最接近某一点的最佳评级的对象。基本上我想允许小违反公式,这样如果O-1比0-2即使
如果
目前,我在一个程序中实现了约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;
}
什么是“亲密度”的措施? – MBo
您的问题并不清楚,正如前面的评论所暗示的。请出示你的“约5条if语句”来澄清这个问题,并表明你已经在这个问题上做了大量的工作。关于“最接近某一点”的更多解释也会有所帮助。 –
@MBo只是对目标对象/位置的永久性失去 – Girauder