Ir ao conteúdo
  • Cadastre-se

Tiago Pessotti

Membro Júnior
  • Posts

    2
  • Cadastrado em

  • Última visita

Reputação

0
  1. Muito obrigado... Também não entendi muito bem a lógica, meu professor é meio doido...kkkkkk
  2. Meu professor de programação me passou esse programa para modificar, dando a solução com duas mochilas, porém o programa original não está rodando... Preciso de ajuda somente para consertar o código... Depois eu me viro com o exercício... #include <stdio.h> #include <math.h> #include <time.h> #include <stdlib.h> int n, capacidade; typedef struct tsol { int obj[50]; int fo; } tsol; int b[50], p[50]; void lerarquivos(); int calcularfo(tsol s); tsol gerearsolucaoinicial(); void imprimirmelhorsol(tsol s); tsol trocarbit(tsol s, int i); tsol subidatrocabit(tsol s); void sa(); void ils(); double randomico (double min, double max); int irandomico(int min , int max); int main() { int opcao =0; lerarquivos(); do { system("cls"); printf("\n----------------------------------------------------------------------------------\n"); printf ("\n problema da mochila por meio de meta-heuristica\n"); printf ("\n capacidade da mochila: 9\n"); printf ("\n beneficio : [2,3,6,7,5]\n"); printf ("\n peso itens : [2,3,4,5,8]\n"); printf("\n----------------------------------------------------------------------------------\n"); printf("\nmenu\n"); printf("\n[2] ils"); printf("\n[0] sair"); printf("\nopcao: \n"); scanf("%d",&opcao); switch(opcao) { case 1: case 2: ils(); break; case 0: printf ("\pressione alguma tecla para sair...]\n"); break; default: printf("\nopcao inválida"); fflush(stdin); getchar(); } } while(opcao!=0); fflush(stdin); getchar(); return 0; } double randomico(double min, double max) { return ((double) (rand()%10000)/10000.0)*(max-min)+min; } int irandomico(int min, int max) { return (int)randomico(0,max-min+1.0)+min; } tsol gerarsolucaoinicial() { tsol s; int j; for(j=0;j<n;j++) s.obj[j]=irandomico(0,1); s.fo=calcularfo(); return s; } void imprimimelhorsol(tsol s) { printf ("\n\n\nmelhor solução encontrada\n"); printf ("\n ************************************\n"); printf ("\n fo: %d\n",s.fo); printf ("\nobjetos selecionados: \n"); printf("\n----------------------------------------------------------------------------------\n"); int i; for(i=0;i<n;i++) if(s.obj) printf ("\n %d",i); printf ("\nojetos não selecionados\n"); printf("\n----------------------------------------------------------------------------------\n"); for(i=0;i<n;i++) if(!s.obj) printf ("\n %d",i); printf("\n\n pressione alguma tecla para retornar ao menu.."); fflush(stdin); getchar(); } void lerarquivos() { int j, valor; file *arquivo; char nomearqb[50]="beneficio.txt"; char nomearqp[50]="peso.txt"; arquivo = fopen(nomearqb, "r"); if (!arquivo) { printf("o arquivo %s não pode ser aberto.\n",nomearqb); getchar(); exit(1); } j=0; while(!feof(arquivo) { fscanf(arquivo, "%d",&valor); b[j]=valor; j++; } fclose(arquivo); arquivo=fopen(nomearqp,"r"); if (!arquivo) { printf("o arquivo %s não pode ser aberto.\n",nomearqb); getchar(); exit(1); } while(!feof(arquivo) { fscanf(arquivo, "%d",&valor); b[j]=valor; j++; } fclose(arquivo); } int calcularfo(tsol s) { int fo, beneficio=0,peso=0,inviabilidade=0,penalidade=400; int i; for(i=0;i<n;i++) { if(s.obj==1) { beneficio += b; peso+=p; } } inviabilidade=max(0,peso-capacidade); fo=benficio-(penelidade*inviabilidade); return fo; } void imprimirmehorsol(tsol s) { printf ("\n\n\nmelhor solução encontrada\n"); printf ("\n ************************************\n"); printf ("\n fo: %d\n",s.fo); printf ("\nobjetos selecionados: \n"); printf("\n----------------------------------------------------------------------------------\n"); int i; for(i=0;i<n;i++) { if (s.obj) } printf ("\n %d",i); printf ("\nojetos não selecionados\n"); printf("\n----------------------------------------------------------------------------------\n"); for(i=0;i<n;i++) if(!s.obj) printf ("\n %d",i); printf("\n\n pressione alguma tecla para retornar ao menu.."); fflush(stdin); getchar(); } tsol trocarbit(tsol s, int i) { if(s.obj==1) s.obj=0; else s.obj=1; return s; } tsol gerarsolucaoinicial() { tsol s; int j; for(j=0;j<n;j++) { s.obj[j] = irandomico(0,1); s.fo=calcularfo(s); return s; }} tsol subidatrocabit(tsol s) { int melhorou =1; tsol slocal =s; while (melhorou) {melhorou =0; int i; for (i=0;i<n;i++) { s=trocarbit(s,i); s.fo=calcularfo(s); if(s.fo > slocal.fo) { slocal=s; melhorou=1; } s=trocarbit(s,i); } s=slocal; } return s; } void ils() { double beta=0; int iter=0, intermax=5000,intermelhora=0,delta=0; tsol s,smelhor,sviz,smelhorviz; s=gerarsolucaoinicial(); smelhor=subidatrocabit(s); smelhor.fo=calcularfo(smelhor); while(inter<intermax) { inter++; beta=randomico(0.2,0.4); double pert=n*beta; sviz=smelhor; int i; for(i=0;i<pert;i++) { int pos =irandomico(0,n-1); sviz=trocarbit(sviz,pos); } sviz.fo=calcularfo(sviz); smelhorviz=subidatrocabit(sviz); smelhorviz.fo=calcularfo(smelhorviz); delta=smelhorviz.fo-smelhor.fo; if(delta>0) { smelhor=smelhorviz; itermelhora=iter; } if(iter-itermelhora>1000) { smelhor=gerarsolucaoinicial(); itermelhora=iter; } printf("\niter:%d\t fo:%8d",iter,smelhor.fo); } imprimirmelhorsol(smelhor); }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...