Обновление значения объекта после применения фильтра в Scala - PullRequest
1 голос
/ 24 июня 2019

У меня есть список List и я называю его BAT в моем коде. Каждый BAT имеет 2 атрибута. Первый - это позиция, а второй - фитнес. Для каждого списка в BAT я вычисляю его пригодность, используя функцию Sphere. На основе пригодности я применил фильтр, который фильтрует только те списки, чья пригодность меньше, чем у объекта, называемого GF. Это вернет мне БАТ. Мой код

var GlobalBest_Fitness = Double.PositiveInfinit

var BAT = List.fill(N)(new BAT1(d, MinVal, MaxVal))

BAT.map { x =>
  x.fitness = sphere(x.position)
 }
 BAT.filter(_.Fitness < GF).map { x =>
  GF = x.Fitness
}   

def sphere(list: List[Double]): Double = {
 list.foldLeft(0.0)((x, xs) => x + xs * xs)
}
class BAT1 ( dim:Int  ,  min:Double  ,  max:Double) {

 val random = new Random()
 var position      : List[Double]      =   List.fill(dim)(random.nextDouble() * (max-min)+min )
 var fitness       :Double             =   math.random
}

Этот код устанавливает GF Fitness последнего члена BAT, но я хочу установить для Object GF значение Fitness of List с Lowest Fitness.

Вот некоторые выводы для объяснения вопроса. BAT с 5 списками,

(List(-67.33460898977961, -71.09215709663737, 55.89607430834903, -43.23771807116002),14581.91575554507)
(List(90.12684307743376, 43.946793301728036, -93.06789837138616, -76.86083905559525),24623.390772205956)
(List(12.619843833260006, -86.17961848282789, 48.99208107528267, 24.69991428409682),10596.496873950442)
(List(96.24721330545535, 54.598176031247306, -92.20930457845513, -42.450241098519385),22549.06571516962)
(List(71.10095207554104, 74.02738064902607, 93.76767384566747, 40.917896190085656),21002.04935885428)


Output ==>> GF = 21002.04935885428

Это установка значения GF для последней пригодности Списка, вместо этого ему следует установить его на Наименьшее значение, равное 10596.496873950442, которое соответствует пригодности третьего Списка.

Этот список может быть очень большим и должен повторяться в нем миллионы раз. Я хочу найти оптимальное решение.

1 Ответ

0 голосов
/ 24 июня 2019

Согласно тому, что я понял из вопроса, вы хотите минимальное значение пригодности из списка объектов BAT1 (List[BAT1]).

Замечено проблем:

Нет необходимости настраивать пригодность позже с помощью сопоставления, .map используется для преобразование списка / коллекции / монады (например, вы хотите преобразовать От [A] до [B]).

Итак, ваш класс BAT1 должен выглядеть так:

class BAT1(dim:Int, min:Double, max:Double) {
 val random = new Random()
 var position: List[Double] = List.fill(dim)(random.nextDouble() * (max-min)+min )
 val fitness: Double = sphere(position) //no need of var and can be directly computer here only
}

Чтобы получить наименьшую пригодность, вам не нужно фильтровать

val minFitness = BAT.map(_.fitness).min
/* 
   we will first convert the list BAT which has type List[BAT1] to a
   List[Double] containing fitness of each BAT1 object in the list
   we will then get the minimum value in the List[Double] by .min method

   List[BAT1] -> List[Double] -> Double
*/

Другой способ:

val minFitness = BAT.minBy(_.fitness).fitness //please read about minBy, maxBy in Scala documentations.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...