Nadesłany przez Robert Dudek, 27 grudnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
kod Balas/Algorytm Balas/Algorytm.cpp:
#include "Algorytm.h"
//zero-jedynkowy addytywny Algorytm BALASA
void Balas(PARAMETRY *pomocnicza)
{
//zmienne pomocnicze
int alfa, beta, gamma, i, j, mnr, nr, p, r, r1, r2, s, t, z;
int inf = 1000;
//zmienne lokalne zmienione w związku z dynamiczną alokacją pamięci
int *y, *w, *zr;
int *ii, *jj, *xx;
int *kk;
y = (int*)malloc(pomocnicza->M * sizeof(int));
w = (int*)malloc(pomocnicza->M * sizeof(int));
zr = (int*)malloc(pomocnicza->M * sizeof(int));
ii = (int*)malloc(pomocnicza->N * sizeof(int));
jj = (int*)malloc(pomocnicza->N * sizeof(int));
xx = (int*)malloc(pomocnicza->N * sizeof(int));
kk = (int*)malloc((pomocnicza->N+1) * sizeof(int));
for(i=0; i<pomocnicza->M; i++) y[i] = pomocnicza->tab_B[i];
z = 1;
for(j=0; j<pomocnicza->N; j++)
{
xx[j] = 0;
z = z + pomocnicza->tab_C[j];
}
pomocnicza->FVAL = z+z;
s = t = z = 0;
kk[0] = 0;
pomocnicza->EXIST = FALSE;
jeden:
p = mnr = 0;
for(i=0; i<pomocnicza->M; i++)
{
r = y[i];
if(r < 0) //infeasible constraint I
{
p++;
gamma = 0;
alfa = r;
beta = -inf;
for(j=0; j<pomocnicza->N; j++)
if(xx[j] <= 0)
if((pomocnicza->tab_C[j] + z) >= pomocnicza->FVAL)
{
xx[j] = 2;
kk[s]++;
t++;
jj[t-1] = j+1;
}
else
{
r1 = pomocnicza->tab_A[i*(pomocnicza->N) +j];
if(r1 < 0)
{
alfa = alfa - r1;
gamma = gamma + pomocnicza->tab_C[j];
if(beta < r1) beta = r1;
}
}
if(alfa < 0) goto dwa;
if(alfa + beta < 0)
{
if((gamma + z) >= pomocnicza->FVAL) goto dwa;
for(j=0; j<pomocnicza->N; j++)
{
r1 = pomocnicza->tab_A[i*pomocnicza->N +j];
r2 = xx[j];
if(r1 < 0)
{
if(r2 == 0)
{
xx[j] = -2;
for(nr=0; nr<mnr; nr++)
{
zr[nr] = zr[nr] - pomocnicza->tab_A[(w[nr]-1)*pomocnicza->N +j];
if(zr[nr] < 0) goto dwa;
}
}
}
else
if(r2 < 0)
{
alfa = alfa - r1;
if(alfa < 0) goto dwa;
gamma = gamma + pomocnicza->tab_C[j];
if((gamma + z) >= pomocnicza->FVAL) goto dwa;
}
}
mnr++;
w[mnr-1] = i+1;
zr[mnr - 1] = alfa;
}
}
}
// updating the best solution
if(p == 0)
{
pomocnicza->FVAL = z;
pomocnicza->EXIST = true;
for(j=0; j<pomocnicza->N; j++)
{
if(xx[j] == 1)
{
pomocnicza->tab_X[j] = 1;
}
else
{
pomocnicza->tab_X[j] = 0;
}
}
goto dwa;
}
if(mnr == 0)
{
p = 0;
gamma = -inf;
for(j=0; j<pomocnicza->N; j++)
if(xx[j] == 0)
{
beta = 0;
for(i=0; i<pomocnicza->M; i++)
{
r = y[i];
r1 = pomocnicza->tab_A[pomocnicza->N*i + j];
if(r < r1) beta = beta + r - r1;
}
r = pomocnicza->tab_C[j];
if((beta > gamma) || (beta == gamma) && (r < alfa))
{
alfa = r;
gamma = beta;
p = j+1;
}
}
if(p == 0) goto dwa;
s++;
kk[s] = 0;
t++;
jj[t-1] = p;
ii[s-1] = 1;
xx[p-1] = 1;
z = z + pomocnicza->tab_C[p-1];
for(i=0; i<pomocnicza->M; i++)
y[i] = y[i] - pomocnicza->tab_A[pomocnicza->N*i + p-1];
}
else
{
s++;
ii[s-1] = 0;
kk[s] = 0;
for(j=0; j<pomocnicza->N; j++)
if(xx[j] < 0)
{
t++;
jj[t-1] = j+1;
ii[s-1] = ii[s-1] - 1;
z = z + pomocnicza->tab_C[j];
xx[j] = 1;
for(i=0; i<pomocnicza->M; i++)
y[i] = y[i] - pomocnicza->tab_A[i*pomocnicza->N +j];
}
}
goto jeden;
//backtracking
dwa:
for(j=0; j<pomocnicza->N; j++)
if(xx[j] < 0)
xx[j] = 0;
if(s > 0)
do
{
p = t;
t = t - kk[s];
for(j=t; j<p; j++)
xx[jj[j]-1] = 0;
p = abs(ii[s-1]);
kk[s-1] = kk[s-1] + p;
for(j=t-p; j<t; j++)
{
p = jj[j];
xx[p-1] = 2;
z = z - pomocnicza->tab_C[p-1];
for(i=0; i<pomocnicza->M; i++)
y[i] = y[i] + pomocnicza->tab_A[pomocnicza->N*i + p-1];
}
s--;
if(ii[s] >= 0) goto jeden;
}while(s != 0);
//zwalniam przydzieloną pamięć dla zmiennych lokalnych
free(y); free(w); free(zr);
free(ii); free(jj); free(xx);
free(kk);
}

