Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/02/11 22:33:30 (13 years ago)
Author:
abeham
Message:

#1330

  • Updated solution view
  • Made distance matrix a mandatory parameter (solution instances are small anyway)
  • Added and set best known solution if available for a QAPLIB instance
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/QAP/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs

    r5583 r5598  
    5959      get { return (ValueParameter<DoubleMatrix>)Parameters["DistanceMatrix"]; }
    6060    }
    61     public ValueParameter<BoolValue> UseDistanceMatrixParameter {
    62       get { return (ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
    63     }
    64 
    6561    #endregion
    6662
     
    8177      get { return DistanceMatrixParameter.Value; }
    8278      set { DistanceMatrixParameter.Value = value; }
    83     }
    84     public BoolValue UseDistanceMatrix {
    85       get { return UseDistanceMatrixParameter.Value; }
    86       set { UseDistanceMatrixParameter.Value = value; }
    8779    }
    8880
     
    112104      : base() {
    113105      Parameters.Add(new ValueParameter<Permutation>("BestKnownSolution", "The best known solution which is updated whenever a new better solution is found or may be the optimal solution if it is known beforehand.", null));
    114       Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The coordinates of the locations."));
     106      Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The coordinates of the locations. If this is changed the distance matrix is calculated automatically using the euclidean distance."));
    115107      Parameters.Add(new ValueParameter<DoubleMatrix>("Weights", "The strength of the connection between the facilities.", new DoubleMatrix(5, 5)));
    116108      Parameters.Add(new ValueParameter<DoubleMatrix>("DistanceMatrix", "The distance matrix which can either be specified directly without the coordinates, or can be calculated automatically from the coordinates.", new DoubleMatrix(5, 5)));
    117       Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "Defaults to true, set to false only when the number of facilities is very high and a distance matrix would become too large (>1000 facilities).", new BoolValue(true)));
    118109
    119110      Maximization = new BoolValue(false);
     
    196187      ParameterizeOperators();
    197188    }
     189    private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) {
     190      Coordinates.Reset += new EventHandler(Coordinates_Reset);
     191      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
     192      UpdateDistanceMatrix();
     193    }
     194    private void Coordinates_ItemChanged(object sender, EventArgs<int, int> e) {
     195      UpdateDistanceMatrix();
     196    }
     197    private void Coordinates_Reset(object sender, EventArgs e) {
     198      UpdateDistanceMatrix();
     199    }
    198200    #endregion
    199201
     
    205207
    206208    private void AttachEventHandlers() {
     209      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
     210      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    207211      WeightsParameter.ValueChanged += new EventHandler(WeightsParameter_ValueChanged);
    208212      Weights.RowsChanged += new EventHandler(Weights_RowsChanged);
    209       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
    210       Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     213      CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged);
     214      Coordinates.Reset += new EventHandler(Coordinates_Reset);
     215      Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged);
    211216    }
    212217
     
    226231      if (Evaluator != null) {
    227232        Evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
    228         Evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
    229233        Evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name;
    230234        Evaluator.CoordinatesParameter.ActualName = CoordinatesParameter.Name;
     
    265269      }
    266270    }
     271
     272    private void UpdateDistanceMatrix() {
     273      if (Coordinates != null && Coordinates.Columns == 2 && Coordinates.Rows > 1) {
     274        DistanceMatrix = new DoubleMatrix(Coordinates.Rows, Coordinates.Rows);
     275        for (int i = 0; i < Coordinates.Rows - 1; i++) {
     276          for (int j = i + 1; j < Coordinates.Rows; j++) {
     277            double dx = Coordinates[i, 0] - Coordinates[j, 0];
     278            double dy = Coordinates[i, 1] - Coordinates[j, 1];
     279            DistanceMatrix[i, j] = Math.Sqrt(dx * dx + dy * dy);
     280            DistanceMatrix[j, i] = DistanceMatrix[i, j];
     281          }
     282        }
     283      }
     284    }
    267285    #endregion
    268286
     
    273291      DistanceMatrix = new DoubleMatrix(parser.Distances);
    274292      Weights = new DoubleMatrix(parser.Weights);
    275       UseDistanceMatrix.Value = true;
    276293      Name = "Quadratic Assignment Problem (imported from " + Path.GetFileNameWithoutExtension(filename) + ")";
    277294      Description = "Imported problem data using QAPLIBParser " + Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).Cast<AssemblyFileVersionAttribute>().FirstOrDefault().Version + ".";
     295      BestKnownQuality = null;
     296      BestKnownSolution = null;
    278297      OnReset();
    279298    }
     
    287306        DistanceMatrix = new DoubleMatrix(parser.Distances);
    288307        Weights = new DoubleMatrix(parser.Weights);
    289         UseDistanceMatrix.Value = true;
    290308        Name = "Quadratic Assignment Problem (loaded instance " + instance + ")";
    291309        Description = "Loaded embedded problem data of instance " + instance + ".";
    292310        OnReset();
    293311      }
     312      bool solutionExists = Assembly.GetExecutingAssembly()
     313          .GetManifestResourceNames()
     314          .Where(x => x.EndsWith(instance + ".sln"))
     315          .Any();
     316      if (solutionExists) {
     317        using (Stream solStream = Assembly.GetExecutingAssembly()
     318          .GetManifestResourceStream(InstancePrefix + instance + ".sln")) {
     319          QAPLIBSolutionParser solParser = new QAPLIBSolutionParser();
     320          solParser.Parse(solStream);
     321          BestKnownQuality = new DoubleValue(solParser.Qualiy);
     322          BestKnownSolution = new Permutation(PermutationTypes.Absolute, solParser.Assignment);
     323        }
     324      } else {
     325        BestKnownQuality = null;
     326        BestKnownSolution = null;
     327      }
    294328    }
    295329  }
Note: See TracChangeset for help on using the changeset viewer.