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

📄 glptsp.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 2 页
字号:
         else if (strcmp(dsa->token, "LOWER_DIAG_ROW") == 0)            tsp->edge_weight_format = TSP_LOWER_DIAG_ROW;         else         {  xprintf("%s:%d: edge weight format `%s' not recognized\n",               dsa->fname, dsa->seqn, dsa->token);            goto fail;         }         xprintf("tsp_read_data: EDGE_WEIGHT_FORMAT: %s\n", dsa->token);         if (check_newline(dsa)) goto fail;      }      else if (strcmp(dsa->token, "DISPLAY_DATA_TYPE") == 0)      {  if (tsp->display_data_type != TSP_UNDEF)         {  xprintf("%s:%d: DISPLAY_DATA_TYPE entry multiply defined\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (check_colon(dsa)) goto fail;         if (scan_keyword(dsa)) goto fail;         if (strcmp(dsa->token, "COORD_DISPLAY") == 0)            tsp->display_data_type = TSP_COORD_DISPLAY;         else if (strcmp(dsa->token, "TWOD_DISPLAY") == 0)            tsp->display_data_type = TSP_TWOD_DISPLAY;         else         {  xprintf("%s:%d: display data type `%s' not recognized\n",               dsa->fname, dsa->seqn, dsa->token);            goto fail;         }         xprintf("tsp_read_data: DISPLAY_DATA_TYPE: %s\n", dsa->token);         if (check_newline(dsa)) goto fail;      }      else if (strcmp(dsa->token, "NODE_COORD_SECTION") == 0)      {  int n = tsp->dimension, k, node;         if (n == 0)         {  xprintf("%s:%d: DIMENSION entry not specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (tsp->node_x_coord != NULL)         {  xprintf("%s:%d: NODE_COORD_SECTION multiply specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (check_newline(dsa)) goto fail;         tsp->node_x_coord = xcalloc(1+n, sizeof(double));         tsp->node_y_coord = xcalloc(1+n, sizeof(double));         for (node = 1; node <= n; node++)            tsp->node_x_coord[node] = tsp->node_y_coord[node] = DBL_MAX;         for (k = 1; k <= n; k++)         {  if (scan_integer(dsa, 0, &node)) goto fail;            if (!(1 <= node && node <= n))            {  xprintf("%s:%d: invalid node number %d\n", dsa->fname,                  dsa->seqn, node);               goto fail;            }            if (tsp->node_x_coord[node] != DBL_MAX)            {  xprintf("%s:%d: node number %d multiply specified\n",                  dsa->fname, dsa->seqn, node);               goto fail;            }            if (scan_number(dsa, 0, &tsp->node_x_coord[node]))               goto fail;            if (scan_number(dsa, 0, &tsp->node_y_coord[node]))               goto fail;            if (check_newline(dsa)) goto fail;         }      }      else if (strcmp(dsa->token, "DISPLAY_DATA_SECTION") == 0)      {  int n = tsp->dimension, k, node;         if (n == 0)         {  xprintf("%s:%d: DIMENSION entry not specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (tsp->dply_x_coord != NULL)         {  xprintf("%s:%d: DISPLAY_DATA_SECTION multiply specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (check_newline(dsa)) goto fail;         tsp->dply_x_coord = xcalloc(1+n, sizeof(double));         tsp->dply_y_coord = xcalloc(1+n, sizeof(double));         for (node = 1; node <= n; node++)            tsp->dply_x_coord[node] = tsp->dply_y_coord[node] = DBL_MAX;         for (k = 1; k <= n; k++)         {  if (scan_integer(dsa, 0, &node)) goto fail;            if (!(1 <= node && node <= n))            {  xprintf("%s:%d: invalid node number %d\n", dsa->fname,                  dsa->seqn, node);               goto fail;            }            if (tsp->dply_x_coord[node] != DBL_MAX)            {  xprintf("%s:%d: node number %d multiply specified\n",                  dsa->fname, dsa->seqn, node);               goto fail;            }            if (scan_number(dsa, 0, &tsp->dply_x_coord[node]))               goto fail;            if (scan_number(dsa, 0, &tsp->dply_y_coord[node]))               goto fail;            if (check_newline(dsa)) goto fail;         }      }      else if (strcmp(dsa->token, "TOUR_SECTION") == 0)      {  int n = tsp->dimension, k, node;         if (n == 0)         {  xprintf("%s:%d: DIMENSION entry not specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (tsp->tour != NULL)         {  xprintf("%s:%d: TOUR_SECTION multiply specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (check_newline(dsa)) goto fail;         tsp->tour = xcalloc(1+n, sizeof(int));         for (k = 1; k <= n; k++)         {  if (scan_integer(dsa, 1, &node)) goto fail;            if (!(1 <= node && node <= n))            {  xprintf("%s:%d: invalid node number %d\n", dsa->fname,                  dsa->seqn, node);               goto fail;            }            tsp->tour[k] = node;         }         if (scan_integer(dsa, 1, &node)) goto fail;         if (node != -1)         {  xprintf("%s:%d: extra node(s) detected\n", dsa->fname,               dsa->seqn);            goto fail;         }         if (check_newline(dsa)) goto fail;      }      else if (strcmp(dsa->token, "EDGE_WEIGHT_SECTION") == 0)      {  int n = tsp->dimension, i, j, temp;         if (n == 0)         {  xprintf("%s:%d: DIMENSION entry not specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (tsp->edge_weight_format == TSP_UNDEF)         {  xprintf("%s:%d: EDGE_WEIGHT_FORMAT entry not specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (tsp->edge_weight != NULL)         {  xprintf("%s:%d: EDGE_WEIGHT_SECTION multiply specified\n",               dsa->fname, dsa->seqn);            goto fail;         }         if (check_newline(dsa)) goto fail;         tsp->edge_weight = xcalloc(1+n*n, sizeof(int));         switch (tsp->edge_weight_format)         {  case TSP_FULL_MATRIX:               for (i = 1; i <= n; i++)               {  for (j = 1; j <= n; j++)                  {  if (scan_integer(dsa, 1, &temp)) goto fail;                     tsp->edge_weight[(i - 1) * n + j] = temp;                  }               }               break;            case TSP_UPPER_ROW:               for (i = 1; i <= n; i++)               {  tsp->edge_weight[(i - 1) * n + i] = 0;                  for (j = i + 1; j <= n; j++)                  {  if (scan_integer(dsa, 1, &temp)) goto fail;                     tsp->edge_weight[(i - 1) * n + j] = temp;                     tsp->edge_weight[(j - 1) * n + i] = temp;                  }               }               break;            case TSP_LOWER_DIAG_ROW:               for (i = 1; i <= n; i++)               {  for (j = 1; j <= i; j++)                  {  if (scan_integer(dsa, 1, &temp)) goto fail;                     tsp->edge_weight[(i - 1) * n + j] = temp;                     tsp->edge_weight[(j - 1) * n + i] = temp;                  }               }               break;            default:               goto fail;         }         if (check_newline(dsa)) goto fail;      }      else if (strcmp(dsa->token, "EOF") == 0)      {  if (check_newline(dsa)) goto fail;         goto done;      }      else      {  xprintf("%s:%d: keyword `%s' not recognized\n", dsa->fname,            dsa->seqn, dsa->token);         goto fail;      }      goto loop;done: xprintf("tsp_read_data: %d lines were read\n", dsa->seqn-1);      fclose(dsa->fp);      return tsp;fail: if (tsp != NULL)      {  if (tsp->name != NULL) xfree(tsp->name);         if (tsp->comment != NULL) xfree(tsp->comment);         if (tsp->node_x_coord != NULL) xfree(tsp->node_x_coord);         if (tsp->node_y_coord != NULL) xfree(tsp->node_y_coord);         if (tsp->dply_x_coord != NULL) xfree(tsp->dply_x_coord);         if (tsp->dply_y_coord != NULL) xfree(tsp->dply_y_coord);         if (tsp->tour != NULL) xfree(tsp->tour);         if (tsp->edge_weight != NULL) xfree(tsp->edge_weight);         xfree(tsp);      }      if (dsa->fp != NULL) fclose(dsa->fp);      return NULL;}/*------------------------------------------------------------------------ tsp_free_data - free TSP instance data.---- *Synopsis*---- #include "glptsp.h"-- void tsp_free_data(TSP *tsp);---- *Description*---- The routine tsp_free_data frees all the memory allocated to the TSP-- instance data block, which the parameter tsp points to. */void tsp_free_data(TSP *tsp){     if (tsp->name != NULL) xfree(tsp->name);      if (tsp->comment != NULL) xfree(tsp->comment);      if (tsp->node_x_coord != NULL) xfree(tsp->node_x_coord);      if (tsp->node_y_coord != NULL) xfree(tsp->node_y_coord);      if (tsp->dply_x_coord != NULL) xfree(tsp->dply_x_coord);      if (tsp->dply_y_coord != NULL) xfree(tsp->dply_y_coord);      if (tsp->tour != NULL) xfree(tsp->tour);      if (tsp->edge_weight != NULL) xfree(tsp->edge_weight);      xfree(tsp);      return;}/*------------------------------------------------------------------------ tsp_distance - compute distance between two nodes.---- *Synopsis*---- #include "glptsp.h"-- int tsp_distance(TSP *tsp, int i, int j);---- *Description*---- The routine tsp_distance computes the distance between i-th and j-th-- nodes for the TSP instance, which tsp points to.---- *Returns*---- The routine tsp_distance returns the computed distance. */#define nint(x) ((int)((x) + 0.5))static double rad(double x){     /* convert input coordinate to longitude/latitude, in radians */      double pi = 3.141592, deg, min;      deg = (int)x;      min = x - deg;      return pi * (deg + 5.0 * min / 3.0) / 180.0;}int tsp_distance(TSP *tsp, int i, int j){     int n = tsp->dimension, dij;      if (!(tsp->type == TSP_TSP || tsp->type == TSP_ATSP))         xfault("tsp_distance: invalid TSP instance\n");      if (!(1 <= i && i <= n && 1 <= j && j <= n))         xfault("tsp_distance: node number out of range\n");      switch (tsp->edge_weight_type)      {  case TSP_UNDEF:            xfault("tsp_distance: edge weight type not specified\n");         case TSP_EXPLICIT:            if (tsp->edge_weight == NULL)               xfault("tsp_distance: edge weights not specified\n");            dij = tsp->edge_weight[(i - 1) * n + j];            break;         case TSP_EUC_2D:            if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL)               xfault("tsp_distance: node coordinates not specified\n");            {  double xd, yd;               xd = tsp->node_x_coord[i] - tsp->node_x_coord[j];               yd = tsp->node_y_coord[i] - tsp->node_y_coord[j];               dij = nint(sqrt(xd * xd + yd * yd));            }            break;         case TSP_CEIL_2D:            if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL)               xfault("tsp_distance: node coordinates not specified\n");            {  double xd, yd;               xd = tsp->node_x_coord[i] - tsp->node_x_coord[j];               yd = tsp->node_y_coord[i] - tsp->node_y_coord[j];               dij = (int)ceil(sqrt(xd * xd + yd * yd));            }            break;         case TSP_GEO:            if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL)               xfault("tsp_distance: node coordinates not specified\n");            {  double rrr = 6378.388;               double latitude_i = rad(tsp->node_x_coord[i]);               double latitude_j = rad(tsp->node_x_coord[j]);               double longitude_i = rad(tsp->node_y_coord[i]);               double longitude_j = rad(tsp->node_y_coord[j]);               double q1 = cos(longitude_i - longitude_j);               double q2 = cos(latitude_i - latitude_j);               double q3 = cos(latitude_i + latitude_j);               dij = (int)(rrr * acos(0.5 * ((1.0 + q1) * q2 -                  (1.0 - q1) *q3)) + 1.0);            }            break;         case TSP_ATT:            if (tsp->node_x_coord == NULL || tsp->node_y_coord == NULL)               xfault("tsp_distance: node coordinates not specified\n");            {  int tij;               double xd, yd, rij;               xd = tsp->node_x_coord[i] - tsp->node_x_coord[j];               yd = tsp->node_y_coord[i] - tsp->node_y_coord[j];               rij = sqrt((xd * xd + yd * yd) / 10.0);               tij = nint(rij);               if (tij < rij) dij = tij + 1; else dij = tij;            }            break;         default:            xassert(tsp->edge_weight_type != tsp->edge_weight_type);      }      return dij;}/* eof */

⌨️ 快捷键说明

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