2012-09-14 3 views
2

작업 스케줄링 애플리케이션의 경우 w 주 (= 7w 일) 동안 가능한 많은 직원 일정을 생성해야합니다. 직원 일정은 계획 기간의 각 날에 대한 근무 시간 (일찍, 늦은 밤, 낮으로) 목록으로 구성됩니다. 응용 프로그램은 Java로 프로그래밍됩니다. 나는 또한 약간의 변화 특성을 가지고Java : 많은 양의 데이터 배열 표현

public enum Shift 
{ 
    DAY, LATE, NIGHT, FREE; 
} 

:

public class Schedule 
{ 
    /** List with for every day of planning period the assigned shift */ 
    private Shift[] shiftlist = new Shift[Settings.schedule_days]; 

    /** Cost of schedule (for measuring its quality) */ 
    private double cost; 

    // A list of variables, representing schedule properties 
    // which are referenced often. 
    // E.g.: number of workweekends, number of night shifts 

    // Also some methods for updating/retrieving information 
} 

시프트로 정의 할당 된 변화를 나타내는 열거이며, 다음과 같이이 때

, 나는 직원의 일정을 나타냅니다 열거 형 선언 및 속성을 비교하는 메서드를 사용하지만 여기서는 관련이 없다고 생각합니다.

모든 직원은 자신의 가능한 일정 목록이 있습니다 :

public class Employee 
{ 
    /** Large set of possible schedules for planning period */ 
    public LinkedList<Schedule> generated_schedules; 

    // Variables representing properties of employee 
} 

내 문제는 내가 실제로 50 명의 직원을 가지고 있고 나는 100.000 생성하고자하는 것입니다 - 직원 당 1.000.000 가능한 일정을.

일정은 실제로 신속하게 생성되며 내 컴퓨터에서 8GB의 메모리를 사용할 수 있으므로 일정을 많이 저장할 수 있습니다. 그러나 30 ~ 40 명의 직원을위한 생성이 완료되면 내 기억이 꽉 찼습니다.

누군가 내게 준 제안은 일련의 열거 형 대신 할당 된 쉬프트를 나타내는 문자 배열을 사용하는 것입니다. 이렇게하면 공간을 덜 차지하게됩니다. 또한 그는 Schedule 개체 목록 대신 char 배열 목록을 사용하는 것이 더 좋습니다. 그러나 일정 근처의 일정 특성 (예 : 비용)을 저장할 수 없으며 자주 재 계산해야합니다. 나는 이것이 심각한 단점이 될 것이라고 생각한다.

이 관찰은 실제로 의미가 있습니까? 아니면 적은 공간을 사용하기 위해이 많은 양의 데이터를 표현하는 더 좋은 방법이 있다고 생각합니까?

+1

생성 된 모든 일정을 동시에 메모리에 보관해야합니까? 그들과 너 뭐하고 있니? 그것들을 하나씩 생성하고 처리 할 수 ​​없습니까 (이전의 것을 잊어 버렸습니까?)? – Thilo

+0

이 [숙제]입니까? –

+0

일정은 개인 취향에 따라 개별 직원에 대해 생성됩니다. 열 생성을 사용하여 선형 프로그램에 반복적으로 스케줄을 선택합니다. LP는 인력 수요가 가득 채워지도록 모든 직원의 명단을 선택하려고합니다. 그러므로 나는 모든 일정을 기억해야합니다. – user1671257

답변

0

동시에 모든 일정을 동시에 메모리에 저장해야하는 경우 가장 공간 효율적인 인코딩은 하루 2 비트의 비트 집합을 사용하는 것입니다.

public class BitSetShiftList { 
    private BitSet bitset; 

    public void BitSetShiftList(int size) { 
    bitset = new BitSet(size * 2); 
    } 

    public void setShift(int day, Shift shift) { 
    int ordinal = shift.ordinal(); 
    assert ordinal >= 0 && ordinal <= 3; 

    bitset.set(day * 2, (ordinal & 0x1) != 0); 
    bitset.set(day * 2 + 1, (ordinal & 0x2) != 0); 
    } 

    public Shift getShift(int day) { 
    int ordinal = (bitset.get(day * 2) ? 0x1 : 0x0) | 
     (bitset.get(day * 2 + 1) ? 0x2 : 0x0); 
    return Shift.values()[ordinal]; 
    } 

} 
+0

효율적인 아이디어처럼 보입니다! 이것은 char가 사용하는 16 비트 대신 2 비트만을 사용합니다. 대단히 감사합니다.이 접근 방식을 조사하겠습니다. :-) – user1671257

0

메모리를 줄이려면 현재 대부분의 메모리를 사용하고있는 데이터 유형과 해당 데이터 유형을 가정 할 수있는 가정을 결정해야합니다. 이 정보가 없으면 추측 할 수 있습니다.


일반적인 알고리즘 기반 접근 방식을 사용하는 것이 좋습니다.

예 :

  • 1000 개의 일정을 생성하고 평가할 수 있습니다.

    최고 500
  • , 당신은

  • 는 어떤 임의의 돌연변이 다음 1000을 생성하기 위해 함께 혼합이를 사용하여 유지.

최고 점수가 향상되지 않을 때까지 반복됩니다.

요점은; 다른 방법을 사용하여 적은 시간에 훨씬 적은 스케줄을 생성 할 수 있지만 여전히 최적의 솔루션으로 수렴됩니다.유사 "작은"프로젝트에

+0

감사합니다. 그러나 이런 종류의 스케줄링 접근법은 자주 연구되었습니다. 나는 현재 더 많은 일정이 필요한 또 다른 접근법을 연구 중이다. 저는 여러 가지 방법으로 일정 수를 줄일 수 있다는 것을 압니다. 그러나 제 접근 방법에 대해서는 더 많은 것을 기억하고 싶습니다. 일정을 생성하는 방법은 제 질문의 범위를 벗어납니다. 내가 알고 싶은 건 char 배열을 사용하고 Schedule 객체가 적을수록 더 나은 성능을 제공하는 것이다. – user1671257

+0

대답은 가능하지만 메모리 프로파일 러를 사용하기 전까지는 말하기가 불가능합니다. –

+0

자, 도와 줘서 고마워! – user1671257

0

한 경험 :

파일 시스템에 또한 포함 된 데이터베이스 저장을 사용하여는 것이 좋습니다. SQL은 추악하지만, 손으로 코딩 한 콜렉션 워크보다 더 나은 쿼리를 허용합니다. 유지 보수가 더 쉽습니다.

그렇기 때문에 메모리 소비 문제는 확실하지 않습니다.

예를 들어 ORM과 함께 eclipseLink와 같은 JPA를 사용할 수 있습니다.

관련 문제