#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;
}