Untitled

 avatar
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...