#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define T0 100
#define TF 0.01
#define T 0.95
#define N 100
#define M 5
#define S 9999
int s[M][M] = {{S, 3, 3, 2, 6}, {3, S, 7, 3, 2}, {3, 7, S, 2, 5},
{2, 3, 2, S, 3}, {6, 2, 5, 3, S}};
int premin = 0, bestmin = 0;
int a[M] = {0}, preseq[M] = {0}, bestseq[M]={0};
int calweight(int a[M])
{
int i = 0, j = 0, k = 0;
int w = 0;
for (k = 0; k < (M -1); k++)
{
i = a[k];
j = a[k+1];
w = w + s[i][j];
}
i = a[k];
j = a[0];
w = w + s[i][j];
return w;
}
void initialize(void)
{
int i = 0;
for (i = 0; i < M; i++)
{
a[i] = i;
preseq[i] = i;
bestseq[i] = i;
}
premin = calweight(a);
bestmin = premin;
}
void getrand(int *i, int *j)
{
*i = 0;
*j = 0;
while (*i == *j)
{
*i = rand()%5;
*j = rand()%5;
}
}
void change(void)
{
int r1 = 0, r2 = 0;
int temp = 0;
getrand(&r1, &r2);
temp = a[r1];
a[r1] = a[r2];
a[r2] = temp;
}
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 = calweight(a) - bestmin;
if (dif1 < 0)
{
for (j = 0 ; j < M; j++)
{
preseq[j] = a[j];
bestseq[j] = a[j];
}
premin = calweight(a);
bestmin = premin;
}
else
{
dif2 = calweight(a) - premin;
if (dif2 < 0)
{
for (j = 0; j < M; j++)
{
preseq[j] = a[j];
}
premin = calweight(a);
}
else
{
p = rand()%20001/20000.0;
if (exp((-1 * dif2)/ t) > p)
{
for (j = 0; j < M; j++)
{
preseq[j] = a[j];
}
premin = calweight(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();
printf("The shortest path is ");
for (i = 0; i < M; i++)
{
printf("%d ", bestseq[i] + 1);
}
printf("\nThe shortest value is %d\n", bestmin);
return 1;
}