Eu não sou um teórico da ciência da computação, mas acho que esse problema do mundo real pertence aqui.
O problema
Minha empresa possui várias unidades em todo o país.
Oferecemos aos funcionários a possibilidade de trabalhar em outra unidade. Mas há uma condição: o número total de trabalhadores em uma unidade não pode mudar.
Isso significa: permitiremos que um funcionário saia de sua unidade se alguém quiser seu lugar.
Dados de solicitação de exemplo (ficticious):
Name Origin Destination
Maria 1 -> 2
Marcos 2 -> 3
Jones 3 -> 4
Terry 4 -> 5
Joe 5 -> 6
Rodrigo 6 -> 1
Barbara 6 -> 1
Marylin 1 -> 4
Brown 4 -> 6
Benjamin 1 -> 3
Lucas 4 -> 1
O acima, plotado:
Veja como temos que escolher entre as opções vermelha, azul ou preta?
O problema real é um pouco mais complexo, porque temos 27 unidades e 751 solicitações. Por favor, dê uma olhada na visualização
O objetivo
Tendo coletado todos os pedidos, como satisfazer a maioria deles?
Aplicação da teoria (?)
Tendo o gráfico , que cada unidade seja um vértice V e uma solicitação seja uma aresta direcionada E , uma troca bem-sucedida assumirá a forma de um cyle direcionado.
Cada ciclo deve usar apenas uma vez ( um trabalhador não pode deixar sua unidade duas vezes ), mas pode visitar V várias vezes ( uma unidade pode ter muitos trabalhadores que desejam sair ).
A questão
Se este problema for expresso como
"Como encontrar os ciclos que, juntos, envolvem o maior número de arestas não compartilhadas em um gráfico direcionado"?
Satisfazeremos a maioria dos solicitantes?
Isso é verdade, existe um algoritmo para encontrar esse conjunto ideal de ciclos?
Essa abordagem greddy resolverá o problema?
- Encontre o maior ciclo direcionado em ;
- Remova as arestas de ;
- Repita 1 até que não haja um ciclo direcionado em ;
Pode me ajudar?
Você conhece outra maneira de descrever o problema original (agradar a maioria dos solicitantes)?
Editar : departamento alterado para unidade, para melhor descrever o problema.
Respostas:
OK, li o código do TradeMaximizer e acredito que ele resolve o seguinte problema mais geral.
Para resolver a pergunta feita aqui, faça com que os vértices sejam funcionários e desenhe um arco do custo unitário quando x desejar o trabalho de y . Observe que agora os funcionários são vértices e não arestas. O bom é que um funcionário pode dizer "Eu realmente quero o emprego de y , mas o de z também".x → y x y y z
Solução:
Crie um gráfico bipartido da seguinte forma: para cada vértice no gráfico original, introduza um vértice esquerdo x L , um vértice direito x R e um arco x L → x R cujo custo é enorme (maior que a soma dos custos no original) gráfico). Para cada arco x → y no gráfico original, introduza um arco x L → y R no gráfico bipartido.x xeu xR xeu→ xR x → y xeu→ yR
Encontre uma correspondência perfeita de custo mínimo no gráfico bipartido.
Também existe algum pré-processamento do gráfico original: remova os arcos entre os SCCs e processe todos os SCCs de tamanho conforme indicado acima.> 1
(Na verdade, o TradeMaximizer repete todas as soluções ideais, de acordo com os dois critérios acima, a fim de otimizar heuristicamente outras coisas, como a duração do maior ciclo. Grandes ciclos aumentam a chance de um "negócio" não passar porque um pessoa muda de idéia.)
PS: O autor, Chris Okasaki, confirmou que é isso que o código faz, na postagem do blog .
fonte
Como todos os custos e capacidades são limitados por constantes, um algoritmo simples de cancelamento de ciclo encontrará a circulação necessária em tempo polinomial. Isso é quase o mesmo que o algoritmo ganancioso óbvio:
Este não é o algoritmo mais rápido conhecido.
fonte
Essa abordagem gananciosa nem sempre oferece a melhor solução.
fonte
provavelmente existe uma maneira / formulação da teoria dos grafos para resolver isso, mas esse problema me parece mais um problema de permutação, onde algumas de todas as permutações são rejeitadas e outras são válidas. as permutações são funcionários e os cargos são "cargos" na empresa. uma permutação é rejeitada se não atender aos requisitos de "pessoa [x] quer posição [y]". a distinção dos limites de unidades / depts / org é aparentemente um tanto supérflua para a solução nesse caso.
esse tipo de problema de permutação com restrições pode ser facilmente convertido em uma instância do problema SAT (satisfação). as atribuições de variáveis booleanas representam funcionários e as cláusulas de restrição representam as restrições "pessoa [x] deseja posição [y]". existem exemplos clássicos próximos disso, geralmente chamado de "mesa de jantar", onde você tem lugares sentados e convidados e nem todos querem sentar um ao lado do outro (ou muito similarmente, alguns convidados querem sentar ao lado de outros convidados).
e, é claro, existem sofisticados solucionadores SAT para instâncias razoavelmente grandes, envolvendo aproximadamente centenas de variáveis e cláusulas no PC e, se o problema não for "difícil", aos milhares.
veja, por exemplo, [1] para uma referência profissional e [2] para um exercício de classe. há também alguma semelhança estrutural com o que é conhecido como "problemas nos buracos dos pombos", que é bem estudado nos círculos do SAT, onde os pombos são designados aos buracos dos pombos e você tem mais ou menos buracos que os pombos. nesse caso, no entanto, os pombos são geralmente vistos como intercambiáveis. em outras palavras, o problema da mesa de jantar é como o problema do pombo com restrições mais fortes e os convidados / pombos exigiram preferências.
observe, é claro / tenha em mente que, para esses tipos de problemas, dependendo das restrições, a resposta pode ser "não existe uma solução restrita".
[1] o algoritmo da mesa de jantar, por crato
[2] CS402 Princeton HW SAT
[3] Problema de satisfação, wikipedia
fonte