Esta é a minha primeira experiência com um desafio de complexidade assintótica, embora eu esteja feliz com respostas inteiramente em código, desde que elas apresentem uma explicação de sua complexidade de tempo.
Eu tenho o seguinte problema.
Considere as tarefas T_1, ... T_n e procs M_1, ..., M_m. Cada tarefa leva um certo tempo para ser executada, dependendo dos procs.
Cada tarefa também custa uma certa quantia para executar, dependendo dos procs.
As tarefas precisam ser executadas em ordem estrita (elas não podem ser realizadas em paralelo) e leva tempo para alterar o processo. Uma tarefa não pode ser movida de um processo para outro após ter sido iniciada.
Finalmente, cada tarefa deve ser concluída em um determinado período de tempo.
a tarefa
O objetivo é fornecer um algoritmo (ou algum código) que, com cinco tabelas do formulário acima, minimize o custo total para concluir todas as tarefas e garanta que todas as tarefas sejam concluídas dentro dos prazos. Se isso não for possível, apenas informamos que isso não pode ser feito.
Ponto
Você deve fornecer a grande complexidade Oh da sua solução em termos das variáveis n, me onde d é o último prazo. Não deve haver constantes desnecessárias em sua grande complexidade Oh. Portanto, O (n / 1000) deve ser escrito como O (n), por exemplo.
Sua pontuação é calculada simplesmente definindo n = 100, m = 100 ed = 1000 em sua complexidade declarada. Você quer a menor pontuação possível.
desempate
Em caso de empate, a primeira resposta vence.
notas adicionadas
log
no tempo, a complexidade de uma resposta será tomada como base 2.
placar
- 10 ^ 202 de KSFT ( Python ) Primeiro enviado, então recebe a recompensa.
- 10 ^ 202 de Dominik Müller ( Scala )
O(m ^ n)
. Nenhum algoritmo será "mais rápido" do que isso. A poda com base em um tempo ou custo máximo necessário não altera a complexidade do algoritmo, nem possui um custo em dólar e um tempo, portanto,d
não é um elemento da complexidade.Respostas:
Pontuação: 10 ^ 202
Eu meio que gostaria que tivéssemos suporte para LaTeX agora ...
Como ninguém mais respondeu, pensei em tentar, mesmo que não seja muito eficiente. Não tenho certeza de qual é o grande O disso.
Eu acho que funciona. Pelo menos, é o único caso de teste publicado.
Ele recebe entradas como na pergunta, exceto sem os rótulos de número de máquina ou tarefa e com ponto e vírgula em vez de quebras de linha.
fonte
Verificar todos - Scala
Pontuação estimada: 2m ^ n
Começo em cada máquina e repito todas as tarefas para criar todas as permutações através das tarefas com diferentes máquinas que cumprem os prazos. Ou seja, se tudo estiver dentro do prazo, eu obteria 9 caminhos possíveis com 2 máquinas e 3 tarefas. (m ^ n) Depois, segui o caminho com o menor custo.
A entrada está estruturada desta forma (-> explica as partes e, portanto, não deve ser inserida):
E aqui está o código:
Eu também tive uma idéia para começar por trás. Como você sempre pode escolher uma máquina com o menor custo, se o tempo for menor do que a diferença do prazo anterior para o novo. Mas isso não diminuiria o tempo de execução máximo se a tarefa com o melhor custo demorar mais do que o prazo final.
Atualizar
======
Aqui está outra configuração. Tempo:
custo:
mudar o tempo:
custo do switch:
prazos:
Como entrada no meu programa:
Este possui duas soluções: tempo: 18, custo: 15, caminho: Lista (M_1, M_1, M_1, M_2) tempo: 18, custo: 15, caminho: Lista (M_2, M_1, M_1, M_1)
O que levanta a questão de como isso deve ser tratado. Todos devem ser impressos ou apenas um? E se o tempo fosse diferente? Um com o menor custo e sem prazo perdido é suficiente ou também deve ser o de menor tempo?
fonte
O(m^n)
tempo. A repetição de cada máquina para todas as tarefas levaO(n*m^n)
tempo.O(n*m^n)
iteração sobre cada tarefa para cada um dos caminhos? E iterando sobre cada máquina para cada tarefa, algo comoO(n*m)
.O(n*m^n)
".O(m*m^n)=O(m^n+1)
. Ainda é a mesma pontuação, no entanto.