Index: branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAAlgorithm.cs
===================================================================
--- branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAAlgorithm.cs	(revision 17425)
+++ branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAAlgorithm.cs	(revision 17440)
@@ -103,5 +103,6 @@
       var analyzer = Analyzer;
       var rand = RandomParameter.Value;
-      int lambda = 1;            // the size of offspring 
+      //int lambda = 1;            // the size of offspring 
+      var lambda = Lambda.Value;
       //int indexOffspring = 0;    // the index of offspring to be generated
 
Index: branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAlgorithmBase.cs
===================================================================
--- branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAlgorithmBase.cs	(revision 17425)
+++ branches/3055_SMSEMOA/HeuristicLab.Algorithms.SMSEMOA/3.4/SMSEMOAlgorithmBase.cs	(revision 17440)
@@ -101,6 +101,11 @@
     private DoubleArray ReferencePoint {
       get {
-        var problem = (MultiObjectiveTestFunctionProblem)Problem;
-        return problem.ReferencePoint;
+        if (Problem is MultiObjectiveTestFunctionProblem) {
+          var problem = (MultiObjectiveTestFunctionProblem)Problem;
+          return problem.ReferencePoint;
+        }
+        else {
+        return null;
+        }
       }
     }
@@ -250,5 +255,5 @@
 
     #region constructors
-    public SMSEMOAAlgorithmBase() { 
+    public SMSEMOAAlgorithmBase() {
       // Add or define or specify the parameters that may be use in SMS-EMOA.   
       // ***("Name", "Description", "Value")
@@ -480,18 +485,28 @@
         var lastLayer = pf2.Last();
 
-        try { // TODO: This can be use for dynamic reference point strategy later. Kaifeng , 02/2020
-          // smetric = Hypervolume.Calculate(lastLayer.Select(x => x.Item2), Enumerable.Repeat(11d, NadirPoint.Length).ToArray(), maximization);
-          smetric = Hypervolume.Calculate(lastLayer.Select(x => x.Item2), ReferencePoint.ToArray(), maximization);
-        }
-        catch {
-          smetric = int.MinValue;
-        }
-
-        var indices = Enumerable.Range(0, lastLayer.Count()).ToList();
-
-        for (int ii = 0; ii < lastLayer.Count(); ++ii) {
+        // TODO: This can be use for dynamic reference point strategy later. Kaifeng , 02/2020
+        // smetric = Hypervolume.Calculate(lastLayer.Select(x => x.Item2), Enumerable.Repeat(11d, NadirPoint.Length).ToArray(), maximization);
+
+
+        var reference = Enumerable.Repeat(double.MaxValue, maximization.Length).ToArray();
+        if (ReferencePoint is null) {     // KF, 20200217 -- fix no reference point on real-world applications. If No reference points in Algorithms, use 1.1 \times max objective values as the reference point
+          for (int i = 0; i < reference.Length; i++) {
+            reference[i] = 1.1 * reference[i];
+            if (reference[i] > 10000) {
+              reference[i] = 9999;          // set a upper bound for the reference point
+            }
+          }
+        }
+        else {
+          reference = ReferencePoint.ToArray();
+        }
+        //var reference = ReferencePoint.ToArray();
+        var nondominated = NonDominatedSelect.GetDominatingVectors(lastLayer.Select(x => x.Item2), reference, maximization, false);
+        smetric = nondominated.Any() ? Hypervolume.Calculate(nondominated, reference, maximization) : int.MinValue;
+
+        for (int ii = 0; ii < lastLayer.Count; ++ii) {
           try { // TODO: This can be use for dynamic reference point strategy later. Kaifeng , 02/2020
             // tempHV = Hypervolume.Calculate(indices.Where(idx => idx != ii).Select(idx => lastLayer[idx].Item2), Enumerable.Repeat(11d, NadirPoint.Length).ToArray(), maximization);
-            tempHV = Hypervolume.Calculate(indices.Where(idx => idx != ii).Select(idx => lastLayer[idx].Item2), ReferencePoint.ToArray(), maximization);
+            tempHV = Hypervolume.Calculate(Enumerable.Range(0, lastLayer.Count).Where(idx => idx != ii).Select(idx => lastLayer[idx].Item2), reference, maximization);
           }
           catch {
@@ -537,5 +552,22 @@
       //               True:  maximization problem 
       //               False: minimization problem
-      hypervolumes[0, 0] = Hypervolume.Calculate(pf.Select(x => x.Item2), Enumerable.Repeat(11d, NadirPoint.Length).ToArray(), maximization);
+      var reference = Enumerable.Repeat(double.MaxValue, maximization.Length).ToArray();
+      if (ReferencePoint is null) {     // KF, 20200217 -- fix no reference point on real-world applications. If No reference points in Algorithms, use 1.1 \times max objective values as the reference point
+        for (int i = 0; i < reference.Length; i++) {
+          reference[i] = 1.1 * reference[i];
+          if (reference[i] > 10000) {
+            reference[i] = 9999;          // set a upper bound for the reference point
+          }
+        }
+      }
+      else {
+        reference = ReferencePoint.ToArray();
+      }
+      //var reference = ReferencePoint.ToArray() ?? Enumerable.Repeat(double.MaxValue, maximization.Length).ToArray();
+      //var reference = ReferencePoint.ToArray();
+      var nondominated = NonDominatedSelect.GetDominatingVectors(pf.Select(x => x.Item2), reference, maximization, false);
+      hypervolumes[0, 0] = nondominated.Any() ? Hypervolume.Calculate(nondominated, reference, maximization) : int.MinValue;
+
+      //hypervolumes[0, 0] = Hypervolume.Calculate(pf.Select(x => x.Item2), reference, maximization);
       hypervolumes[0, 1] = pf.Count;
       Console.WriteLine("Current HV is", hypervolumes[0, 0]);
