Untitled
unknown
plain_text
2 years ago
1.9 kB
3
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...