Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/20/17 15:41:27 (7 years ago)
Author:
abeham
Message:

#1614:

  • Implementing basic algorithm according to paper (rechecking all operators)
  • Checking implementation with paper
  • Improved speed of move generator
  • Improved speed of randomized solution creator
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs

    r15511 r15553  
    5757    }
    5858
     59    public static NMove GenerateOneMove(IRandom random, IntegerVector assignment, DoubleArray capacities) {
     60      var locations = capacities.Length;
     61      if (locations <= 1) throw new ArgumentException("There must be at least two locations.");
     62      var dim = assignment.Length;
     63      var equip = random.Next(dim);
     64      var equipments = new List<int>(1) { equip };
     65
     66      var reassignment = new int[dim];
     67      reassignment[equip] = ReassignEquipment(random, equip, assignment[equip], locations);
     68
     69      return new NMove(reassignment, equipments);
     70    }
     71
     72    public static NMove GenerateTwoMove(IRandom random, IntegerVector assignment, DoubleArray capacities) {
     73      var locations = capacities.Length;
     74      if (locations <= 1) throw new ArgumentException("There must be at least two locations.");
     75      var dim = assignment.Length;
     76      var equipments = new List<int>(2) { random.Next(dim), -1 };
     77      do {
     78        equipments[1] = random.Next(dim);
     79      } while (equipments[0] == equipments[1]);
     80
     81      var reassignment = new int[dim];
     82      for (var i = 0; i < 2; i++) {
     83        var equip = equipments[i];
     84        reassignment[equip] = ReassignEquipment(random, equip, assignment[equip], locations);
     85      }
     86      return new NMove(reassignment, equipments);
     87    }
     88
    5989    public static NMove GenerateExactlyN(IRandom random, IntegerVector assignment, int n, DoubleArray capacities) {
    60       if (capacities.Length <= 1) throw new ArgumentException("There must be at least two locations.");
     90      if (n == 1) return GenerateOneMove(random, assignment, capacities);
     91      if (n == 2) return GenerateTwoMove(random, assignment, capacities);
     92      var locations = capacities.Length;
     93      if (locations <= 1) throw new ArgumentException("There must be at least two locations.");
    6194      var dim = assignment.Length;
     95      var equipments = Enumerable.Range(0, dim).SampleRandomWithoutRepetition(random, n, dim).ToList();
     96
    6297      var reassignment = new int[dim];
    63       var equipments = Enumerable.Range(0, dim).SampleRandomWithoutRepetition(random, n, dim).ToList();
    6498      for (var i = 0; i < n; i++) {
    6599        var equip = equipments[i];
    66         do {
    67           reassignment[equip] = random.Next(capacities.Length) + 1;
    68         } while (reassignment[equip] == assignment[equip] + 1);
     100        reassignment[equip] = ReassignEquipment(random, equip, assignment[equip], locations);
    69101      }
    70102      return new NMove(reassignment, equipments);
     103    }
     104
     105    private static int ReassignEquipment(IRandom random, int equip, int prevLocation, int locations) {
     106      var newLoc = random.Next(locations) + 1;
     107      while (newLoc == prevLocation + 1)
     108        newLoc = random.Next(locations) + 1;
     109      return newLoc;
    71110    }
    72111
Note: See TracChangeset for help on using the changeset viewer.