⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cplex.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 4 页
字号:
CPXLP *CPXcreateprob(CPXENV *env, int *status, const char *probname){     CPXLP *lp = NULL;      int errcode;      errcode = checkenv(env);      if (errcode) goto done;      lp = glp_malloc(sizeof(struct CPXLP));      lp->env = env;      lp->prob = glp_create_prob();      glp_set_prob_name(lp->prob, probname);      lp->rflen = 100;      lp->rflag = glp_calloc(lp->rflen, sizeof(char));      lp->iwlen = 100;      lp->iwork = glp_calloc(lp->iwlen, sizeof(int));      memset(lp->iwork, 0, lp->iwlen * sizeof(int));      lp->link = env->list;      env->list = lp;      invalidate(lp);done: if (status != NULL) *status = errcode;      return lp;}int CPXdelcols(CPXENV *env, CPXLP *lp, int begin, int end){     int j, n, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      n = glp_get_num_cols(lp->prob);      if (!(0 <= begin && begin <= end && end < n))      {  errcode = error(env, CPXERR_INDEX_RANGE);         goto done;      }      errcode = 0;      invalidate(lp);      enlargeiwork(lp, end-begin+1);      for (j = begin; j <= end; j++)         lp->iwork[j-begin] = j+1;      glp_del_cols(lp->prob, end-begin+1, lp->iwork-1);      for (j = begin; j <= end; j++)         lp->iwork[j-begin] = 0;done: return errcode;}int CPXdelrows(CPXENV *env, CPXLP *lp, int begin, int end){     int i, m, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      m = glp_get_num_rows(lp->prob);      if (!(0 <= begin && begin <= end && end < m))      {  errcode = error(env, CPXERR_INDEX_RANGE);         goto done;      }      errcode = 0;      invalidate(lp);      enlargeiwork(lp, end-begin+1);      for (i = begin; i <= end; i++)         lp->iwork[i-begin] = i+1;      glp_del_rows(lp->prob, end-begin+1, lp->iwork-1);      for (i = begin; i <= end; i++)         lp->iwork[i-begin] = 0;      for (i = end+1; i < m; i++)         lp->rflag[i-(end-begin+1)] = lp->rflag[i];done: return errcode;}int CPXdelsetcols(CPXENV *env, CPXLP *lp, int delstat[]){     xassert(env == env);      xassert(lp == lp);      xassert(delstat == delstat);      printf("CPXdelsetcols: not implemented yet\n");      exit(EXIT_FAILURE);      return -1;}int CPXdelsetrows(CPXENV *env, CPXLP *lp, int delstat[]){     int i, m, cnt, ind, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      m = glp_get_num_rows(lp->prob);      if (m > 0 && delstat == NULL)      {  errcode = error(env, CPXERR_NULL_POINTER);         goto done;      }      errcode = 0;      invalidate(lp);      enlargeiwork(lp, m);      cnt = ind = 0;      for (i = 0; i < m; i++)      {  if (delstat[i] == 1)         {  delstat[i] = -1;            lp->iwork[cnt++] = i+1;         }         else         {  delstat[i] = ind;            lp->rflag[ind++] = lp->rflag[i];         }      }      if (cnt > 0)         glp_del_rows(lp->prob, cnt, lp->iwork-1);      for (i = 0; i < cnt; i++)         lp->iwork[i] = 0;done: return errcode;}int CPXdualopt(CPXENV *env, CPXLP *lp);int CPXfreeprob(CPXENV *env, CPXLP **_lp){     CPXLP *lp;      int errcode;      errcode = checkenv(env);      if (errcode) goto done;      if (_lp == NULL)      {  errcode = error(env, CPXERR_NULL_POINTER);         goto done;      }      lp = *_lp;      errcode = checklp(env, lp);      if (errcode) goto done;      errcode = 0;      env = lp->env;      if (env->list == lp)         env->list = lp->link;      else      {  CPXLP *pp;         for (pp = env->list; pp != NULL; pp = pp->link)            if (pp->link == lp) break;         xassert(pp != NULL);         pp->link = lp->link;      }      glp_delete_prob(lp->prob);      glp_free(lp->rflag);      glp_free(lp->iwork);      glp_free(lp);      *_lp = NULL;done: return errcode;}int CPXgetbase(CPXENV *env, CPXLP *lp, int cstat[], int rstat[]){     int i, j, m, n, stat, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      if (!lp->stat)      {  errcode = error(env, CPXERR_NO_SOLN);         goto done;      }      if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL)         ;      else      {  errcode = error(env, CPXERR_NO_BASIC_SOLN);         goto done;      }      errcode = 0;      if (rstat != NULL)      {  m = glp_get_num_rows(lp->prob);         for (i = 0; i < m; i++)         {  stat = glp_get_row_stat(lp->prob, i+1);            if (stat == GLP_BS)               rstat[i] = CPX_BASIC;            else if (lp->rflag[i] == RF_NOT_RANGED || stat != GLP_NU)               rstat[i] = CPX_AT_LOWER;            else               rstat[i] = CPX_AT_UPPER;         }      }      if (cstat != NULL)      {  n = glp_get_num_cols(lp->prob);         for (j = 0; j < n; j++)         {  stat = glp_get_col_stat(lp->prob, j+1);            if (stat == GLP_BS)               cstat[j] = CPX_BASIC;            else if (stat == GLP_NU)               cstat[j] = CPX_AT_UPPER;            else if (stat == GLP_NF)               cstat[j] = CPX_FREE_SUPER;            else               cstat[j] = CPX_AT_LOWER;         }      }done: return errcode;}int CPXgetbasednorms(CPXENV *env, CPXLP *lp, int cstat[], int rstat[],      double dnorm[]){     int i, m, errcode;      errcode = CPXgetbase(env, lp, cstat, rstat);      if (errcode) goto done;      if (dnorm != NULL)      {  m = glp_get_num_rows(lp->prob);         for (i = 0; i < m; i++) dnorm[i] = 1.0;      }done: return errcode;}int CPXgetbhead(CPXENV *env, CPXLP *lp, int head[], double x[]){     xassert(env == env);      xassert(lp == lp);      xassert(head == head);      xassert(x == x);      printf("CPXgetbhead: not implemented yet\n");      exit(EXIT_FAILURE);      return -1;}int CPXgetdblparam(CPXENV *env, int whichparam, double *value){     int k, errcode;      errcode = checkenv(env);      if (errcode) goto done;      k = finddblparam(whichparam);      if (k < 0)      {  errcode = error(env, CPXERR_BAD_PARAM_NUM);         goto done;      }      errcode = 0;      if (value != NULL)         *value = env->dblparam[k];done: return errcode;}int CPXgetdj(CPXENV *env, CPXLP *lp, double dj[], int begin, int end){     int j, n, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      n = glp_get_num_cols(lp->prob);      if (!(0 <= begin && begin <= end && end < n))      {  errcode = error(env, CPXERR_INDEX_RANGE);         goto done;      }      if (!lp->stat)      {  errcode = error(env, CPXERR_NO_SOLN);         goto done;      }      errcode = 0;      if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL)      {  if (dj != NULL)         {  for (j = begin; j <= end; j++)               dj[j-begin] = glp_get_col_dual(lp->prob, j+1);         }      }      else         xassert(lp != lp);done: return errcode;}char *CPXgeterrorstring(CPXENV *env, int errcode, char *buffer){     const char *string;      xassert(env == env);      string = finderrstring(errcode);      if (string == NULL)         buffer = NULL;      else         sprintf(buffer, "CPLEX Error %5d:  %s.\n", errcode, string);      return buffer;}int CPXgetijdiv(CPXENV *env, CPXLP *lp, int *idiv, int *jdiv){     xassert(env == env);      xassert(lp == lp);      xassert(idiv == idiv);      xassert(jdiv == jdiv);      printf("CPXgetijdiv: not implemented yet\n");      exit(EXIT_FAILURE);      return -1;}int CPXgetintparam(CPXENV *env, int whichparam, int *value){     int k, errcode;      errcode = checkenv(env);      if (errcode) goto done;      k = findintparam(whichparam);      if (k < 0)      {  errcode = error(env, CPXERR_BAD_PARAM_NUM);         goto done;      }      errcode = 0;      if (value != NULL)         *value = env->intparam[k];done: return errcode;}int CPXgetlb(CPXENV *env, CPXLP *lp, double lb[], int begin, int end){     xassert(env == env);      xassert(lp == lp);      xassert(lb == lb);      xassert(begin == begin);      xassert(end == end);      printf("CPXgetlb: not implemented yet\n");      exit(EXIT_FAILURE);      return -1;}int CPXgetmethod(CPXENV *env, CPXLP *lp){     int method;      if (checklp(env, lp))         method = CPX_ALG_NONE;      else         method = lp->meth;      return method;}int CPXgetnumcols(CPXENV *env, CPXLP *lp){     int numcols;      if (checklp(env, lp))         numcols = 0;      else         numcols = glp_get_num_cols(lp->prob);      return numcols;}int CPXgetnumnz(CPXENV *env, CPXLP *lp){     int numnz;      if (checklp(env, lp))         numnz = 0;      else         numnz = glp_get_num_nz(lp->prob);      return numnz;}int CPXgetnumrows(CPXENV *env, CPXLP *lp){     int numrows;      if (checklp(env, lp))         numrows = 0;      else         numrows = glp_get_num_rows(lp->prob);      return numrows;}int CPXgetobjval(CPXENV *env, CPXLP *lp, double *objval){     int errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      if (!lp->stat)      {  errcode = error(env, CPXERR_NO_SOLN);         goto done;      }      errcode = 0;      if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL)      {  if (objval != NULL)            *objval = glp_get_obj_val(lp->prob);      }      else         xassert(lp != lp);done: return errcode;}int CPXgetpi(CPXENV *env, CPXLP *lp, double pi[], int begin, int end){     int i, m, errcode;      errcode = checklp(env, lp);      if (errcode) goto done;      m = glp_get_num_rows(lp->prob);      if (!(0 <= begin && begin <= end && end < m))      {  errcode = error(env, CPXERR_INDEX_RANGE);         goto done;      }      if (!lp->stat)      {  errcode = error(env, CPXERR_NO_SOLN);         goto done;      }      errcode = 0;      if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL)      {  if (pi != NULL)         {  for (i = begin; i <= end; i++)               pi[i-begin] = glp_get_row_dual(lp->prob, i+1);         }      }      else         xassert(lp != lp);done: return errcode;}int CPXgetsense(CPXENV *env, CPXLP *lp, char sense[], int begin,      int end){     xassert(env == env);      xassert(lp == lp);      xassert(sense == sense);      xassert(begin == begin);      xassert(end == end);      printf("CPXgetsense: not implemented yet\n");      exit(EXIT_FAILURE);      return -1;}int CPXgetslack(CPXENV *env, CPXLP *lp, double slack[], int begin,      int end){     int i, m, type, errcode;      double temp;      errcode = checklp(env, lp);      if (errcode) goto done;      m = glp_get_num_rows(lp->prob);      if (!(0 <= begin && begin <= end && end < m))      {  errcode = error(env, CPXERR_INDEX_RANGE);         goto done;      }      if (!lp->stat)      {  errcode = error(env, CPXERR_NO_SOLN);         goto done;      }      errcode = 0;      if (lp->meth == CPX_ALG_PRIMAL || lp->meth == CPX_ALG_DUAL)      {  if (slack != NULL)         {  for (i = begin; i <= end; i++)            {  type = glp_get_row_type(lp->prob, i+1);               temp = glp_get_row_prim(lp->prob, i+1);               if (lp->rflag[i] == RF_NOT_RANGED)               {  if (type == GLP_LO || type == GLP_FX)                     slack[i-begin] =                        glp_get_row_lb(lp->prob, i+1) - temp;                  else if (type == GLP_UP)                     slack[i-begin] =                        glp_get_row_ub(lp->prob, i+1) - temp;                  else                     xassert(type != type);               }               else if (lp->rflag[i] == RF_RANGED_POS)               {  xassert(type == GLP_DB || type == GLP_FX);                  slack[i-begin] =                     temp - glp_get_row_lb(lp->prob, i+1);               }               else if (lp->rflag[i] == RF_RANGED_NEG)               {  xassert(type == GLP_DB);                  slack[i-begin] =                     temp - glp_get_row_ub(lp->prob, i+1);               }               else                  xassert(lp != lp);            }         }      }      else         xassert(lp != lp);done: return errcode;}int CPXgetstat(CPXENV *env, CPXLP *lp){     int stat;      if (checklp(env, lp))         stat = 0;      else         stat = lp->stat;      return stat;}int CPXgetub(CPXENV *env, CPXLP *lp, double ub[], int begin, int end){     xassert(env == env);      xassert(lp == lp);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -