本文整理汇总了C#中IRoute.ReplaceEdgeFrom方法的典型用法代码示例。如果您正苦于以下问题:C# IRoute.ReplaceEdgeFrom方法的具体用法?C# IRoute.ReplaceEdgeFrom怎么用?C# IRoute.ReplaceEdgeFrom使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IRoute
的用法示例。
在下文中一共展示了IRoute.ReplaceEdgeFrom方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ConsiderCustomer
/// <summary>
/// Considers one customer for relocation.
/// </summary>
/// <param name="problem"></param>
/// <param name="route"></param>
/// <param name="previous"></param>
/// <param name="current"></param>
/// <param name="next"></param>
/// <param name="route_weight"></param>
/// <param name="max"></param>
/// <returns></returns>
private bool ConsiderCustomer(IProblemWeights problem, IRoute route, int previous, int current, int next, double route_weight, double max)
{
// calculate the removal gain of the customer.
double removal_gain = problem.WeightMatrix[previous][current] + problem.WeightMatrix[current][next]
- problem.WeightMatrix[previous][next];
if (removal_gain > 0.0001)
{
// try and place the customer in the next route.
CheapestInsertionResult result =
CheapestInsertionHelper.CalculateBestPlacement(problem, route, current);
if (result.Increase < removal_gain - 0.001 && route_weight + result.Increase < max)
{ // there is a gain in relocating this customer.
int count_before = route.Count;
// string route_string = route.ToString();
// and the route is still within bounds!
route.ReplaceEdgeFrom(result.CustomerBefore, result.Customer);
route.ReplaceEdgeFrom(result.Customer, result.CustomerAfter);
int count_after = route.Count;
if (count_before + 1 != count_after)
{
throw new Exception();
}
return true;
}
}
return false;
}
示例2: Try3OptMoves
/// <summary>
/// Tries all 3Opt Moves for the neighbourhood of v_1 containing v_3.
/// </summary>
/// <param name="problem"></param>
/// <param name="weights"></param>
/// <param name="route"></param>
/// <param name="v1"></param>
/// <param name="v_2"></param>
/// <param name="v_3"></param>
/// <param name="weights_3"></param>
/// <param name="v_4"></param>
/// <param name="weight_1_2_plus_3_4"></param>
/// <param name="weight_1_4"></param>
/// <returns></returns>
public bool Try3OptMoves(IProblemWeights problem, double[][] weights, IRoute route,
int v1, int v_2, int v_3, double[] weights_3, int v_4, double weight_1_2_plus_3_4, double weight_1_4)
{
//IEnumerable<int> between_v_4_v_1 = route.Between(v_4, v_1);
//foreach (int v_5 in between_v_4_v_1)
//{
// if (v_5 != v_1)
// {
// if (this.Try3OptMove(problem, weights, route, v_1, v_2, v_3, weights_3, v_4, weight_1_2_plus_3_4, weight_1_4, v_5))
// {
// return true;
// }
// }
//}
//return false;
IEnumerator<int> between_v_4_v_1_enumerator = route.Between(v_4, v1).GetEnumerator();
if (between_v_4_v_1_enumerator.MoveNext())
{
int v_5 = between_v_4_v_1_enumerator.Current;
if (v_5 != v1)
{
while (between_v_4_v_1_enumerator.MoveNext())
{
int v_6 = between_v_4_v_1_enumerator.Current;
//Console.WriteLine(v_6);
//if (this.Try3OptMove(problem, weights,
// route, v_1, v_2, v_3, weights_3, v_4,
// weight_1_2_plus_3_4, weight_1_4, v_5, v_6))
//{
// calculate the total weight of the 'new' arcs.
double weight_new = weight_1_4 +
weights_3[v_6] +
weights[v_5][v_2];
// calculate the total weights.
double weight = weight_1_2_plus_3_4 + weights[v_5][v_6];
if (weight - weight_new > _epsilon)
{ // actually do replace the vertices.
int count_before = route.Count;
//string route_string = route.ToString();
route.ReplaceEdgeFrom(v1, v_4);
route.ReplaceEdgeFrom(v_3, v_6);
route.ReplaceEdgeFrom(v_5, v_2);
int count_after = route.Count;
if (count_before != count_after)
{
throw new Exception();
}
// set bits.
//this.Set(problem, v_1, false);
this.Set(problem, v_3, false);
this.Set(problem, v_5, false);
if (!route.IsValid())
{
throw new Exception();
}
return true; // move succeeded.
}
//}
v_5 = v_6;
}
}
}
return false;
}