2015-06-02 4 views
-1

У меня есть класс насоснайти ближайший вариант

public class Pump 
{ 
    public string Name { get; set; } 
    public int PSI_min { get; set; } 
    public int PSI_max { get; set; } 
    public int Horsepower_min { get; set; } 
    public Bitmap Graph { get; set; } 
    public int RPM { get; set; } 

    public Pump (string name, int psi_min, int psi_max, int horsepower_min) 
    { 
     Name = name; 
     PSI_min = psi_min; 
     PSI_max = psi_max; 
     Horsepower_min = horsepower_min; 
    } 
} 

и у меня есть функция, чтобы найти насос, который приспосабливает на основе пользовательского ввода (PSI, HP и RPM)

public void Calculate() 
{ 
     for (int i=0; i<9; i++) 
     { 
      Pump pump = pumps[i]; 

      if (pump.PSI_min <= givenPSI && pump.PSI_max >= givenPSI && pump.Horsepower_min <= givenHorsepower && pump.RPM == givenRPM) 
      { 
       pumpsThatFit.Add(pump); 
      } 
     } 

сейчас , Я пытаюсь найти способ для программы получить самый доступный насос, если нет насосов, которые точно соответствуют (PSI слишком высокий HP слишком низкий и т. Д.). Но я не могу придумать, как это сделать. Есть идеи?

+3

Вы определяете подходящий способ взвесить важность, отличающуюся от желаемых значений, и найти ту, которая имеет самую низкую взвешенную разницу. –

+0

У вас есть спецификация для определения «ближайшего» насоса. Затем используется математика/статистика. Ближе всего это то, как вы его определяете и совершенно произвольно. – ryanyuyu

+1

Более конкретно - определить взвешенный «балл», основанный на важности каждого поля, и вычислить «оценку» для каждого насоса. –

ответ

0

Один из способов - рассчитать euclidian distance s между вашими насосами и теми, которые определены пользователем, а затем выбрать те, которые наиболее близки.

Расчет расстояния между двумя векторами осуществляется путем получения квадратного корня из суммы квадратов разностей векторов для каждого n-го элемента.

A := (A[0], A[1], ..., A[n]) 
B := (B[0], B[1], ..., B[n]) 

distance = sqrt((B[0]-A[0])^2 + (B[1]-A[1])^2 + ... + (B[n]-A[n])^2) 

То же самое можно сделать с помощью ваших насосов, поскольку они являются технически переносными векторами.

double Dist(Pump a, Pump b) 
{ 
    int PSIMinDiff = b.PSI_min - a.PSI_min; 
    int PSIMaxDiff = b.PSI_max - a.PSI_max; 
    int HorsepowerMinDiff = b.Horsepower_min - a.Horsepower_min; 
    int RPMDiff = b.RPM - a.RPM; 

    return Math.Sqrt(
     (PSIMinDiff * PSIMinDiff) + 
     (PSIMaxDiff * PSIMaxDiff) + 
     (HorsepowerMinDiff * HorsepowerMinDiff) + 
     (RPMDiff * RPMDiff)); 
} 


//Pump[] pumps - all pumps 
//Pump userPump - the pump defined by the user 

List<Pump> closestPumps = new List<Pump>(); 

//Get the lowest distance 
double minDist = Double.MaxValue; 
foreach(Pump p in pumps) 
{ 
    double distance= Dist(p, userPump); 
    if(distance < minDist) minDist = distance; 
} 

//Select pumps which are the closest to the one that the user defined 
foreach(Pump p in pumps) 
{ 
    if(Dist(p, userPump) == minDist) 
     closestPumps.Add(p); 
} 

Обратите внимание, что в то время как этот метод легко реализовать и использовать, один из его самых больших недостатков является то, что она не взвешены, и в то время как результаты математически правильно, они могут отличаться от которые пользователь хочет видеть.

Смежные вопросы