У меня есть вектор, использующий Matlab, значения которого от 1 до 18, мне нужно выполнить перестановки этих значений, учитывая, что некоторые числа не могут идти вместе. Например:

vector = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]

В тех условиях, которые у меня есть, следующие числа не могут сочетаться:

1 and 7
1 and 8
1 and 17
1 and 18
2 and 6
2 and 7
2 and 8
2 and 17
2 and 18

Итак, допустимая перестановка может быть:

[1 2 4 3 5 6 7 8 9 10 11 12 13 14 15 17 16 18]

Неправильная перестановка могла быть:

[1 7 4 3 5 6 2 8 9 10 11 12 13 14 15 17 16 18] 1 and 7 together
[1 8 4 3 5 6 2 7 9 10 11 12 13 14 15 17 16 18] 1 and 8 together
[1 17 4 3 5 6 2 8 9 10 11 12 13 14 15 7 16 18] 1 and 17 together

Эти условия должны применяться в любой позиции вектора. У меня нет идей, как это сделать, если бы кто-нибудь мог дать мне идеи, я был бы очень признателен.

0
Carlos Oliver Hernndez Monteja 30 Мар 2021 в 01:40

1 ответ

Лучший ответ

Принимая во внимание предыдущий комментарий, мой код генерирует случайную перестановку вашего вектора и проверяет, что все эти комбинации не входят в перестановку. Если найдено какое-то условие, генерируется новая перестановка:

vector = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18];

not_valid = 1;
while not_valid == 1
    randpermutation = vector(randperm(18))

    not_valid = 0;
    for i = 1:length(randpermutation)-1
        if randpermutation(i) == 1 && randpermutation(i+1) == 7 || randpermutation(i) == 7 && randpermutation(i+1) == 1
            not_valid = 1;
        end
        if randpermutation(i) == 1 && randpermutation(i+1) == 8 || randpermutation(i) == 8 && randpermutation(i+1) == 1
            not_valid = 1;
        end
        if randpermutation(i) == 1 && randpermutation(i+1) == 17 || randpermutation(i) == 17 && randpermutation(i+1) == 1
            not_valid = 1;
        end
        if randpermutation(i) == 1 && randpermutation(i+1) == 18 || randpermutation(i) == 18 && randpermutation(i+1) == 1
            not_valid = 1;
        end
        if randpermutation(i) == 2 && randpermutation(i+1) == 7 || randpermutation(i) == 7 && randpermutation(i+1) == 2
            not_valid = 1;
        end
        if randpermutation(i) == 2 && randpermutation(i+1) == 8 || randpermutation(i) == 8 && randpermutation(i+1) == 2
            not_valid = 1;
        end
        if randpermutation(i) == 2 && randpermutation(i+1) == 17 || randpermutation(i) == 17 && randpermutation(i+1) == 2
            not_valid = 1;
        end
        if randpermutation(i) == 2 && randpermutation(i+1) == 18 || randpermutation(i) == 18 && randpermutation(i+1) == 2
            not_valid = 1;
        end
        if randpermutation(i) == 2 && randpermutation(i+1) == 6 || randpermutation(i) == 6 && randpermutation(i+1) == 2
            not_valid = 1;
        end
    end
end
0
PedroRodriguez 30 Мар 2021 в 11:09