Генерация всех возможных комбинаций клиентов и счетов - PullRequest
2 голосов
/ 06 октября 2019

Я занимаюсь разработкой приложения для хранения данных о взаимоотношениях клиентов и счетов (в банковской сфере). Как правило, в банках клиент может иметь учетную запись, которая является единственной учетной записью, или иметь совместную учетную запись с другим клиентом.

Например, 1: у клиента C1 есть единственная учетная запись A1. Например, у клиентов C1 и C2 есть совместный счет JA1, где C1 является основным держателем, а C2 - неосновным.

Я ищу алгоритм, который сгенерирует все возможные комбинации отношений для данного числаклиенты и счета.

Например: если число клиентов = 2 и количество счетов = 2, алгоритм должен сгенерировать следующие записи.

Комбинация № 1: C1-A1-первичный C1-A2-первичный C2-A1-первичный C2-A2-непервичный

комбинация № 2: C1-A1-первичный C1-A2-Не первичный С2-А1-Неосновный С2-А2-Первичный

Комбинация № 3: С1-А1-Неосновный С1-А2-Первичный С2-А1-Первичный С2-A2-неосновная

комбинация № 4: C1-A1-неосновная C1-A2-неосновная C2-A1-первичная C2-A2-первичная

комбинация № 5: C1-A1-подошва C1-A2-первичная C2-A2-неосновная

комбинация № 6: C1-A1-подошваC1-A2-Non-Primary C2-A2-Primary

Combiнация № 7: С1-А2-подошва С1-А1-первичная С2-А1-первичная

комбинация № 8: С1-А2-подошва С1-А1-нон-Primary C2-A1-Primary

Редактировать: Это не полный список комбинаций - но алгоритм должен генерировать все эти.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

У вас есть 2 проблемы для решения здесь:

1) Получите все возможные типы счетов для N клиентов. Вы можете сделать это следующим образом:

const allAccounts = [];
for (let i = 1; i <= customersNumber; i++) {
  allAccounts.push(`C${i}-Sole`);
  for (let j = 1; j <= customersNumber; j++) {
    if (i === j) continue;
    allAccounts.push(`C${i}-Primary C${j}-NonPrimary`);
  }
}

Для 2 клиентов результат будет:

[
  "C1-Sole",
  "C1-Primary C2-NonPrimary",
  "C2-Sole",
  "C2-Primary C1-NonPrimary"
]

2) Получить все возможные комбинации длины r (с повторениями) из этого массива. Здесь мы хотим исключить два типа комбинаций:

  • , которые имеют 2 или более индивидуальных аккаунта для одного и того же клиента.
  • те, кто не подключен (не имеют общих клиентов, если я вас правильно понял)

// checks if two accounts are connected
function connected(customers1, customers2) {
    return customers1.filter(cu => customers2.includes(cu)).length > 0;
}

// checks if acc1 and acc2 are the same Sole account 
function sameSoleAccount(acc1, acc2) {
    return acc1.type === 'Sole' && acc1 === acc2;
}

function printAccount(i, a) {
    const c = a.customers;
    return a.type === 'Sole' ? `${c[0]}-A${i}-Sole` : `${c[0]}-A${i}-Primary ${c[1]}-A${i}-NonPrimary`;
}

function combination(chosen, arr, index, r) {
    if (index === r) {
        const combination = chosen.map((c, i) => printAccount(i + 1, arr[c])).join(', ');
        console.log(combination);
        return;
    }
    for (let i = 0; i < arr.length; i++) {
        if (chosen.length === 0 ||
            chosen.some(ch => !sameSoleAccount(arr[ch], arr[i])
                && connected(arr[ch].customers, arr[i].customers))) {
            const copy = chosen.slice();
            copy[index] = i;
            combination(copy, arr, index + 1, r);
        }
    }
}

function allPossibleCombinations(accountsNumber, customersNumber) {
    const allAccounts = [];
    for (let i = 1; i <= customersNumber; i++) {
        allAccounts.push({customers: [`C${i}`], type: 'Sole'});
        for (let j = 1; j <= customersNumber; j++) {
            if (i === j) continue;
            allAccounts.push({customers: [`C${i}`, `C${j}`], type: 'Joint'});
        }
    }
    console.log(`All possible combinations for ${customersNumber} customers and ${accountsNumber} accounts: `);
    combination([], allAccounts, 0, accountsNumber, 0, allAccounts.length - 1);
}

allPossibleCombinations(2, 2);
0 голосов
/ 06 октября 2019

Если у вас ограниченные отношения между учетными записями и клиентами:

1) создайте dict с помощью:

dMapCustomer = {<nCustomerId>: [<nAccountId1>, <nAccountId2>]}

2) для каждого клиента создайте все возможные пары, это просто

lCustomerPairs = [(nCustomerId, nAccountId1), (nCustomerId, nAccountId2), ...]

3) объединить все пары из шага 2.

l = []
for nCustomer in lCustomer:
    l += lCustomerPairs

Если любая учетная запись может быть связана с любым клиентом, то просто:

lAccounts = [1,2,3]
lCustomers = [4,5,6]
list(product(lCustomers, lCustomers)) # all possible pairs of account and customer

Функциональный продукт создает всеВозможные пары из двух списков:

def product(l1, l2): 
    pools = [tuple(pool) for pool in [l1, l2]] 
    result = [[]] 
    for pool in pools: 
        result = [x+[y] for x in result for y in pool] 
    for prod in result: 
        yield tuple(prod)
...