- Timestamp:
- 01/25/12 18:32:44 (13 years ago)
- Location:
- branches/GeneralizedQAP
- Files:
-
- 3 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GeneralizedQAP
- Property svn:ignore
-
old new 1 1 *.suo 2 TestResults
-
- Property svn:ignore
-
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Analyzers/BestGQAPSolutionAnalyzer.cs
r7319 r7412 98 98 99 99 [StorableHook(HookType.AfterDeserialization)] 100 private void AfterDeserialization Hook() {100 private void AfterDeserialization() { 101 101 // BackwardsCompatibility3.3 102 102 #region Backwards compatible code, remove with 3.4 -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluators/GQAPEvaluator.cs
r7407 r7412 38 38 get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; } 39 39 } 40 public ILookupParameter<DoubleValue> InfeasibilityParameter {41 get { return (ILookupParameter<DoubleValue>)Parameters[" Infeasibility"]; }40 public ILookupParameter<DoubleValue> FlowDistanceQualityParameter { 41 get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; } 42 42 } 43 public IValueLookupParameter<DoubleValue> PenaltyParameter { 44 get { return (IValueLookupParameter<DoubleValue>)Parameters["Penalty"]; } 43 public ILookupParameter<DoubleValue> InstallationQualityParameter { 44 get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; } 45 } 46 public ILookupParameter<DoubleValue> OverbookedCapacityParameter { 47 get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; } 48 } 49 public IValueLookupParameter<DoubleValue> TransportationCostsParameter { 50 get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; } 51 } 52 public IValueLookupParameter<DoubleValue> OverbookedCapacityPenaltyParameter { 53 get { return (IValueLookupParameter<DoubleValue>)Parameters["OverbookedCapacityPenalty"]; } 45 54 } 46 55 public ILookupParameter<DoubleMatrix> WeightsParameter { … … 52 61 public ILookupParameter<DoubleMatrix> InstallationCostsParameter { 53 62 get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; } 54 }55 public ILookupParameter<DoubleValue> TransportationCostsParameter {56 get { return (ILookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }57 63 } 58 64 public ILookupParameter<DoubleArray> DemandsParameter { … … 71 77 public GQAPEvaluator() 72 78 : base() { 73 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality a.k.a. fitness of the solution.")); 74 Parameters.Add(new LookupParameter<DoubleValue>("Infeasibility", "The infeasibility describes the sum of the overbooked capacities.")); 75 Parameters.Add(new ValueLookupParameter<DoubleValue>("Penalty", "The multiplier for the constraint violation when added to the quality.", new DoubleValue(1000))); 79 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution.")); 80 Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", "The quality regarding the flow-distance criteria.")); 81 Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", "The quality regarding the installation costs.")); 82 Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", "The sum of the overbooked capacities relative to the capacity of each location.")); 83 Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights or distance matrix already.")); 84 Parameters.Add(new ValueLookupParameter<DoubleValue>("OverbookedCapacityPenalty", "The multiplier for the constraint violation when added to the quality.")); 76 85 Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", "The weights matrix describes the flows between the equipments.")); 77 86 Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", "The distances matrix describes the distances between the locations at which the equipment can be installed.")); 78 87 Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", "The installation costs matrix describes the installation costs of installing equipment i at location j")); 79 Parameters.Add(new LookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already."));80 88 Parameters.Add(new LookupParameter<DoubleArray>("Demands", "The demands vector describes the space requirements of the equipments.")); 81 89 Parameters.Add(new LookupParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations.")); … … 87 95 } 88 96 89 public static DoubleValue Evaluate(IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, 90 DoubleMatrix installCosts, double transportCosts, DoubleArray demands, DoubleArray capacities, 91 out double infeasibility) { 92 double quality = 0; 97 public static double Evaluate(IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, 98 DoubleMatrix installCosts, DoubleArray demands, DoubleArray capacities, 99 DoubleValue transportationCosts, DoubleValue overbookedCapacityPenalty) { 100 double flowDistanceQuality, installationQuality, overbookedCapacity; 101 Evaluate(assignment, weights, distances, installCosts, demands, capacities, 102 out flowDistanceQuality, out installationQuality, out overbookedCapacity); 103 return GetCombinedQuality(flowDistanceQuality, installationQuality, overbookedCapacity, 104 transportationCosts.Value, overbookedCapacityPenalty.Value); 105 } 106 107 public static void Evaluate(IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, 108 DoubleMatrix installCosts, DoubleArray demands, DoubleArray capacities, 109 out double flowDistanceQuality, out double installationQuality, out double overbookedCapacity) { 110 flowDistanceQuality = 0; 111 installationQuality = 0; 93 112 int len = assignment.Length; 94 113 var slack = (DoubleArray)capacities.Clone(); 95 114 for (int i = 0; i < len; i++) { 96 quality += installCosts[i, assignment[i]];115 installationQuality += installCosts[i, assignment[i]]; 97 116 for (int j = 0; j < len; j++) { 98 quality += transportCosts *weights[i, j] * distances[assignment[i], assignment[j]];117 flowDistanceQuality += weights[i, j] * distances[assignment[i], assignment[j]]; 99 118 } 100 119 slack[assignment[i]] -= demands[i]; 101 120 } 121 overbookedCapacity = slack.Select((v, i) => new { V = v, Index = i }).Where(x => x.V < 0.0).Select(x => -x.V / capacities[x.Index]).Sum(); 122 } 102 123 103 infeasibility = -slack.Where(x => x < 0).Sum(); 104 return new DoubleValue(quality); 124 public static double GetCombinedQuality(double flowDistanceQuality, double installationQuality, double overbookedCapacity, 125 double transportationCosts, double overbookedCapacityPenalty) { 126 return installationQuality 127 + transportationCosts * flowDistanceQuality 128 + overbookedCapacityPenalty * overbookedCapacity; 105 129 } 106 130 107 131 public override IOperation Apply() { 108 IntegerVector assignment = AssignmentParameter.ActualValue;109 DoubleMatrixweights = WeightsParameter.ActualValue;110 DoubleMatrixdistances = DistancesParameter.ActualValue;111 DoubleMatrixinstallCosts = InstallationCostsParameter.ActualValue;112 double transportCosts = TransportationCostsParameter.ActualValue.Value;113 DoubleArray demands = DemandsParameter.ActualValue;114 DoubleArray capacities = (DoubleArray)CapacitiesParameter.ActualValue.Clone();115 double penalty = PenaltyParameter.ActualValue.Value;132 var assignment = AssignmentParameter.ActualValue; 133 var weights = WeightsParameter.ActualValue; 134 var distances = DistancesParameter.ActualValue; 135 var installCosts = InstallationCostsParameter.ActualValue; 136 var demands = DemandsParameter.ActualValue; 137 var capacities = CapacitiesParameter.ActualValue; 138 var transportCosts = TransportationCostsParameter.ActualValue.Value; 139 double penalty = OverbookedCapacityPenaltyParameter.ActualValue.Value; 116 140 117 141 if (weights.Rows != weights.Columns || distances.Rows != distances.Columns … … 120 144 throw new InvalidOperationException("ERROR: The problem configuration is not valid! Check the sizes of the weights (NxN), distances (MxM) and installation costs (NxM) matrices as well as the length of the demand (N) and capacities (M) vectors."); 121 145 122 double infeasibility; 123 var quality = Evaluate(assignment, weights, distances, installCosts, transportCosts, demands, capacities, out infeasibility); 146 double flowDistanceQuality, installationQuality, overbookedCapacity; 147 Evaluate(assignment, weights, distances, installCosts, demands, capacities, 148 out flowDistanceQuality, out installationQuality, out overbookedCapacity); 124 149 125 InfeasibilityParameter.ActualValue = new DoubleValue(infeasibility); 126 QualityParameter.ActualValue = new DoubleValue(quality.Value + penalty * infeasibility); 150 FlowDistanceQualityParameter.ActualValue = new DoubleValue(flowDistanceQuality); 151 InstallationQualityParameter.ActualValue = new DoubleValue(installationQuality); 152 OverbookedCapacityParameter.ActualValue = new DoubleValue(overbookedCapacity); 153 154 QualityParameter.ActualValue = new DoubleValue(GetCombinedQuality(flowDistanceQuality, installationQuality, overbookedCapacity, transportCosts, penalty)); 127 155 return base.Apply(); 128 156 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluators/GQAPNMoveEvaluator.cs
r7407 r7412 44 44 get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; } 45 45 } 46 public ILookupParameter<DoubleValue> FlowDistanceQualityParameter { 47 get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; } 48 } 49 public ILookupParameter<DoubleValue> InstallationQualityParameter { 50 get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; } 51 } 52 public ILookupParameter<DoubleValue> OverbookedCapacityParameter { 53 get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; } 54 } 46 55 public ILookupParameter<DoubleValue> MoveQualityParameter { 47 56 get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; } 48 57 } 49 public ILookupParameter<DoubleValue> MoveInfeasibilityParameter { 50 get { return (ILookupParameter<DoubleValue>)Parameters["MoveInfeasibility"]; } 58 public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter { 59 get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; } 60 } 61 public ILookupParameter<DoubleValue> MoveInstallationQualityParameter { 62 get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; } 63 } 64 public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter { 65 get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; } 66 } 67 public IValueLookupParameter<DoubleValue> TransportationCostsParameter { 68 get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; } 69 } 70 public IValueLookupParameter<DoubleValue> OverbookedCapacityPenaltyParameter { 71 get { return (IValueLookupParameter<DoubleValue>)Parameters["OverbookedCapacityPenalty"]; } 51 72 } 52 73 public ILookupParameter<DoubleMatrix> WeightsParameter { … … 58 79 public ILookupParameter<DoubleMatrix> InstallationCostsParameter { 59 80 get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; } 60 }61 public ILookupParameter<DoubleValue> TransportationCostsParameter {62 get { return (ILookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }63 81 } 64 82 public ILookupParameter<DoubleArray> DemandsParameter { … … 77 95 Parameters.Add(new LookupParameter<NMove>("Move", "The move to perform.")); 78 96 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The solution quality.")); 97 Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", "The quality regarding the flow-distance criteria.")); 98 Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", "The quality regarding the installation costs.")); 99 Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", "The sum of the overbooked capacities relative to the capacity of each location.")); 79 100 Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move if it would be applied.")); 80 Parameters.Add(new LookupParameter<DoubleValue>("MoveInfeasibility", "The infeasibility of the move if it would be applied.")); 101 Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", "The quality of the move regarding the flow-distance criteria.")); 102 Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", "The quality of the move regarding the installation costs.")); 103 Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", "The sum of the overbooked capacities of the move relative to the capacity of each location.")); 104 Parameters.Add(new ValueLookupParameter<DoubleValue>("OverbookedCapacityPenalty", "The multiplier for the constraint violation when added to the quality.")); 105 Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights or distance matrix already.")); 81 106 Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", "The weights matrix describes the flows between the equipments.")); 82 107 Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", "The distances matrix describes the distances between the locations at which the equipment can be installed.")); 83 108 Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", "The installation costs matrix describes the installation costs of installing equipment i at location j")); 84 Parameters.Add(new LookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already."));85 109 Parameters.Add(new LookupParameter<DoubleArray>("Demands", "The demands vector describes the space requirements of the equipments.")); 86 110 Parameters.Add(new LookupParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations.")); … … 91 115 } 92 116 93 public static DoubleValue Evaluate(NMove move, IntegerVector assignment, DoubleValue quality, 94 DoubleArray demands, DoubleArray capacities, 95 DoubleMatrix weights, DoubleMatrix distances, 96 DoubleMatrix installationCosts, 97 DoubleValue transportationCosts, 98 out DoubleValue moveInfeasibility) { 99 double moveQuality = quality.Value; 117 public static double Evaluate(NMove move, IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts, 118 DoubleArray demands, DoubleArray capacities, DoubleValue transportationCosts, DoubleValue overbookedCapacityPenalty) { 119 double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity; 120 Evaluate(move, assignment, weights, distances, installationCosts, demands, capacities, 121 out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity); 122 return GQAPEvaluator.GetCombinedQuality(moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity, 123 transportationCosts.Value, overbookedCapacityPenalty.Value); 124 } 125 126 public static void Evaluate(NMove move, IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts, 127 DoubleArray demands, DoubleArray capacities, out double moveFlowDistanceQuality, out double moveInstallationQuality, out double moveOverbookedCapacity) { 128 moveFlowDistanceQuality = moveInstallationQuality = moveOverbookedCapacity = 0.0; 100 129 int moves = move.N; 101 130 var slack = (DoubleArray)capacities.Clone(); 131 var oldSlack = (DoubleArray)slack.Clone(); 102 132 Dictionary<int, int> moving = new Dictionary<int, int>(); 103 133 for (int i = 0; i < moves; i++) moving.Add(move.Equipments[i], move.Locations[i]); … … 106 136 int equip = move.Equipments[i]; 107 137 int newLoc = move.Locations[i]; 108 move Quality -= installationCosts[equip, assignment[equip]];109 move Quality += installationCosts[equip, newLoc];138 moveInstallationQuality -= installationCosts[equip, assignment[equip]]; 139 moveInstallationQuality += installationCosts[equip, newLoc]; 110 140 for (int j = 0; j < assignment.Length; j++) { 111 141 if (!moving.ContainsKey(j)) { 112 moveQuality += transportationCosts.Value * weights[equip, j] * (distances[newLoc, assignment[j]] - distances[assignment[equip], assignment[j]]); 113 moveQuality += transportationCosts.Value * weights[j, equip] * (distances[assignment[j], newLoc] - distances[assignment[j], assignment[equip]]); 142 moveFlowDistanceQuality += weights[equip, j] * distances[newLoc, assignment[j]]; 143 moveFlowDistanceQuality -= weights[equip, j] * distances[assignment[equip], assignment[j]]; 144 moveFlowDistanceQuality += weights[j, equip] * distances[assignment[j], newLoc]; 145 moveFlowDistanceQuality -= weights[j, equip] * distances[assignment[j], assignment[equip]]; 114 146 if (i == 0) { // only once for each untouched equipment deduct the demand from the capacity 115 147 slack[assignment[j]] -= demands[j]; 148 oldSlack[assignment[j]] -= demands[j]; 116 149 } 117 150 } else { 118 move Quality += transportationCosts.Value * weights[equip, j] * (distances[newLoc, moving[j]] - distances[assignment[equip], assignment[j]]);119 move Quality += transportationCosts.Value * weights[j, equip] * (distances[moving[j], newLoc] - distances[assignment[j], assignment[equip]]);151 moveFlowDistanceQuality += weights[equip, j] * distances[newLoc, moving[j]]; 152 moveFlowDistanceQuality -= weights[equip, j] * distances[assignment[equip], assignment[j]]; 120 153 } 121 154 } 122 155 slack[newLoc] -= demands[equip]; 156 oldSlack[assignment[equip]] -= demands[equip]; 123 157 } 124 158 125 moveInfeasibility = new DoubleValue(-slack.Where(x => x < 0).Sum()); 126 return new DoubleValue(moveQuality); 127 159 moveOverbookedCapacity = slack.Select((v, i) => new { V = v, Index = i }).Where(x => x.V < 0.0).Select(x => -x.V / capacities[x.Index]).Sum() 160 - oldSlack.Select((v, i) => new { V = v, Index = i }).Where(x => x.V < 0.0).Select(x => -x.V / capacities[x.Index]).Sum(); 128 161 } 129 162 130 163 public override IOperation Apply() { 131 DoubleValue moveInfeasibility; 132 MoveQualityParameter.ActualValue = Evaluate(MoveParameter.ActualValue, 133 AssignmentParameter.ActualValue, QualityParameter.ActualValue, 134 DemandsParameter.ActualValue, CapacitiesParameter.ActualValue, 135 WeightsParameter.ActualValue, DistancesParameter.ActualValue, 136 InstallationCostsParameter.ActualValue, 137 TransportationCostsParameter.ActualValue, out moveInfeasibility); 138 MoveInfeasibilityParameter.ActualValue = moveInfeasibility; 164 double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity; 165 double quality = QualityParameter.ActualValue.Value; 166 double transportationCosts = TransportationCostsParameter.ActualValue.Value; 167 double overbookedCapacityPenalty = OverbookedCapacityPenaltyParameter.ActualValue.Value; 168 169 double flowDistanceQuality = FlowDistanceQualityParameter.ActualValue.Value; 170 double installationQuality = InstallationQualityParameter.ActualValue.Value; 171 double overbookedCapacity = OverbookedCapacityParameter.ActualValue.Value; 172 173 Evaluate(MoveParameter.ActualValue, 174 AssignmentParameter.ActualValue, 175 WeightsParameter.ActualValue, DistancesParameter.ActualValue, 176 InstallationCostsParameter.ActualValue, 177 DemandsParameter.ActualValue, CapacitiesParameter.ActualValue, 178 out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity); 179 180 MoveFlowDistanceQualityParameter.ActualValue = new DoubleValue(flowDistanceQuality + moveFlowDistanceQuality); 181 MoveInstallationQualityParameter.ActualValue = new DoubleValue(installationQuality + moveInstallationQuality); 182 MoveOverbookedCapacityParameter.ActualValue = new DoubleValue(moveOverbookedCapacity); 183 184 MoveQualityParameter.ActualValue = new DoubleValue(GQAPEvaluator.GetCombinedQuality( 185 flowDistanceQuality + moveFlowDistanceQuality, 186 installationQuality + moveInstallationQuality, 187 moveOverbookedCapacity, 188 transportationCosts, 189 overbookedCapacityPenalty)); 139 190 return base.Apply(); 140 191 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/GeneralizedQuadraticAssignmentProblem.cs
r7407 r7412 53 53 get { return (ValueParameter<DoubleMatrix>)Parameters["InstallationCosts"]; } 54 54 } 55 public ValueParameter<DoubleArray> DemandsParameter { 56 get { return (ValueParameter<DoubleArray>)Parameters["Demands"]; } 57 } 58 public ValueParameter<DoubleArray> CapacitiesParameter { 59 get { return (ValueParameter<DoubleArray>)Parameters["Capacities"]; } 60 } 55 61 public FixedValueParameter<DoubleValue> TransportationCostsParameter { 56 62 get { return (FixedValueParameter<DoubleValue>)Parameters["TransportationCosts"]; } 57 63 } 58 public ValueParameter<DoubleArray> DemandsParameter { 59 get { return (ValueParameter<DoubleArray>)Parameters["Demands"]; } 60 } 61 public ValueParameter<DoubleArray> CapacitiesParameter { 62 get { return (ValueParameter<DoubleArray>)Parameters["Capacities"]; } 64 public FixedValueParameter<DoubleValue> OverbookedCapacityPenaltyParameter { 65 get { return (FixedValueParameter<DoubleValue>)Parameters["OverbookedCapacityPenalty"]; } 63 66 } 64 67 public OptionalValueParameter<IItem> BestKnownSolutionParameter { … … 80 83 set { InstallationCostsParameter.Value = value; } 81 84 } 85 public DoubleArray Demands { 86 get { return DemandsParameter.Value; } 87 set { DemandsParameter.Value = value; } 88 } 89 public DoubleArray Capacities { 90 get { return CapacitiesParameter.Value; } 91 set { CapacitiesParameter.Value = value; } 92 } 82 93 public double TransportationCosts { 83 94 get { return TransportationCostsParameter.Value.Value; } 84 95 set { TransportationCostsParameter.Value.Value = value; } 85 96 } 86 public DoubleArray Demands { 87 get { return DemandsParameter.Value; } 88 set { DemandsParameter.Value = value; } 89 } 90 public DoubleArray Capacities { 91 get { return CapacitiesParameter.Value; } 92 set { CapacitiesParameter.Value = value; } 97 public double OverbookedCapacityPenalty { 98 get { return TransportationCostsParameter.Value.Value; } 99 set { TransportationCostsParameter.Value.Value = value; } 93 100 } 94 101 #endregion … … 114 121 Parameters.Add(new ValueParameter<DoubleMatrix>("InstallationCosts", "The installation costs matrix describes the installation costs of installing equipment i at location j", new DoubleMatrix())); 115 122 Parameters.Add(new FixedValueParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.", new DoubleValue(1))); 123 Parameters.Add(new FixedValueParameter<DoubleValue>("OverbookedCapacityPenalty", "The multiplier for the constraint violation when added to the quality.", new DoubleValue(1000))); 116 124 Parameters.Add(new ValueParameter<DoubleArray>("Demands", "The demands vector describes the space requirements of the equipments.", new DoubleArray())); 117 125 Parameters.Add(new ValueParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations.", new DoubleArray())); … … 183 191 #region Helpers 184 192 [StorableHook(HookType.AfterDeserialization)] 185 private void AfterDeserialization Hook() {193 private void AfterDeserialization() { 186 194 AttachEventHandlers(); 187 195 } … … 220 228 } 221 229 foreach (var op in Operators.OfType<IGQAPEvaluationOperator>()) { 230 op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName; 231 op.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name; 232 op.OverbookedCapacityPenaltyParameter.ActualName = OverbookedCapacityPenaltyParameter.Name; 222 233 op.WeightsParameter.ActualName = WeightsParameter.Name; 223 234 op.DistancesParameter.ActualName = DistancesParameter.Name; 224 235 op.InstallationCostsParameter.ActualName = InstallationCostsParameter.Name; 225 op.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name;226 236 op.DemandsParameter.ActualName = DemandsParameter.Name; 227 237 op.CapacitiesParameter.ActualName = CapacitiesParameter.Name; 228 op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;229 238 } 230 239 foreach (var op in Operators.OfType<IGQAPLocalImprovementOperator>()) { 240 op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName; 241 op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; 242 op.FlowDistanceQualityParameter.ActualName = Evaluator.FlowDistanceQualityParameter.ActualName; 243 op.InstallationQualityParameter.ActualName = Evaluator.InstallationQualityParameter.ActualName; 244 op.OverbookedCapacityParameter.ActualName = Evaluator.OverbookedCapacityParameter.ActualName; 245 op.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name; 246 op.OverbookedCapacityPenaltyParameter.ActualName = OverbookedCapacityPenaltyParameter.Name; 231 247 op.WeightsParameter.ActualName = WeightsParameter.Name; 232 248 op.DistancesParameter.ActualName = DistancesParameter.Name; 233 249 op.InstallationCostsParameter.ActualName = InstallationCostsParameter.Name; 234 op.TransportationCostsParameter.ActualName = TransportationCostsParameter.Name;235 250 op.DemandsParameter.ActualName = DemandsParameter.Name; 236 251 op.CapacitiesParameter.ActualName = CapacitiesParameter.Name; 237 op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName;238 op.InfeasibilityParameter.ActualName = Evaluator.InfeasibilityParameter.ActualName;239 252 } 240 253 foreach (var op in Operators.OfType<IGQAPManipulator>()) { 241 254 op.IntegerVectorParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName; 255 } 256 foreach (var op in Operators.OfType<IGQAPMerger>()) { 257 op.AssignmentParameter.ActualName = SolutionCreator.AssignmentParameter.ActualName; 258 op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; 259 op.MaximizationParameter.ActualName = MaximizationParameter.Name; 242 260 } 243 261 foreach (var op in Operators.OfType<IGQAPMoveOperator>()) { -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/HeuristicLab.Problems.GeneralizedQuadraticAssignment-3.3.csproj
r7407 r7412 94 94 <Compile Include="Evaluators\GQAPEvaluator.cs" /> 95 95 <Compile Include="GeneralizedQuadraticAssignmentProblem.cs" /> 96 <Compile Include="GQAPIntegerVectorProximityCalculator.cs" /> 97 <Compile Include="Interfaces\IGQAPMerger.cs" /> 96 98 <Compile Include="Interfaces\IGQAPNMoveEvaluator.cs" /> 97 99 <Compile Include="Interfaces\IEquipmentAwareGQAPOperator.cs" /> … … 120 122 <Compile Include="Operators\GQAPSolutionCreator.cs" /> 121 123 <Compile Include="Operators\GreedyRandomizedSolutionCreator.cs" /> 124 <Compile Include="Operators\QualitySimilarityMerger.cs" /> 122 125 <Compile Include="Operators\RandomSolutionCreator.cs" /> 123 126 <Compile Include="Operators\RelocateEquipmentManipluator.cs" /> -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPEvaluationOperator.cs
r7407 r7412 29 29 ILookupParameter<DoubleMatrix> DistancesParameter { get; } 30 30 ILookupParameter<DoubleMatrix> InstallationCostsParameter { get; } 31 ILookupParameter<DoubleValue> TransportationCostsParameter { get; }32 31 ILookupParameter<DoubleArray> DemandsParameter { get; } 33 32 ILookupParameter<DoubleArray> CapacitiesParameter { get; } 34 33 ILookupParameter<IntegerVector> AssignmentParameter { get; } 34 35 IValueLookupParameter<DoubleValue> TransportationCostsParameter { get; } 36 IValueLookupParameter<DoubleValue> OverbookedCapacityPenaltyParameter { get; } 35 37 } 36 38 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPEvaluator.cs
r7407 r7412 26 26 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment { 27 27 public interface IGQAPEvaluator : IGQAPEvaluationOperator, ISingleObjectiveEvaluator { 28 ILookupParameter<DoubleValue> InfeasibilityParameter { get; } 28 ILookupParameter<DoubleValue> FlowDistanceQualityParameter { get; } 29 ILookupParameter<DoubleValue> InstallationQualityParameter { get; } 30 ILookupParameter<DoubleValue> OverbookedCapacityParameter { get; } 29 31 } 30 32 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPLocalImprovementOperator.cs
r7407 r7412 28 28 public interface IGQAPLocalImprovementOperator : IGQAPOperator, ILocalImprovementOperator { 29 29 ILookupParameter<DoubleValue> QualityParameter { get; } 30 ILookupParameter<DoubleValue> InfeasibilityParameter { get; } 31 ILookupParameter<ResultCollection> ResultsParameter { get; } 30 ILookupParameter<DoubleValue> FlowDistanceQualityParameter { get; } 31 ILookupParameter<DoubleValue> InstallationQualityParameter { get; } 32 ILookupParameter<DoubleValue> OverbookedCapacityParameter { get; } 32 33 IValueLookupParameter<IntValue> MaximumCandidateListSizeParameter { get; } 33 34 IValueLookupParameter<IntValue> MaximumSampleSizeParameter { get; } … … 36 37 ILookupParameter<DoubleMatrix> DistancesParameter { get; } 37 38 ILookupParameter<DoubleMatrix> InstallationCostsParameter { get; } 38 ILookupParameter<DoubleValue> TransportationCostsParameter { get; }39 39 ILookupParameter<DoubleArray> DemandsParameter { get; } 40 40 ILookupParameter<DoubleArray> CapacitiesParameter { get; } 41 IValueLookupParameter<DoubleValue> TransportationCostsParameter { get; } 42 IValueLookupParameter<DoubleValue> OverbookedCapacityPenaltyParameter { get; } 41 43 } 42 44 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Interfaces/IGQAPMoveEvaluator.cs
r7407 r7412 20 20 #endregion 21 21 22 using HeuristicLab.Core; 23 using HeuristicLab.Data; 22 24 using HeuristicLab.Optimization; 23 25 24 26 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment { 25 public interface IGQAPMoveEvaluator : IGQAPEvaluationOperator, ISingleObjectiveMoveEvaluator { } 27 public interface IGQAPMoveEvaluator : IGQAPEvaluationOperator, ISingleObjectiveMoveEvaluator { 28 ILookupParameter<DoubleValue> FlowDistanceQualityParameter { get; } 29 ILookupParameter<DoubleValue> InstallationQualityParameter { get; } 30 ILookupParameter<DoubleValue> OverbookedCapacityParameter { get; } 31 } 26 32 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/NMoveMaker.cs
r7407 r7412 42 42 get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; } 43 43 } 44 public ILookupParameter<DoubleValue> InfeasibilityParameter { 45 get { return (ILookupParameter<DoubleValue>)Parameters["Infeasibility"]; } 44 public ILookupParameter<DoubleValue> FlowDistanceQualityParameter { 45 get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; } 46 } 47 public ILookupParameter<DoubleValue> InstallationQualityParameter { 48 get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; } 49 } 50 public ILookupParameter<DoubleValue> OverbookedCapacityParameter { 51 get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; } 46 52 } 47 53 public ILookupParameter<DoubleValue> MoveQualityParameter { 48 54 get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; } 49 55 } 50 public ILookupParameter<DoubleValue> MoveInfeasibilityParameter { 51 get { return (ILookupParameter<DoubleValue>)Parameters["MoveInfeasibility"]; } 56 public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter { 57 get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; } 58 } 59 public ILookupParameter<DoubleValue> MoveInstallationQualityParameter { 60 get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; } 61 } 62 public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter { 63 get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; } 52 64 } 53 65 … … 60 72 Parameters.Add(new LookupParameter<NMove>("Move", "The move to perform.")); 61 73 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The solution quality.")); 62 Parameters.Add(new LookupParameter<DoubleValue>("Infeasibility", "The infeasibility of a solution.")); 74 Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", "The quality regarding the flow-distance criteria.")); 75 Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", "The quality regarding the installation costs.")); 76 Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", "The sum of the overbooked capacities relative to the capacity of each location.")); 63 77 Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move if it would be applied.")); 64 Parameters.Add(new LookupParameter<DoubleValue>("MoveInfeasibility", "The infeasibility of the move if it would be applied.")); 78 Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", "The quality of the move regarding the flow-distance criteria.")); 79 Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", "The quality of the move regarding the installation costs.")); 80 Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", "The sum of the overbooked capacities of the move relative to the capacity of each location.")); 65 81 } 66 82 … … 78 94 Apply(AssignmentParameter.ActualValue, MoveParameter.ActualValue); 79 95 QualityParameter.ActualValue.Value = MoveQualityParameter.ActualValue.Value; 80 InfeasibilityParameter.ActualValue.Value = MoveInfeasibilityParameter.ActualValue.Value; 96 FlowDistanceQualityParameter.ActualValue.Value = MoveFlowDistanceQualityParameter.ActualValue.Value; 97 InstallationQualityParameter.ActualValue.Value = MoveInstallationQualityParameter.ActualValue.Value; 98 OverbookedCapacityParameter.ActualValue.Value = MoveOverbookedCapacityParameter.ActualValue.Value; 81 99 return base.Apply(); 82 100 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveMultiMoveGenerator.cs
r7407 r7412 60 60 public static IEnumerable<NMove> Generate(IRandom random, IntegerVector assignment, int n, DoubleArray capacities, int sampleSize) { 61 61 for (int i = 0; i < sampleSize; i++) 62 yield return StochasticNMoveSingleMoveGenerator.Generate (random, assignment, n, capacities);62 yield return StochasticNMoveSingleMoveGenerator.GenerateUpToN(random, assignment, n, capacities); 63 63 } 64 64 -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Moves/StochasticNMoveSingleMoveGenerator.cs
r7407 r7412 54 54 } 55 55 56 public static NMove Generate(IRandom random, IntegerVector assignment, int n, DoubleArray capacities) { 57 int moving = random.Next(n) + 1; 58 int[] equipments = new int[moving], locations = new int[moving]; 56 public static NMove GenerateUpToN(IRandom random, IntegerVector assignment, int n, DoubleArray capacities) { 57 return GenerateExactlyN(random, assignment, random.Next(n) + 1, capacities); 58 } 59 60 public static NMove GenerateExactlyN(IRandom random, IntegerVector assignment, int n, DoubleArray capacities) { 61 int[] equipments = new int[n], locations = new int[n]; 59 62 HashSet<int> chosenEquipments = new HashSet<int>(); 60 for (int i = 0; i < moving; i++) {63 for (int i = 0; i < n; i++) { 61 64 do { 62 65 equipments[i] = random.Next(assignment.Length); … … 71 74 72 75 public override IEnumerable<NMove> GenerateMoves(IntegerVector assignment, int n) { 73 yield return Generate (RandomParameter.ActualValue, assignment, n, CapacitiesParameter.ActualValue);76 yield return GenerateUpToN(RandomParameter.ActualValue, assignment, n, CapacitiesParameter.ActualValue); 74 77 } 75 78 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/ApproximateLocalSearch.cs
r7407 r7412 55 55 get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; } 56 56 } 57 public ILookupParameter<DoubleValue> InfeasibilityParameter { 58 get { return (ILookupParameter<DoubleValue>)Parameters["Infeasibility"]; } 57 public ILookupParameter<DoubleValue> FlowDistanceQualityParameter { 58 get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; } 59 } 60 public ILookupParameter<DoubleValue> InstallationQualityParameter { 61 get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; } 62 } 63 public ILookupParameter<DoubleValue> OverbookedCapacityParameter { 64 get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; } 59 65 } 60 66 public ILookupParameter<ResultCollection> ResultsParameter { … … 79 85 get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; } 80 86 } 81 public ILookupParameter<DoubleValue> TransportationCostsParameter {82 get { return (ILookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }83 }84 87 public ILookupParameter<DoubleArray> DemandsParameter { 85 88 get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; } … … 88 91 get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; } 89 92 } 90 93 public IValueLookupParameter<DoubleValue> TransportationCostsParameter { 94 get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; } 95 } 96 public IValueLookupParameter<DoubleValue> OverbookedCapacityPenaltyParameter { 97 get { return (IValueLookupParameter<DoubleValue>)Parameters["OverbookedCapacityPenalty"]; } 98 } 99 public IValueLookupParameter<PercentValue> OneMoveProbabilityParameter { 100 get { return (IValueLookupParameter<PercentValue>)Parameters["OneMoveProbability"]; } 101 } 91 102 92 103 [StorableConstructor] … … 99 110 Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solution equivalents.")); 100 111 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The solution quality.")); 101 Parameters.Add(new LookupParameter<DoubleValue>("Infeasibility", "The infeasibility describes the sum of the overbooked capacities.")); 112 Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", "The quality regarding the flow-distance criteria.")); 113 Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", "The quality regarding the installation costs.")); 114 Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", "The sum of the overbooked capacities relative to the capacity of each location.")); 102 115 Parameters.Add(new LookupParameter<ResultCollection>("Results", "The result collection that stores the results.")); 103 116 Parameters.Add(new ValueLookupParameter<IntValue>("MaximumCandidateListSize", "The maximum number of candidates that should be found in each step.", new IntValue(10))); … … 107 120 Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", "The distances matrix describes the distances between the locations at which the equipment can be installed.")); 108 121 Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", "The installation costs matrix describes the installation costs of installing equipment i at location j.")); 109 Parameters.Add(new LookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already."));110 122 Parameters.Add(new LookupParameter<DoubleArray>("Demands", "The demands vector describes the space requirements of the equipments.")); 111 123 Parameters.Add(new LookupParameter<DoubleArray>("Capacities", "The capacities vector describes the available space at the locations.")); 124 Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", "The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.")); 125 Parameters.Add(new ValueLookupParameter<DoubleValue>("OverbookedCapacityPenalty", "The multiplier for the constraint violation when added to the quality.")); 126 Parameters.Add(new ValueLookupParameter<PercentValue>("OneMoveProbability", "The probability for performing a 1-move, which is the opposite of performing a 2-move.", new PercentValue(.5))); 112 127 } 113 128 … … 124 139 /// <param name="assignment">The equipment-location assignment vector.</param> 125 140 /// <param name="quality">The solution quality.</param> 126 /// <param name="infeasibility">The infeasibility describes the sum of the overbooked capacities.</param> 141 /// <param name="flowDistanceQuality">The quality regarding the flow-distance criteria.</param> 142 /// <param name="installationQuality">The quality regarding the installation costs.</param> 143 /// <param name="overbookedCapacity">The sum of the overbooked capacities relative to the capacity of each location.</param> 127 144 /// <param name="maxCLS">The maximum number of candidates that should be found in each step.</param> 128 145 /// <param name="maxSampleSize">The maximum number of candidates that should be sampled in each step.</param> 129 146 /// <param name="maximumIterations">The maximum number of iterations that should be performed.</param> 130 /// <param name="demands">The demands vector describes the space requirements of the equipments.</param>131 /// <param name="capacities">The capacities vector describes the available space at the locations.</param>132 147 /// <param name="weights">The weights matrix describes the flows between the equipments.</param> 133 148 /// <param name="distances">The distances matrix describes the distances between the locations at which the equipment can be installed.</param> 134 149 /// <param name="installationCosts">The installation costs matrix describes the installation costs of installing equipment i at location j</param> 150 /// <param name="demands">The demands vector describes the space requirements of the equipments.</param> 151 /// <param name="capacities">The capacities vector describes the available space at the locations.</param> 135 152 /// <param name="transportationCosts">The transportation cost represents the flow-unit per distance-unit cost factor. This value can also be set to 1 if these costs are factored into the weights matrix already.</param> 136 public static void Apply(IRandom random, IntegerVector assignment, DoubleValue quality, DoubleValue infeasibility, 137 IntValue maxCLS, IntValue maxSampleSize, IntValue maximumIterations, 138 DoubleArray demands, DoubleArray capacities, 139 DoubleMatrix weights, DoubleMatrix distances, 140 DoubleMatrix installationCosts, 141 DoubleValue transportationCosts) { 153 /// <param name="overbookedCapacityPenalty"></param> 154 /// <param name="oneMoveProbability">The probability for performing a 1-move, which is the opposite of performing a 2-move.</param> 155 public static void Apply(IRandom random, IntegerVector assignment, 156 DoubleValue quality, DoubleValue flowDistanceQuality, DoubleValue installationQuality, DoubleValue overbookedCapacity, 157 IntValue maxCLS, IntValue maxSampleSize, IntValue maximumIterations, 158 DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts, DoubleArray demands, DoubleArray capacities, 159 DoubleValue transportationCosts, DoubleValue overbookedCapacityPenalty, PercentValue oneMoveProbability) { 160 142 161 for (int i = 0; i < maximumIterations.Value; i++) { 143 162 int count = 0; 144 var CLS = new List<Tuple<NMove, DoubleValue, DoubleValue>>();163 var CLS = new List<Tuple<NMove, double, double, double, double>>(); 145 164 double sum = 0.0; 146 165 do { 147 var move = StochasticNMoveSingleMoveGenerator.Generate(random, assignment, 2, capacities); 148 DoubleValue moveInfeasibility; 149 var moveQuality = GQAPNMoveEvaluator.Evaluate(move, assignment, quality, 150 demands, capacities, weights, distances, 151 installationCosts, transportationCosts, out moveInfeasibility); 152 if (moveInfeasibility.Value <= 0.0 && moveQuality.Value < quality.Value) { 153 CLS.Add(Tuple.Create(move, moveQuality, moveInfeasibility)); 154 sum += 1.0 / moveQuality.Value; 166 NMove move; 167 if (random.NextDouble() < oneMoveProbability.Value) 168 move = StochasticNMoveSingleMoveGenerator.GenerateExactlyN(random, assignment, 1, capacities); 169 else move = StochasticNMoveSingleMoveGenerator.GenerateExactlyN(random, assignment, 2, capacities); 170 171 double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity; 172 GQAPNMoveEvaluator.Evaluate(move, assignment, weights, distances, installationCosts, 173 demands, capacities, out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity); 174 double moveQuality = GQAPEvaluator.GetCombinedQuality(moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity, 175 transportationCosts.Value, overbookedCapacityPenalty.Value); 176 177 if (moveOverbookedCapacity <= 0.0 && moveQuality < 0.0) { 178 CLS.Add(Tuple.Create(move, moveQuality, moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity)); 179 sum += 1.0 / moveQuality; 155 180 } 156 181 count++; 157 182 } while (CLS.Count < maxCLS.Value && count < maxSampleSize.Value); 158 if (CLS.Count == 0) return; // END 183 184 if (CLS.Count == 0) 185 return; // END 159 186 else { 160 187 var ball = random.NextDouble() * sum; 161 188 var selected = CLS.Last(); 162 189 foreach (var candidate in CLS) { 163 ball -= 1.0 / candidate.Item2 .Value;190 ball -= 1.0 / candidate.Item2; 164 191 if (ball <= 0.0) { 165 192 selected = candidate; … … 168 195 } 169 196 NMoveMaker.Apply(assignment, selected.Item1); 170 quality.Value = selected.Item2.Value; 171 infeasibility.Value = selected.Item3.Value; 197 quality.Value += selected.Item2; 198 flowDistanceQuality.Value += selected.Item3; 199 installationQuality.Value += selected.Item4; 200 overbookedCapacity.Value += selected.Item5; 172 201 } 173 202 } … … 178 207 AssignmentParameter.ActualValue, 179 208 QualityParameter.ActualValue, 180 InfeasibilityParameter.ActualValue, 209 FlowDistanceQualityParameter.ActualValue, 210 InstallationQualityParameter.ActualValue, 211 OverbookedCapacityParameter.ActualValue, 181 212 MaximumCandidateListSizeParameter.ActualValue, 182 213 MaximumSampleSizeParameter.ActualValue, 183 214 MaximumIterationsParameter.ActualValue, 184 DemandsParameter.ActualValue, CapacitiesParameter.ActualValue,185 215 WeightsParameter.ActualValue, DistancesParameter.ActualValue, 186 216 InstallationCostsParameter.ActualValue, 187 TransportationCostsParameter.ActualValue); 217 DemandsParameter.ActualValue, CapacitiesParameter.ActualValue, 218 TransportationCostsParameter.ActualValue, 219 OverbookedCapacityPenaltyParameter.ActualValue, 220 OneMoveProbabilityParameter.ActualValue); 188 221 return base.Apply(); 189 222 } -
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/GreedyRandomizedSolutionCreator.cs
r7407 r7412 60 60 while (tries < maxTries) { 61 61 assignment.Clear(); 62 demands.Select((v, i) => slack[i] = v).Enumerate();62 capacities.Select((v, i) => slack[i] = v).Enumerate(); 63 63 HashSet<int> CF = new HashSet<int>(), // set of chosen facilities / equipments 64 64 T = new HashSet<int>(), // set of facilities / equpiments that can be assigned to the set of chosen locations (CL)
Note: See TracChangeset
for help on using the changeset viewer.