Closed anibalsolon closed 9 years ago
hehehe sempre surgem táticas de sacanear o oponente, temos que fazer isso e se preparar para isso. mas temos como mandar percepções falsas, isso não teria que vir do servidor? ou um time pode criar jobs? Se sim, apesar de eu pessoalmente ser contra táticas de sacanagem, vocês devem fazer sim, se o objetivo é ganhar. so tem que lembrar que em algum momento vao descobrir isso, tem que cuidar se eles tiverem algum poder de represálha.
On 18/09/2015 15:44, Anibal Sólon wrote:
Nos auction jobs, nós podemos dar bid mesmo se nós postamos, mas não podemos fazer delivery do job, então nós pagariamos a multa. Entretanto, como vocês podem ver no print abaixo, nós pagariamos e receberiamos a multa (ou seja, variação = zero). Já quando um time faz delivery dum job nosso, nós temos que pagar ele.
Give us da money! https://cloud.githubusercontent.com/assets/562525/9967105/ed004698-5e16-11e5-872a-fd03c6ad9e67.png
Nós ganhamos o que foi produzido, para qualquer tipo de trabalho. Fica armazenado no storage do job para pegarmos.
Dito isso, acho que podemos criar uns auction jobs para confundir eles, com id "job[0-9]+". Ficarão pensando no que fazer, em qual bid dar, e nós (sabendo que é nosso) jogaremos um valor minimo (1, acho) para sempre ganhar o job.
Ou ainda, podemos analisar quais materiais os jobs estão pedindo, estimar o custo de fazer o job, e fazer um job que valha a pena para nós pagar um reward, em troca dos materiais para outros jobs.
Viajando, mas pela direção para onde os agentes estão se movimentando, dá para estimar qual job eles estão fazendo. Se nós perdermos um bidding, temos certeza qual job o outro time está fazendo. Acho que essa é uma informação util, para boicota-los. Como entregar um priced job antes deles, ou até consumir itens nos shops, para eles não terem onde comprar.
— Reply to this email directly or view it on GitHub https://github.com/lsa-pucrs/mas-pc-pucrs-2015/issues/48.
Sim, pode-se criar jobs! Acredito que no momento que disponibilizaram a ação de postar jobs, foi justamente para isso, pois ninguém irá criar jobs que beneficiam o oponente. Com certeza temos que estar preparados para movimentos parecidos.
Hm. Será que não existe isso (também) para caso um time se de conta que não vai conseguir terminar um job grande, melhor dar um pouco de pontos pro oponente do que perder tudo pro nao fazer o job? []s
On 18/09/2015 16:02, Anibal Sólon wrote:
Sim, pode-se criar jobs! Acredito que no momento que disponibilizaram a ação de postar jobs, foi justamente para isso, pois ninguém irá criar jobs que beneficiam o oponente. Com certeza temos que estar preparados para movimentos parecidos.
— Reply to this email directly or view it on GitHub https://github.com/lsa-pucrs/mas-pc-pucrs-2015/issues/48#issuecomment-141536674.
Pelos exemplos que eles passaram de jobs, nada era muito complexo para tal, mas é uma alternativa sim. O raciocinio para analisar quando precisa de ajuda de outro time sem perder muito do reward é bem complexo, seria interessante mesmo.
São descobertas interessantes, usar a ação de postar jobs (autions e priced) para gerar vários resultados negativos aos adversários: fazê-los gastar o dinheiro deles comprando coisas, pagando multas, ficando sobrecarregados de itens, perdendo movimentos/bateria, talvez não conseguindo responder a tempo para o servidor, etc.
Podemos criar jobs impossíveis, que nos permite oferecer uma grande quantia de dinheiro por eles sem riscos de que eles consigam completar, ou jobs que são possíveis, mas ai temos que tomar cuidado calculando quais valores que, mesmo pagos para o oponente, sejam mais vantajosos financeiramente para nós do que para eles (podemos pedir um ou mais itens no job e oferecer o mínimo valor possível, 1 real ou algo do tipo de recompensa para tarefas que gastam 500 reais em itens, por exemplo... hehehe).
Não daria para implementar um alpha-beta search para decidir isto? Se quiserem eu tenho um em Java que acho que daria para adaptar. Mas daí teríamos que nos restringir só a bids e não a outros movimentos na busca, senão a coisa explode rápido.
Finalmente consegui retomar o trabalho na competição.
Dito isso, acho que podemos criar uns auction jobs para confundir eles, com id "job[0-9]+". Ficarão pensando no que fazer, em qual bid dar, e nós (sabendo que é nosso) jogaremos um valor minimo (1, acho) para sempre ganhar o job.
Acho que a ideia de criar jobs para confundir eles é ótima, vamos testar contra nós mesmos e ver se vale a pena. Nesse caso seria interessante descobrir o que acontece quando dois times dão a mesma bid (por exemplo 1), por mais improvável que seja, pode acontecer.
Ou ainda, podemos analisar quais materiais os jobs estão pedindo, estimar o custo de fazer o job, e fazer um job que valha a pena para nós pagar um reward, em troca dos materiais para outros jobs.
Isso é um pouco mais complexo, para auction jobs talvez funcione, mas para priced não temos como saber se o outro time vai fazer o job ou não, e essa indecisão vai atrapalhar a conclusão dos jobs que decidimos tercerizar. Mesmo para auction jobs, a multa teria que ser grande o suficiente para cobrir os casos em que não vai sobrar tempo para completar o job maior.
Viajando, mas pela direção para onde os agentes estão se movimentando, dá para estimar qual job eles estão fazendo. Se nós perdermos um bidding, temos certeza qual job o outro time está fazendo. Acho que essa é uma informação util, para boicota-los. Como entregar um priced job antes deles, ou até consumir itens nos shops, para eles não terem onde comprar.
Isso seria muito interessante! Mas será que é viável mesmo? Adicionei no TODO para discutirmos.
Podemos criar jobs impossíveis, que nos permite oferecer uma grande quantia de dinheiro por eles sem riscos de que eles consigam completar, ou jobs que são possíveis, mas ai temos que tomar cuidado calculando quais valores que, mesmo pagos para o oponente, sejam mais vantajosos financeiramente para nós do que para eles (podemos pedir um ou mais itens no job e oferecer o mínimo valor possível, 1 real ou algo do tipo de recompensa para tarefas que gastam 500 reais em itens, por exemplo... hehehe).
Discutimos um pouco sobre o assunto de jobs impossíveis em uma reunião, e eu gostei da ideia. Para implementar isso precisamos modelar um pouco melhor o que caracteriza um job impossível, quando postamos, etc. Tu gostaria de fazer isso @artur-freitas ? Se sim traz um modelo de job impossível e alguns exemplos para uma reunião futura, que é melhor de expor do que por aqui.
Não daria para implementar um alpha-beta search para decidir isto? Se quiserem eu tenho um em Java que acho que daria para adaptar. Mas daí teríamos que nos restringir só a bids e não a outros movimentos na busca, senão a coisa explode rápido.
É possível que ajude, dependeria da performance. Adicionei no TODO mas eu imagino que vai ficar para o ano que vem, pois a lista de TODO já está enorme :panda_face:
Porém como estamos salvando tudo no wiki, vai ser fácil identificar o que podemos fazer no próximo ano para melhorar o time.
enumerando uma lista de motivos que resultam em jobs impossíveis:
1 - O job pede mais itens do que existem a disposição para comprar. Considerar stock e restock dos shops para definir deadline e itens do job. Problema: se o cálculo desconsiderar que o time adversário pode possuir itens em mãos ou no storage, podemos ser surpreendidos por eles completando a tarefa. Para mitigar esse risco, podemos extrapolar a quantidade de itens do job...
2 - O job tem um deadline curto em relação aos itens/deslocamentos/etc. Supondo que a solução ótima para o job leve um número X de iterações, colocar o deadline como 30% deste valor. Os cálculos devem supor tempos de deslocamentos entre as facilities necessárias ao job (levando em consideração load e speed) e que todos os agentes do outro time vão fazer a tarefa. Esse eu acho que pode ser bem complicado de calcular.
3 - ???
se sobrar tempo na reunião de hoje podemos conversar se isso faz sentido...
1 - O job pede mais itens do que existem a disposição para comprar.
Acho que uma maneira segura e fácil de implementar seria pedir items que não existem nos shops. Assim é realmente impossível do time adversario entregar o job, e não precisamos perder tempo raciocinando sobre a quantidade dos itens nos shops (que pode mudar a qualquer momento).
2 - O job tem um deadline curto em relação aos itens/deslocamentos/etc.
Aqui é tricky, o máximo que podemos fazer é estimar um tempo que levaria para completar a tarefa, mas se os agentes do time inimigo tem algum calculo de estimativa a nossa estimativa não vai valer muita coisa. No fim seria que nem jogar uma moeda. Para garantir eu acho melhor começar com um deadline de 1 passo.
Ambas situações eu acredito serem mais indicadas para auction jobs, para podermos ganhar a multa. Uma questão que fica é, tem algum job impossível que vale a pena criar para priced jobs?
The dream is dead.
A ideia de sacanear os outros times postando jobs com storages e/ou items invalidos não funciona, o servidor verifica os dados antes de passar o job para os times.
Para piorar ainda descobrimos que o nosso translator não funciona para o post_job, mas acho que o Ramon e o Mauricio já conseguiram arrumar isso com o último commit.
E também descobrimos que o post priced job da erro no servidor, possivelmente um bug da parte deles, vou reportar logo mais.
A princípio só vou implementar o post job com deadline curto, mas se alguém tiver interesse em investigar isso mais a fundo e quiser marcar uma hora para tentarmos me avisa no gtalk.
Por enquanto nosso time está pegando os nossos próprios jobs, vou mudar isso em um commit futuro. Ainda não decidi se é melhor identificar (como?) os nossos jobs e ignorar ou então fazer um mecanismo de defesa que vai naturalmente excluir esses jobs.
Nos auction jobs, nós podemos dar bid mesmo se nós postamos, mas não podemos fazer delivery do job, então nós pagariamos a multa. Entretanto, como vocês podem ver no print abaixo, nós pagariamos e receberiamos a multa (ou seja, variação = zero). Já quando um time faz delivery dum job nosso, nós temos que pagar ele (ou ele nos paga, caso não faça o job).
Nós ganhamos o que foi produzido, para qualquer tipo de trabalho. Fica armazenado no storage do job para pegarmos.
Dito isso, acho que podemos criar uns auction jobs para confundir eles, com id "job[0-9]+". Ficarão pensando no que fazer, em qual bid dar, e nós (sabendo que é nosso) jogaremos um valor minimo (1, acho) para sempre ganhar o job.
Ou ainda, podemos analisar quais materiais os jobs estão pedindo, estimar o custo de fazer o job, e fazer um job que valha a pena para nós pagar um reward, em troca dos materiais para outros jobs.
Viajando, mas pela direção para onde os agentes estão se movimentando, dá para estimar qual job eles estão fazendo. Se nós perdermos um bidding, temos certeza qual job o outro time está fazendo. Acho que essa é uma informação util, para boicota-los. Como entregar um priced job antes deles, ou até consumir itens nos shops, para eles não terem onde comprar.