math - argmax of a function allowing small violations -
i have function returns object best rating among set of objects. 
now want object best rating closest point. want allow small violation formula, such if o_1 closer given point o_2 if 
if
currently achieve 5 if statements in program, wondering if there's way represent in cleaner more elegant way mathematical formula perhaps? if have ever had problem this, how did code it?
here snippet of code have, know there refactorizations done if statements, wanted make cases clearer. there more elegant way of solving this?
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; }
first find maximum rating rmax. select object closest given point objects o rating(o) >= rmax - epsilon. that:
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; } } 


Comments
Post a Comment