0/1背包问题的模拟退火算法

#include
#include
#include
#include

#define T0 1000
#define TF 0.01
#define T 0.95
#define N 1000
#define M 50

int weight[M]= { 80, 82, 85, 70, 72,     70, 66, 50, 55, 25,
                  50, 55, 40, 48, 50,     32, 22, 60, 30, 32,
                  40, 38, 35, 32, 25,     28, 30, 22, 50, 30,
                  45, 30, 60, 50, 20,     65, 20, 25, 30, 10,
                  20, 25, 15, 10, 10,     10, 4,  4,   2,  1   },
 profit[M]= { 220, 208, 198, 192, 180,    180, 165, 162, 160, 158,
                  155, 130, 125, 122, 120,    118, 115, 110, 105, 101,
                  100, 100,  98,  96,  95,     90,  88,  82,  80,  77,
                  75,  73,   72,  70,  69,     66,  65,  63,  60,  58,
                  56,  50,   30,  20,  15,     10,  8,    5,  3,    1},
 contain = 1000;

 

int  premaxp = 0, bestmaxp = 0;

int a[M] = {0}, preseq[M] = {0}, bestseq[M]={0};

int calprofit(int a[M])
{
 int i = 0;
 int p = 0;

 for (i = 0; i < M; i++)
 p = p + (a[i] * profit[i]);

 return p;
}

int calweight(int a[M])
{
 int i = 0;
 int w = 0;

 for (i = 0; i < M; i++)
 {
  w = w + (weight[i] * a[i]);
 }

 return w;
}

void initialize(void)
{
 int i = 0;

 for (i = 0; i < M; i++)
 {
  a[i] = 0;
  preseq[i] = 0;
  bestseq[i] = 0;
 }
 premaxp = calprofit(a);
 bestmaxp = premaxp;
}

void getrand(int *i, int *j)
{
 *i = 0;
 *j = 0;

 while (*i == *j)
 {
  *i = rand()%50;
  *j = rand()%50;
 }
}

void change(void)
{
 int r1 = 0, r2 = 0;
 getrand(&r1, &r2);
 
 a[r1] = 1;
 a[r2] = 1;

 if (calweight(a) > contain)
 {
  a[r2] = 0;
 }
 if (calweight(a) > contain)
 {
  a[r1] = 0;
 }
}

void SA(void)
{
 double t = T0;
 int i = 0, j = 0;
 int dif1 = 0, dif2 = 0;
 double p = 0.0;

 while(t > TF)
 {
  for (i = 0; i < N; i++)
  {
   change();
  
   dif1 = calprofit(a) - bestmaxp;
   if (dif1 > 0)
   {
    for (j = 0 ; j < M; j++)
    {
     preseq[j] = a[j];
     bestseq[j] = a[j];
    }
    premaxp = calprofit(a);
    bestmaxp = premaxp;
   }
   else
   {
    dif2 = calprofit(a) - premaxp;
    if (dif2 > 0)
    {
     for (j = 0; j < M; j++)
     {
      preseq[j] = a[j];
     }
     premaxp = calprofit(a);
    }
    else
    {
     p = rand()%20001/20000.0;
     if (exp((dif2)/ t) > p)
     {
      for (j = 0; j < M; j++)
      {
       preseq[j] = a[j];
      }
      premaxp = calprofit(a);
     }
     else
     {
      for (j = 0; j < M; j++)
      {
       a[j] = preseq[j];
      }
     }
    }
   }
  }

  t = t * T;
 }

 
}

int main(void)
{
 int i;

 srand((unsigned)time(NULL));
 initialize();

 SA();
 for (i = 0; i < M; i++)
 {
  if (0 == (i % 5))
  {
   printf("  ");
  }
  printf("%d", bestseq[i]);
 }

 printf("\nThe best value is %d\n", bestmaxp);

 return 1;
}

你可能感兴趣的:(算法)