Untitled
unknown
plain_text
3 years ago
1.9 kB
4
Indexable
int initial(simplex_t* s, int m, int n, double** a, double* b, double* c, double* x, double y, int* var) {
int i, j, k;
double w;
k = init(s, m, n, var, a, b, x, c, y);
if(b[k] >= 0) {
return 1;
}
prepare(s, k);
n = s->n;
s->y = xsimplex(m, n, s->a, s->b, s->c, s->x, 0, s->var, 1);
for (i = 0; i < m + n; i += 1) {
if(s->var[i] == m+n-1) {
if(abs(s->x[i]) > epsilon) {
free(s->x);
free(s->c);
return 0;
} else {
break;
}
}
}
if(i >= n) {
for(j = k = 0; k < n; k += 1) {
if(abs(s->a[i-n][k]) > abs(s->a[i-n][j])) {
j = k;
}
}
pivot(s, i-n, j);
i = j;
}
if(i < n-1) {
k = s->var[i]; s->var[i] = s->var[n-1]; s->var[n-1] = k;
for(k = 0; k < m; k += 1){
w = s->a[k][n-1]; s->a[k][n-1] = s->a[k][i]; s->a[k][i] = w;
}
} else {
//x_(n+m) is nonbasic and last. Forget it.
}
free(s->c);
s->c = c;
s->y = y;
for(k = n-1; k < n + m; k += 1) {
s->var[k] = s->var[k+1];
}
n = s->n = s->n - 1;
double* t = calloc(n, sizeof(double));
for(k = 0; k < n; k += 1) {
for(j = 0; j < n; j += 1) {
if(k == s->var[j]) {
t[j] = t[j] + s->c[k];
goto next_k;
}
}
for(j = 0; j < m; j += 1) {
if(s->var[n+j] == k){
//x_k is at row j
break;
}
}
s->y = s->y + s->c[k] * s->a[j][i];
for(i = 0; i < n; i += 1) {
t[i] = t[i] - s->c[k] * s->a[j][i];
}
next_k:;
}
for(i = 0; i < n; i += 1) {
s->c[i] = t[i];
}
free(t);
free(s->x);
return 1;
}Editor is loading...