Há um projeto paralelo no qual estou trabalhando, onde preciso estruturar uma solução para o seguinte problema.
Eu tenho dois grupos de pessoas (clientes). O grupo A
pretende comprar e o grupo B
pretende vender um determinado produto X
. O produto tem uma série de atributos x_i
, e meu objetivo é facilitar a transação entre A
e B
combinando suas preferências. A idéia principal é apontar para cada membro de A
um correspondente B
cujo produto se adapte melhor às suas necessidades e vice-versa.
Alguns aspectos complicadores do problema:
A lista de atributos não é finita. O comprador pode estar interessado em uma característica muito particular ou algum tipo de design, o que é raro entre a população e não posso prever. Não é possível listar todos os atributos anteriormente;
Os atributos podem ser contínuos, binários ou não quantificáveis (ex: preço, funcionalidade, design);
Alguma sugestão de como abordar esse problema e resolvê-lo de forma automatizada?
Também agradeceria algumas referências a outros problemas semelhantes, se possível.
Ótimas sugestões! Muitas semelhanças com a maneira como estou pensando em abordar o problema.
A principal questão no mapeamento dos atributos é que o nível de detalhe ao qual o produto deve ser descrito depende de cada comprador. Vamos dar um exemplo de um carro. O produto "carro" possui muitos atributos que variam de desempenho, estrutura mecânica, preço etc.
Suponha que eu só queira um carro barato ou um carro elétrico. Ok, é fácil mapear, porque eles representam os principais recursos deste produto. Mas digamos, por exemplo, que eu quero um carro com transmissão de dupla embreagem ou faróis de xenônio. Bem, pode haver muitos carros na base de dados com esses atributos, mas eu não pediria ao vendedor que preenchesse esse nível de detalhe do produto antes da informação de que há alguém procurando por eles. Tal procedimento exigiria que todo vendedor preencha um formulário complexo e muito detalhado, apenas tente vender seu carro na plataforma. Só não funcionaria.
Ainda assim, meu desafio é tentar ser o mais detalhado possível na busca para fazer uma boa correspondência. Então, a minha maneira de pensar é mapear os principais aspectos do produto, aqueles que provavelmente são relevantes para todos, para diminuir o grupo de possíveis vendedores.
O próximo passo seria uma "pesquisa refinada". Para evitar a criação de um formulário muito detalhado, eu poderia pedir aos compradores e vendedores que escrevessem um texto livre de suas especificações. E, em seguida, use algum algoritmo de correspondência de palavras para encontrar possíveis correspondências. Embora eu entenda que essa não é uma solução adequada para o problema, porque o vendedor não pode "adivinhar" o que o comprador precisa. Mas pode me aproximar.
Os critérios de ponderação sugeridos são ótimos. Permite-me quantificar o nível em que o vendedor corresponde às necessidades do comprador. A parte de dimensionamento pode ser um problema, porque a importância de cada atributo varia de cliente para cliente. Estou pensando em usar algum tipo de reconhecimento de padrão ou apenas pedir ao comprador para inserir o nível de importância de cada atributo.
Como sugerido, enlouquecendo . Antes de tudo, corrija-me se estiver errado:
Nesse caso, a construção de uma tabela completa de recursos do produto pode ser cara em termos de computação. E a tabela final de dados seria extremamente esparsa.
O primeiro passo é restringir a lista de clientes (produtos) para correspondência. Vamos criar um gráfico bipartido, em que os vendedores sejam nós do tipo 1 e os compradores sejam nós do tipo 2. Crie uma vantagem entre qualquer vendedor e comprador toda vez que ele fizer referência a um recurso de produto semelhante, como no esboço a seguir:
Usando o gráfico acima, para cada produto de vendedor exclusivo, você pode selecionar apenas compradores interessados em recursos que correspondam ao produto (é possível filtrar pelo menos um recurso comum, corresponder ao conjunto completo de recursos ou definir um nível limite). Mas, certamente, isso não é suficiente. O próximo passo é comparar os valores dos recursos, conforme descrito pelo vendedor e comprador. Existem muitas variantes (por exemplo, k-vizinhos mais próximos). Mas por que não tentar resolver esta questão usando o gráfico existente? Vamos adicionar pesos às arestas:
para recursos contínuos (por exemplo, preço):
para recursos binários e não quantificáveis - apenas bicondicional lógico:
A idéia principal aqui é dimensionar todos os recursos para o intervalo
[0, 1]
. Além disso, podemos usar os coeficientes de recurso para determinar os recursos mais importantes. Por exemplo, supondo que o preço seja duas vezes mais importante que a disponibilidade de alguma função rara:Uma das etapas finais é simplificar a estrutura do gráfico e reduzir muitas arestas para uma aresta com peso igual à soma dos pesos calculados anteriormente de cada recurso. Com uma estrutura tão reduzida, cada par de clientes / produtos poderia ter apenas uma aresta (sem arestas paralelas). Portanto, para encontrar a melhor oferta para o vendedor exato, basta selecionar compradores conectados com arestas ponderadas máximas.
Desafio futuro: introduza um método barato para ponderar arestas na primeira etapa :)
fonte