2014-12-12 4 views
2

테크 사이클 제약 조건 매트릭스 Aa와 오른쪽 사이드 바를 구성해야합니다. 목표는 Ax < = b로 제한된 스케줄링 선형 문제를 해결하기 위해 기술주기 행렬을 구축하는 것입니다. Aa 3 "은" ""-1 "대각선"처럼,이 경우에는 -1과 +1은/이러한 시작 시간과 같은 문제의 제약 조건의 계수를 참조하여"" "대각선" ""-1/+ 1 매트릭스

TC = [1,2,3,4,6,7;1,2,5,4,6,7;2,5,6,7,0,0];        % Technology cycle 
CT = [100,60,200,160,80,120;100,60,150,120,60,150;50,120,40,30,0,0];  % Cycle time 

n_jb = size(TC,1);      % number of jobs 
n_op = sum(TC~=0,2);     % number of operations for each job 
N_op = sum(n_op);      % total number of operations 


c=1;         % indice for constraints in Aa 
Op=1;         % counter for overall operation 
n_tf = N_op - n_jb- sum(n_op==1);  % number of job transfer between machines (also number of tech cycle constraint numbers) 
Aa = zeros(n_tf,N_op);    % Constraint matrx for tech cycle 
ba = zeros(n_tf,1);     % The right vector of the constraint function: Aa*x<=ba 

for j=1:n_jb 

    if n_op(j)>1 

     for op=1:n_op(j)-1 
      Aa(c,Op)=-1; 
      Aa(c,Op+1)=1; 
      ba(c,1)=CT(j,op); 
      c=c+1;    
      Op=Op+1; 
     end 

    else 
     Op=Op+1; 
    end 
    Op=Op+1; 
end 

출력을 된 우위 +1 매트릭스 : 매트릭스 Aa의 3 개의 부품을 도시 image :

-1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 

위하여는 이미지가 다음의 더 정확하게한다. 제 질문은입니다 : A가 3x1이 아니지만 확실히 30-50x1이 될 것이므로 이와 같은 회피 루프를 만드는 방법이 있습니까?

+0

메모리 효율을 높이려면 A를 MATLAB * 스파 스 * 매트릭스로 정의해야합니다. ['spdiags'] (http://uk.mathworks.com/help/matlab/ref/spdiags.html)가 도움이 될 것입니다. – Jubobs

답변

3

diag을 사용하여 양수와 음수를 생성 할 수 있습니다. diag의 두 번째 입력은 대각선을 측면으로 이동시키는 것입니다. 이 경우 오른쪽에서 1입니다. 제거 할 행을 찾을 수

사용 cumsum. n = [6, 6, 4]의 경우 6, 12 및 16 번째 행을 제거하려고합니다.

n = [6, 6, 4]; 
cols = sum(n); 
A = -eye(cols) + diag(ones(cols-1,1), 1); 
A(cumsum(n),:) = [] 

A =  
    -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 
+1

줄을 죽이는 것은 좋은 생각입니다! – Jonas

+1

왜'spdiags'를 사용하지 않으시겠습니까? – Jubobs

+1

@Jubobs : 나는 똑같은 생각을하고있었습니다. 아마 가장 효율적인 대형 시스템을 위해서. 'blkdiag' 또한 유용 할 수 있습니다. – horchler