Логический вопрос - PullRequest
       8

Логический вопрос

0 голосов
/ 03 февраля 2011

Рассмотрим матрицу [4x8] «A» и матрицу [1x8] «B».Мне нужно проверить, существует ли значение «X», такое, что

[A]^T * [X] = [B]^T  exists for any x >= 0 { X is a [4X1] matrix,  T = transpose }

Теперь вот уловка / утомительная часть.Матрица A всегда имеет 1 в качестве диагонали.A11,A22,A33,A44 = 1 Эту матрицу можно рассматривать как две половины, причем первая половина - это первые 4 столбца, а вторая половина - вторые 4 столбца, как показано ниже:

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

Каждая строка в первой половине может иметьдва или три -1, и если у него есть два -1, то соответствующая строка во второй половине должна иметь одну «1», или, если в какой-либо строке есть три -1, во второй половине матрицы должно быть два «1».Общая цель состоит в том, чтобы сумма каждой строки была равна 0.

Теперь B - это матрица [1x8], которую также можно рассматривать как две половины следующим образом:

B = -1 -1 0 0   0 0 1 1

Здесьв первой половине может быть один, два, три или четыре -1, а во второй половине должно быть одинаковое количество единиц.Это должно быть сделано в комбинациях. Например, если в первой половине есть два -1, они могут быть размещены в 4, выберите 2 = 6 способов, и для каждого из них будет 6 способов разместить 1 во второй половине, которыев общей сложности 6 * 6 = 36 способов.то есть 36 различных значений для B, если в первой половине есть два -1.Размещение 1 в матрице А также должно быть таким же.Я мог бы подумать о том, чтобы сделать это, рассмотрев valarray или что-то в этом роде и составить матрицы A и B, но я не знаю, что делать.

Теперь для каждого A я должен проверить его с каждой комбинацией B, чтобы увидеть, существует ли

[A]^T * [X] = [B]^T 

Я пытаюсь доказать, что результат, который мне нужен, мне нужензнать, существует ли такой X или нет.Я очень запутался в реализации этого.Любые предложения приветствуются.Это подпадает под понятие линейного программирования в математике.Я хочу это либо в C ++, либо в Matlab.Любые другие языки также приемлемы, но я знаком только с этими двумя.Заранее спасибо.

Обновление:

Вот мой ответ на эту проблему:

clear;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%# Generating all possible values of vector B

%# permutations using dec2bin (start from 17 since it's the first solution)
vectorB = str2double(num2cell(dec2bin(17:255)));

%# changing the sign in the first half, then check that the total is zero
vectorB(:,1:4) = - vectorB(:,1:4);
vectorB = vectorB(sum(vectorB,2)==0,:);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%# generate all possible variation of first/second halves
z = -[0 1 1; 1 0 1; 1 1 0; 1 1 1]; n = -sum(z,2);
h1 = {
    [         ones(4,1) z(:,1:3)] ;
    [z(:,1:1) ones(4,1) z(:,2:3)] ;
    [z(:,1:2) ones(4,1) z(:,3:3)] ;
    [z(:,1:3) ones(4,1)         ] ;
};
h2 = arrayfun(@(i) unique(perms([zeros(1,4-i) ones(1,i)]),'rows'), (1:2)', ...
    'UniformOutput',false);

%'# generate all possible variations of complete rows
rows = cell(4,1);
for r=1:4
    rows{r} = cell2mat( arrayfun( ...
        @(i) [ repmat(h1{r}(i,:),size(h2{n(i)-1},1),1) h2{n(i)-1} ], ...
        (1:size(h1{r},1))', 'UniformOutput',false) );
end

%'# generate all possible matrices (pick one row from each to form the matrix)
sz = cellfun(@(M)1:size(M,1), rows, 'UniformOutput',false);
[X1 X2 X3 X4] = ndgrid(sz{:});
matrices = cat(3, ...
    rows{1}(X1(:),:), ...
    rows{2}(X2(:),:), ...
    rows{3}(X3(:),:), ...
    rows{4}(X4(:),:) );
matrices = permute(matrices, [3 2 1]);              %# 4-by-8-by-104976
A = matrices;
clear matrices X1 X2 X3 X4 rows h1 h2 sz z n r
options = optimset('LargeScale','off','Display','off');
for i = 1:size(A,3),
    for j = 1:size(vectorB,1),
        X = linprog([],[],[],A(:,:,i)',vectorB(j,:)');
        if(size(X,1)>0)  %# To check that it's not an empty matrix
            if((size(find(X < 0),1)== 0)) %# to check the condition X>=0
                if (A(:,:,i)'* X == (vectorB(j,:)'))                
                    X
                end
            end
        end
    end
end

Я получил его с помощью пользователей stackoverflow,Единственная проблема заключается в том, что функция linprog генерирует множество исключений в каждой итерации вместе с полученными ответами.Исключение составляет:

(1)Exiting due to infeasibility: an all-zero row in the constraint matrix does not have a zero in corresponding right-hand-side entry. 
(2) Exiting: One or more of the residuals, duality gap, or total relative error has stalled: the primal appears to be infeasible (and the dual unbounded).(The dual residual < TolFun=1.00e-008.

Что это значит.Как я могу преодолеть это?

1 Ответ

0 голосов
/ 03 февраля 2011

Из вашего вопроса не ясно, знакомы ли вы с системными линейными уравнениями и их решением , или это то, что вы пытаетесь «изобрести». См. Также здесь для объяснения, относящегося к Matlab.

Если вы знакомы с этим, в вашем вопросе должно быть больше ясности относительно того, что отличает вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...