本文整理汇总了C#中IVRPProblemInstance.GetDistance方法的典型用法代码示例。如果您正苦于以下问题:C# IVRPProblemInstance.GetDistance方法的具体用法?C# IVRPProblemInstance.GetDistance怎么用?C# IVRPProblemInstance.GetDistance使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IVRPProblemInstance
的用法示例。
在下文中一共展示了IVRPProblemInstance.GetDistance方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetTourInsertionCosts
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
out bool feasible) {
StopInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index);
double costs = 0;
feasible = true;
double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
double newDistance =
instance.GetDistance(insertionInfo.Start, customer, solution) +
instance.GetDistance(customer, insertionInfo.End, solution);
costs += instance.DistanceFactor.Value * (newDistance - distance);
return costs;
}
示例2: EvaluateTour
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));
eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
double distance = 0.0;
double quality = 0.0;
//simulate a tour, start and end at depot
for (int i = 0; i <= tour.Stops.Count; i++) {
int start = 0;
if (i > 0)
start = tour.Stops[i - 1];
int end = 0;
if (i < tour.Stops.Count)
end = tour.Stops[i];
//drive there
double currentDistace = instance.GetDistance(start, end, solution);
distance += currentDistace;
StopInsertionInfo stopInfo = new StopInsertionInfo(start, end);
tourInfo.AddStopInsertionInfo(stopInfo);
}
//Fleet usage
quality += instance.FleetUsageFactor.Value;
//Distance
quality += instance.DistanceFactor.Value * distance;
eval.Distance += distance;
eval.VehicleUtilization += 1;
tourInfo.Quality = quality;
eval.Quality += quality;
}
示例3: EvaluateTour
protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution) {
TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour))); ;
eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
double originalQuality = eval.Quality;
IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
DoubleArray demand = instance.Demand;
double delivered = 0.0;
double overweight = 0.0;
double distance = 0.0;
double capacity = cvrpInstance.Capacity.Value;
for (int i = 0; i <= tour.Stops.Count; i++) {
int end = 0;
if (i < tour.Stops.Count)
end = tour.Stops[i];
delivered += demand[end];
}
double spareCapacity = capacity - delivered;
//simulate a tour, start and end at depot
for (int i = 0; i <= tour.Stops.Count; i++) {
int start = 0;
if (i > 0)
start = tour.Stops[i - 1];
int end = 0;
if (i < tour.Stops.Count)
end = tour.Stops[i];
//drive there
double currentDistace = instance.GetDistance(start, end, solution);
distance += currentDistace;
CVRPInsertionInfo stopInfo = new CVRPInsertionInfo(start, end, spareCapacity);
tourInfo.AddStopInsertionInfo(stopInfo);
}
eval.Quality += instance.FleetUsageFactor.Value;
eval.Quality += instance.DistanceFactor.Value * distance;
eval.Distance += distance;
eval.VehicleUtilization += 1;
if (delivered > capacity) {
overweight = delivered - capacity;
}
(eval as CVRPEvaluation).Overload += overweight;
double penalty = overweight * cvrpInstance.OverloadPenalty.Value;
eval.Penalty += penalty;
eval.Quality += penalty;
tourInfo.Penalty = penalty;
tourInfo.Quality = eval.Quality - originalQuality;
}
示例4: GetTourLength
public double GetTourLength(IVRPProblemInstance instance, IVRPEncoding solution) {
double length = 0;
if (Stops.Count > 0) {
List<int> cities = new List<int>();
cities.Add(0);
foreach (int city in Stops) {
cities.Add(city);
}
cities.Add(0);
for (int i = 1; i < cities.Count; i++) {
length += instance.GetDistance(cities[i - 1], cities[i], solution);
}
}
return length;
}
示例5: GetTourInsertionCosts
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
out bool feasible) {
CVRPInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPInsertionInfo;
double costs = 0;
feasible = tourInsertionInfo.Penalty < double.Epsilon;
ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
double overloadPenalty = cvrp.OverloadPenalty.Value;
double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
double newDistance =
instance.GetDistance(insertionInfo.Start, customer, solution) +
instance.GetDistance(customer, insertionInfo.End, solution);
costs += instance.DistanceFactor.Value * (newDistance - distance);
double demand = instance.Demand[customer];
if (demand > insertionInfo.SpareCapacity) {
feasible = false;
if (insertionInfo.SpareCapacity >= 0)
costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
else
costs += demand * overloadPenalty;
}
return costs;
}
示例6: GetTourInsertionCosts
protected override double GetTourInsertionCosts(IVRPProblemInstance instance, IVRPEncoding solution, TourInsertionInfo tourInsertionInfo, int index, int customer,
out bool feasible) {
CVRPTWInsertionInfo insertionInfo = tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo;
double costs = 0;
feasible = tourInsertionInfo.Penalty < double.Epsilon;
ICapacitatedProblemInstance cvrp = instance as ICapacitatedProblemInstance;
double overloadPenalty = cvrp.OverloadPenalty.Value;
ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
DoubleArray dueTime = vrptw.DueTime;
DoubleArray readyTime = vrptw.ReadyTime;
DoubleArray serviceTimes = vrptw.ServiceTime;
double tardinessPenalty = vrptw.TardinessPenalty.Value;
double distance = instance.GetDistance(insertionInfo.Start, insertionInfo.End, solution);
double newDistance =
instance.GetDistance(insertionInfo.Start, customer, solution) +
instance.GetDistance(customer, insertionInfo.End, solution);
costs += instance.DistanceFactor.Value * (newDistance - distance);
double demand = instance.Demand[customer];
if (demand > insertionInfo.SpareCapacity) {
feasible = false;
if (insertionInfo.SpareCapacity >= 0)
costs += (demand - insertionInfo.SpareCapacity) * overloadPenalty;
else
costs += demand * overloadPenalty;
}
double time = 0;
double tardiness = 0;
if (index > 0)
time = (tourInsertionInfo.GetStopInsertionInfo(index - 1) as CVRPTWInsertionInfo).LeaveTime;
else
time = insertionInfo.TourStartTime;
time += instance.GetDistance(insertionInfo.Start, customer, solution);
if (time > dueTime[customer]) {
tardiness += time - dueTime[customer];
}
if (time < readyTime[customer])
time += readyTime[customer] - time;
time += serviceTimes[customer];
time += instance.GetDistance(customer, insertionInfo.End, solution);
double additionalTime = time - (tourInsertionInfo.GetStopInsertionInfo(index) as CVRPTWInsertionInfo).ArrivalTime;
for (int i = index; i < tourInsertionInfo.GetStopCount(); i++) {
CVRPTWInsertionInfo nextStop = tourInsertionInfo.GetStopInsertionInfo(i) as CVRPTWInsertionInfo;
if (additionalTime < 0) {
//arrive earlier than before
//wait probably
if (nextStop.WaitingTime < 0) {
double wait = nextStop.WaitingTime - additionalTime;
if (wait > 0)
additionalTime += wait;
} else {
additionalTime = 0;
}
//check due date, decrease tardiness
if (nextStop.SpareTime < 0) {
costs += Math.Max(nextStop.SpareTime, additionalTime) * tardinessPenalty;
}
} else {
//arrive later than before, probably don't have to wait
if (nextStop.WaitingTime > 0) {
additionalTime -= Math.Min(additionalTime, nextStop.WaitingTime);
}
//check due date
if (nextStop.SpareTime > 0) {
double spare = nextStop.SpareTime - additionalTime;
if (spare < 0)
tardiness += -spare;
} else {
tardiness += additionalTime;
}
}
}
costs += additionalTime * vrptw.TimeFactor.Value;
if (tardiness > 0) {
feasible = false;
}
costs += tardiness * tardinessPenalty;
return costs;
}