Changeset 15553 for branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves
- Timestamp:
- 12/20/17 15:41:27 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs
r15511 r15553 57 57 } 58 58 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 59 89 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."); 61 94 var dim = assignment.Length; 95 var equipments = Enumerable.Range(0, dim).SampleRandomWithoutRepetition(random, n, dim).ToList(); 96 62 97 var reassignment = new int[dim]; 63 var equipments = Enumerable.Range(0, dim).SampleRandomWithoutRepetition(random, n, dim).ToList();64 98 for (var i = 0; i < n; i++) { 65 99 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); 69 101 } 70 102 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; 71 110 } 72 111
Note: See TracChangeset
for help on using the changeset viewer.