Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2701_MemPRAlgorithm/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/Moves/StaticAPI/MoveGenerator.cs @ 17717

Last change on this file since 17717 was 14492, checked in by abeham, 8 years ago

#2701:

  • Updated LLE encoding
    • Made folder for version 3.4
    • Added conversion from and to LLE-b representation (back-links)
    • Updated moves and movegenerator to replace bidirectionaldictionary with LLE-b representation
  • Updated MemPR (linear linkage)
    • Updated tabu walk
  • Added test for conversion between LLE-e and LLE and LLE-b and LLE
  • Updated test for move apply/undo and added test for applying in sequence
File size: 2.3 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Collections.Generic;
23using System.Linq;
24using HeuristicLab.Collections;
25
26namespace HeuristicLab.Encodings.LinearLinkageEncoding {
27  public static class MoveGenerator {
28    public static IEnumerable<Move> GenerateForItem(int i, List<int> groupItems, LinearLinkage lle, int[] lleb) {
29      var pred = lleb[i];
30      var next = lle[i];
31      var isFirst = pred == i;
32      var isLast = next == i;
33
34      // First: shift i into each previous group
35      foreach (var m in groupItems.Where(x => lle[x] != i)) {
36        yield return new ShiftMove(i, pred, m, next, lle[m]);
37      }
38
39      if (!isLast) {
40        // Second: split group at i
41        yield return new SplitMove(i);
42
43        if (isFirst) {
44          // Third: merge with closed groups
45          foreach (var m in groupItems.Where(x => lle[x] == x)) {
46            yield return new MergeMove(i, m);
47          }
48        } else {
49          // Fourth: extract i into group of its own (exclude first and last, because of SplitMove)
50          yield return new ExtractMove(i, pred, next);
51        }
52      }
53       
54
55    }
56
57    public static IEnumerable<Move> Generate(LinearLinkage lle) {
58      var groupItems = new List<int>();
59      var lleb = lle.ToBackLinks();
60      for (var i = 0; i < lle.Length; i++) {
61        foreach (var move in GenerateForItem(i, groupItems, lle, lleb))
62          yield return move;
63        if (lleb[i] != i)
64          groupItems.Remove(lleb[i]);
65        groupItems.Add(i);
66      }
67    }
68  }
69}
Note: See TracBrowser for help on using the repository browser.