2017-02-11 3 views
-1

これは大学の仕事です。私は数字や文字などの並べ替えを見つける方法を知っていますが、これはまったく異なります。ここに仕事があります:ユニークな条件を持つ学習対象のすべての組み合わせを見つける

学生は大学で勉強しています。すべての学習モジュール(科目)は選択的です。すべてを選ぶ必要があります。一部のモジュールは、特定のモジュールを選択した後でのみ選択できます。学生は、モジュールがリストを形成する学習プログラムを形成する必要があります。リストを構成するモジュールは、以前選択したモジュールによって異なります。可能なすべてのリストを整理するプログラムを作成します。データファイルはそのように配置されています(最初の行はモジュールの数です):モジュールコード、モジュール名、与えられたモジュールの数、依存するモジュールコード、一つの可能​​なリスト(モジュールコードとその名前のリスト)の

9 
IF01 Programming 0 
IF02 Maths 1 IF01 
IF03 Data structures 2 IF01 IF02 
IF04 Digital logic 0 
IF05 Mathematical logistics 1 IF04 
IF06 Operations optimization 1 IF05 
IF07 Algorithm analysis 2 IF03 IF06 
IF08 Programming theory 1 IF03 
IF09 Operating systems 2 IF07 IF08 

結果ファイルの例:

IF01 Programming 
IF04 Digital logic 
IF02 Maths 
IF03 Data structures 
IF08 Programming theory 
IF05 Mathematical logistics 
IF06 Operations optimization 
IF07 Algorithm analysis 
IF09 Operating systems 

少ない以上のモジュールが存在する場合があります。ファイルは例に過ぎません。プログラムは一般化されるべきです。それはまた、反復的な方法の使用があるべきだと言います。

助けてください。どのように条件を形成するか分からない。

+0

ある種の木は、このデータを表現するための最良の方法だろうように思えます。 – Abion47

+0

@ Abion47 - それは木ではなく、指された非周期的なグラフです。 – Enigmativity

+0

@Enigmativityああ、間違った用語。ツリーではなくグラフ。 – Abion47

答えて

0

これを行う方法は、次のとおりです(コメントが明白であることを希望しますが、そうでない場合は教えてください)。

原則として、モジュールは、それが依存する他のモジュールを含むオブジェクトとして定式化することです。

次に、可能なモジュールを見つけてそれらの順列を生成しようとします。

すべてのモジュールが「使用」されている場合は、解決策があります。

// Defines a module as having a name and a list of modules it depends on to be eligible 
class Module 
{ 
    public string Name { get; set; } 
    public List<Module> DependsOn { get; set; } 
} 

// Represents a solution as a list of modules 
class Solution 
{ 
    public List<Module> Modules { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Defines the modules 
     var if01 = new Module() { Name = "IF01" }; 
     var if02 = new Module() { Name = "IF02" }; 
     var if03 = new Module() { Name = "IF03" }; 
     var if04 = new Module() { Name = "IF04" }; 
     var if05 = new Module() { Name = "IF05" }; 
     var if06 = new Module() { Name = "IF06" }; 
     var if07 = new Module() { Name = "IF07" }; 
     var if08 = new Module() { Name = "IF08" }; 
     var if09 = new Module() { Name = "IF09" }; 

     // Defines on which other modules each module depends on 
     if01.DependsOn = new List<Module>(); 
     if02.DependsOn = new List<Module>() { if01 }; 
     if03.DependsOn = new List<Module>() { if01, if02 }; 
     if04.DependsOn = new List<Module>(); 
     if05.DependsOn = new List<Module>() { if04 }; 
     if06.DependsOn = new List<Module>() { if05 }; 
     if07.DependsOn = new List<Module>() { if03, if06 }; 
     if08.DependsOn = new List<Module>() { if03 }; 
     if09.DependsOn = new List<Module>() { if07, if08 }; 

     // The list of all modules 
     var allModules = new List<Module>() { if01, if02, if03, if04, if05, if06, if07, if08, if09 }; 
     // The list of choosen modules at this step 
     var choosenModules = new List<Module>(); 

     // Writes each found solution 
     foreach (var solution in Calculate(choosenModules, allModules)) 
     { 
      solution.Modules.ForEach(m => Console.Write(m.Name + "/")); 
      Console.WriteLine(); 
     } 
    } 

    // Determinates if a module is eligible considering already choosed modules 
    static bool IsEligible(Module module, List<Module> alreadyChoosed) 
    { 
     // All modules this module depends on needs to be present in the allready choosen modules 
     return module.DependsOn.All(m => alreadyChoosed.Contains(m)); 
    } 

    static IEnumerable<Solution> Calculate(List<Module> choosenModules, List<Module> remainingModules) 
    { 
     if (remainingModules.Count > 0) 
     // If some modules remain, we need to continue 
     { 
      // Takes the list of all eligible modules at this step 
      var allEligibleModules = remainingModules.FindAll(m => IsEligible(m, choosenModules)); 

      // We explore the solutions 
      foreach (var newlyChoosen in allEligibleModules) 
      { 
       // Considering this newly choosen module... 
       choosenModules.Add(newlyChoosen); 
       // ... which is so no more in the remaining modules 
       remainingModules.Remove(newlyChoosen); 

       // And try to find all solutions starting with this newly choosen module 
       foreach (var solution in Calculate(choosenModules, remainingModules)) 
        yield return solution; 

       // As we have tested this module we push it back as unchoosed, so that the next possible will take its place in the solution 
       choosenModules.Remove(newlyChoosen); 
       remainingModules.Add(newlyChoosen); 
      } 
     } 
     else 
     // If no more remaining modules, we have a solution 
      yield return new Solution() { Modules = new List<Module>(choosenModules) }; 
    } 
+0

これは具体的ではありません。データファイルは例として示されており、多かれ少なかれモジュールが存在する可能性があります。プログラムは一般化されるべきです。 – Tom

+0

@Tom、プログラムはファイルを使って行うことができる初期化ステップを除いて一般的です...しかし、質問は "ファイルを読む方法"ではありませんでしたか? – lemon

+0

私はファイルを読む方法を知っていますが、モジュールのリストを含む.txtファイルをアップロードするだけで、すべての可能な組み合わせのテキストファイルを提供するプログラムを書くことです。私はそのように最適化する方法を知らない。私はまた、再帰を使用する必要があります。 – Tom

0

これは、再帰を使用している間に順列を得る方法です。ここからどこへ行くのかわからないが、少なくともこれが役立つことを願っている。

class Program 
{ 
private static void Swap(ref char a, ref char b) 
{ 
    if (a == b) return; 

    a ^= b; 
    b ^= a; 
    a ^= b; 
} 

public static void GetPer(char[] list) 
{ 
    int x = list.Length - 1; 
    GetPer(list, 0, x); 
} 

private static void GetPer(char[] list, int k, int m) 
{ 
    if (k == m) 
    { 
     Console.Write(list); 
    } 
    else 
     for (int i = k; i <= m; i++) 
     { 
       Swap(ref list[k], ref list[i]); 
       GetPer(list, k + 1, m); 
       Swap(ref list[k], ref list[i]); 
     } 
} 

static void Main() 
{ 
    string str = "sagiv"; 
    char[] arr = str.ToCharArray(); 
    GetPer(arr); 
} 

}

関連する問題