2014-12-12 4 views
2

Мне нужно построить матрицу ограничений технологического цикла Aa и правую сторону ba. Целью является создание матриц технологического цикла для решения линейной задачи планирования, ограниченной Ax < = b. В этом случае -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 

Выхода, как это Aa 3 «» «диагональ» «» -1/+1 матрицы:

-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 

для того, чтобы быть более точным в дальнейшем есть изображение: image, показывающий другую часть 3 матрицы Aa. Мой вопрос:: Есть ли способ построить то же самое, что избегает циклов, так как 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

Смежные вопросы