{"id":15406335,"url":"https://github.com/pfac/cpd-amn","last_synced_at":"2026-06-19T06:31:30.563Z","repository":{"id":142028155,"uuid":"4123013","full_name":"pfac/CPD-AMN","owner":"pfac","description":"Simulated Annealing implementation \u0026 profile","archived":false,"fork":false,"pushed_at":"2017-07-05T23:09:34.000Z","size":2526,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-01T14:46:22.796Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pfac.png","metadata":{"files":{"readme":"README.asciidoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-04-24T09:26:44.000Z","updated_at":"2017-07-05T22:35:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"afe07c3a-96b5-4905-af7b-431475b6dfe8","html_url":"https://github.com/pfac/CPD-AMN","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfac%2FCPD-AMN","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfac%2FCPD-AMN/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfac%2FCPD-AMN/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pfac%2FCPD-AMN/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pfac","download_url":"https://codeload.github.com/pfac/CPD-AMN/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240002680,"owners_count":19732242,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-01T16:21:06.838Z","updated_at":"2026-04-14T12:30:21.799Z","avatar_url":"https://github.com/pfac.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Mestrado em Engenharia Informática\n\n== Computação Paralela e Distribuída\n\n=== Algoritmos e Métodos Numéricos\n\n==== Projecto 1 - The Room Assignment Problem\n\nTrata-se de distribuir +n+ alunos (assume-se que +n+ é par) por +n/2+ quartos de uma residência universitária por forma a evitar, tanto quanto possível, eventuais incompatibilidades entre parceiros de quarto. É construída uma matriz +D=(d~ij~)+ tal que que +0 \u0026le; d~ij~ \u0026le; 10+ para cada par +(i,j)+, +i\u0026ne;j+. O valor de +d~ij~+ ``mede'' um potencial conflito entre os estudantes +i+ e +j+: no caso ideal é +d~ij~=d~ji~=0+ (assume-se que a matriz +D+ é simétrica); no caso de extrema incompatibilidade entre os estudantes +i+ e +j+, é +d~ij~=d~ji~=10+. O objectivo é encontrar a solução que minimiza a soma (custo) +\u0026sum;^n/2^~k=1~ D(i~k~,j~k~)+. Note-se que o número de possíveis distribuções distintas é dado por +C(n)=(n-1)\u0026times;(n-3)\u0026times;...\u0026times;3+ que é um número da ordem de grandeza de +\u0026radic;n!+ e, portanto, cresce muito rapidamente com +n+, tornando impraticável a análise exaustiva de todas as possibilidades. A alternativa é usar um método heurístico que não garante a solução óptima. Parte-se de uma distribuição inicial aleatória; em cada passo, são escolhidos, ao acaso, dois estudantes de quartos diferentes; se a troca entre eles conduzir a uma solução de menor custo, a troca é sempre realizada; uma troca que conduza a uma solução de maior custo também pode ser aceite, dependendo da temperatura do sistema. O sistema vai ``arrefecendo'' à medida que o processo evolui e a probabilidade de uma solução com custo mais elevado ser aceite vai diminuindo. Nisto consiste a técnica conhecida por ``simulated annealing'' (veja [1], pag. 259 para mais detalhes).\n\n===== Objectivos\n\n. Desenvolva em C ou Fortran uma implementação sequencial do método, que designaremos por *Alg1*, que nunca aceita uma solução que tenha custo maior do que a anterior (e portanto não usa ``simulated annealing''). Dado +n+ (par), o código gera aleatoriamente uma matriz +D+ de inteiros entre +0+ e +10+ (incompatibilidades) e uma distribuição inicial; em seguida, inicia o processo de melhoria da solução. A busca termina após um número +max+ de tentativas consecutivas sem alteração da solução.\n. Modifique o código anterior para produzir uma implementação, que designaremos por *Alg2*, que implementa a técnica ``simulated annealing'', isto é, aceita ou não uma solução com custo mais elevado dependendo da diferença de custos e da temperatura do sistema. Use uma temperatura inicial igual a +1+, e faça, em cada passo, +T = 0.999T+.\n. Para testar *Alg1* e *Alg2*, introduza na matriz incompatibilidades +D+ uma solução de custo zero (isto é, atribua o valor de zero a +n/2+ elementos da matriz +D+, não repetindo linhas nem colunas). Repita a execução do código para diferentes valores de +n+, desde +20+ até +100+ e com diferentes números pseudo-aleatórios, procurando encontrar a solução de custo mínimo. Num gráfico represente os custos das soluções produzidas, para valor de +n+, pelos dois códigos. Use diferentes valores de +max+ (maiores para valores de +n+ maiores).\n. Execute os mesmos códigos, variando o valor da temperatura inicial, por\nexemplo usando o valor +T~0~ = 10+.\n. Desenvolva uma implementação paralela em C e MPI de *Alg1*. O algoritmo é ``embaraçosamente paralelo'' já que cada processo executará o mesmo código mas usando diferentes números pseudo-aleatórios e produzindo, portanto, diferentes distribuições. A solução paralela será a solução de menor custo de entre o conjunto das soluções obtidas pelos diferentes processos.\n. Teste o seu código paralelo no cluster http://search.di.uminho.pt[SeARCH], usando um número de processos tão grande quanto lhe for possível.\n. Escreva um relatório do trabalho desenvolvido (não mais do que 10 páginas). Em particular, compare a qualidade das soluções obtidas com as implementações sequenciais *Alg1* e *Alg2* e também a qualidade das soluções obtidas com as implementações sequencial e paralela de *Alg2*.\n\n===== Referências\n\n. Michael J. Quinn, _Parallel Programming in C with MPI and OpenMP_, McGraw-Hill 2003\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpfac%2Fcpd-amn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpfac%2Fcpd-amn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpfac%2Fcpd-amn/lists"}