Я пытаюсь решить, благодаря методу имитации отжига, следующую проблему:
Где я уже получил значения c_i,j,f, хранящиеся в массиве 1D, так что
c_i,j,f <=> c[i + j * n + f * n * n]
Моя смоделированная функция отжига выглядит так:
int annealing(int n, int k_max, int c[]){
// Initial point (verifying the constraints )
int x[n * n * n];
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
for (int f = 0; f < n; f++){
if (i == j && j == f && f == i){
x[i + j * n + f * n * n] = 1;
}else{
x[i + j * n + f * n * n] = 0;
}
}
}
}
// Drawing y in the local neighbourhood of x : random permutation by keeping the constraints verified
int k = 0;
double T = 0.01; // initial temperature
double beta = 0.9999999999; // cooling factor
int y[n * n * n];
int permutation_i[n];
int permutation_j[n];
while (k <= k_max){ // k_max = maximum number of iterations allowed
Permutation(permutation_i, n);
Permutation(permutation_j, n);
for (int f = 0; f < n; f++){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
y[i + j * n + f * n * n] = x[permutation_i[i] + permutation_j[j] * n + f * n * n];
}
}
}
if (f(y, c, n) < f(x, c, n) || rand()/(double)(RAND_MAX) <= pow(M_E, -(f(y, c, n)-f(x, c, n))/T)){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
for (int f = 0; f < n; f++){
x[i + j * n + f * n * n] = y[i + j * n + f * n * n];
}
}
}
}
T *= beta;
++k;
}
return f(x, c, n);
}
Процедура Permutation(int permutation[], n) заполняет массив permutation случайной перестановкой [[0,n-1]] (например, она преобразует [0,1,2,3,4] в [ 3,0,4,2,1]).
Проблема в том, что для 1000000 итераций требуется слишком много времени, а значения целевой функции колеблются между 78 и 79, в то время как я должен получить 0 в качестве решения.
Я также думал, что могу добиться большего успеха, когда дело доходит до сложности... Кто-нибудь может мне помочь?
Заранее спасибо!