2016-08-17 46 views
0

我想製作一個每個學期的課程,根據我輸入的課程列表創建一個課程表,所以如果我添加各種課程,取決於這些課程將要發生的時間和日期,那麼課程將能夠匹配可以添加什麼類而不會相互攔截。我想知道是否有算法或比較課程安排的方法,以便確定課程列表中的哪些課程。根據某些事件的時間組織計劃的算法?

做這些的唯一方法,我可以想象的是許多if語句或添加一個開始課程,然後有一個數組跟蹤小時,每個位置開始0,然後每次佔用一個小時我改變數組的位置爲1.然後,當添加課程時,我檢查哪些位置與1不同,並嘗試添加該類。

我想找到比我能想象的更優化的解決方案。

回答

1

這是一個計劃問題。規劃問題很難以有效的方式解決:在這類問題中,性能問題很快就會出現。

如果你只是想解決這個問題,你應該檢查現有的規劃問題解決者喜歡OptaPlanner:它是開源的,所以你可以嘗試去了解它是如何工作的,並有一個blog與interresting有關規劃問題的想法。

1

如果您想要一種方法,給定一組具有時間和選定類的類,輸出可用的類,則可以使用簡單的迭代來完成這項工作。假設你有5小時的插槽與4個班,你可以代表一個單一陣列中的每個類:如果你選擇類佔用的最後2小時,然後

int[][] times = { 
      {0,1,1,0,0}, 
      {1,1,0,0,0}, 
      {0,1,0,0,0}, 
      {0,0,0,1,1} 
    }; 

那麼剩下的選項是:

{0,1,1,0,0}, 
{1,1,0,0,0}, 
{0,1,0,0,0} 

鑑於這種表現,你可以這樣做:

import java.util.*; 

public class C { 

    static int[][] available(int[] c,int[][] times){ 
     ArrayList<Integer> index = new ArrayList<>(); 
     ArrayList<Integer> result = new ArrayList<>(); 
     for(int i=0;i<c.length;i++) 
      if(c[i]==1) index.add(i); 

     for(int i = 0; i < times.length; i++){ 
      if(!times[i].equals(c)) { 
       for (int j = 0; j < times[0].length; j++) { 
        if(times[i][j]==1){ 
         if(index.contains(j)) break; 
        } 
        if(j==times[0].length-1) result.add(i); 
       } 
      } 
     } 
     int[][] r = new int[result.size()][c.length]; 
     for(int i=0;i<result.size();i++){ 
      r[i] = times[result.get(i)]; 
     } 
     return r; 
    } 

    public static void main(String[] args) { 



     int[][] times = { 
       {0,1,1,0,0}, 
       {1,1,0,0,0}, 
       {0,1,0,0,0}, 
       {0,0,0,1,1} 
     }; 
     int[] c = {0,0,0,1,1}; 
     available(c,times); 

     System.out.println(Arrays.deepToString(available(c,times))); 


    } 

}