math - argmax of a function allowing small violations -


i have function returns object best rating among set of objects. enter image description here

now want object best rating closest point. want allow small violation formula, such if o_1 closer given point o_2 if enter image description here

enter image description here

if

enter image description here

for small , fixed $\epsilon$.

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

Popular posts from this blog

neo4j - finding mutual friends in a cypher statement starting with three or more persons -

php - How to remove letter in front of the word laravel -

minify - Minimizing css files -