亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? lap.cpp

?? Linear Assignment Problem solver for Matlab
?? CPP
字號(hào):
/* Linear Assignment Problem solver for Matlab

   Flow code from http://www.magiclogic.com/assignment.html, copyright
   Roy Jonker. Several files were compiled into one .cpp file. The
   copyright for the main file is reproduced below.

   Matlab adaptation was done with reference to
   http://cnx.org/content/m12348/latest/

   Fabian Wauthier -- 13.11.2006
*/

/************************************************************************
*
*  lap.cpp
   version 1.0 - 4 September 1996
   author: Roy Jonker @ MagicLogic Optimization Inc.
   
   main program file to run and check Jonker-Volgenant LAP code
*
*************************************************************************/

#include "mex.h" 

#include <stdlib.h>
#include <stdio.h>
#include <time.h>     // for seconds()

/*************** CONSTANTS  *******************/

  #define BIG 100000

/*************** TYPES      *******************/

typedef int row;
typedef int col;
typedef int cost;

/*************** FUNCTIONS  *******************/

extern int lap(int dim, int **assigncost,
               int *rowsol, int *colsol, int *u, int *v);

extern void checklap(int dim, int **assigncost,
                     int *rowsol, int *colsol, int *u, int *v);

#if !defined TRUE
#define	 TRUE		1
#endif
#if !defined FALSE
#define  FALSE		0
#endif

/*************** DATA TYPES *******************/

typedef int boolean;

/************************/

extern void seedRandom(unsigned int seed);

	      

extern double random_new(void);



extern double seconds();


void seedRandom(unsigned int seed)

// seed for random number generator.

{

  srand(seed);

  return;   

}

	      

double random_new(void)

// random number between 0.0 and 1.0 (uncluded).

{

  double rrr;

  

  rrr = (double) rand() / (double) RAND_MAX;

  return rrr;

}

 

double seconds()

// cpu time in seconds since start of run.
{

  double secs;

   

  secs = (double)(clock() / 1000.0);

  return(secs);

}


int lap(int dim, 
        cost **assigncost,
        col *rowsol, 
        row *colsol, 
        cost *u, 
        cost *v)

// input:
// dim        - problem size
// assigncost - cost matrix

// output:
// rowsol     - column assigned to row in solution
// colsol     - row assigned to column in solution
// u          - dual variables, row reduction numbers
// v          - dual variables, column reduction numbers

{
  boolean unassignedfound;
  row  i, imin, numfree = 0, prvnumfree, f, i0, k, freerow, *pred, *free;
  col  j, j1, j2, endofpath, last, low, up, *collist, *matches;
  cost min, h, umin, usubmin, v2, *d;

  free = new row[dim];       // list of unassigned rows.
  collist = new col[dim];    // list of columns to be scanned in various ways.
  matches = new col[dim];    // counts how many times a row could be assigned.
  d = new cost[dim];         // 'cost-distance' in augmenting path calculation.
  pred = new row[dim];       // row-predecessor of column in augmenting/alternating path.

  // init how many times a row will be assigned in the column reduction.
  for (i = 0; i < dim; i++)  
    matches[i] = 0;

  // COLUMN REDUCTION 
  for (j = dim-1; j >= 0; j--)    // reverse order gives better results.
  {
    // find minimum cost over rows.
    min = assigncost[0][j]; 
    imin = 0;
    for (i = 1; i < dim; i++)  
      if (assigncost[i][j] < min) 
      { 
        min = assigncost[i][j]; 
        imin = i;
      }
    v[j] = min; 

    if (++matches[imin] == 1) 
    { 
      // init assignment if minimum row assigned for first time.
      rowsol[imin] = j; 
      colsol[j] = imin; 
    }
    else
      colsol[j] = -1;        // row already assigned, column not assigned.
  }

  // REDUCTION TRANSFER
  for (i = 0; i < dim; i++) 
    if (matches[i] == 0)     // fill list of unassigned 'free' rows.
      free[numfree++] = i;
    else
      if (matches[i] == 1)   // transfer reduction from rows that are assigned once.
      {
        j1 = rowsol[i]; 
        min = BIG;
        for (j = 0; j < dim; j++)  
          if (j != j1)
            if (assigncost[i][j] - v[j] < min) 
              min = assigncost[i][j] - v[j];
        v[j1] = v[j1] - min;
      }

  // AUGMENTING ROW REDUCTION 
  int loopcnt = 0;           // do-loop to be done twice.
  do
  {
    loopcnt++;

    // scan all free rows.
    // in some cases, a free row may be replaced with another one to be scanned next.
    k = 0; 
    prvnumfree = numfree; 
    numfree = 0;             // start list of rows still free after augmenting row reduction.
    while (k < prvnumfree)
    {
      i = free[k]; 
      k++;

      // find minimum and second minimum reduced cost over columns.
      umin = assigncost[i][0] - v[0]; 
      j1 = 0; 
      usubmin = BIG;
      for (j = 1; j < dim; j++) 
      {
        h = assigncost[i][j] - v[j];
        if (h < usubmin)
          if (h >= umin) 
          { 
            usubmin = h; 
            j2 = j;
          }
          else 
          { 
            usubmin = umin; 
            umin = h; 
            j2 = j1; 
            j1 = j;
          }
      }

      i0 = colsol[j1];
      if (umin < usubmin) 
        // change the reduction of the minimum column to increase the minimum
        // reduced cost in the row to the subminimum.
        v[j1] = v[j1] - (usubmin - umin);
      else                   // minimum and subminimum equal.
        if (i0 >= 0)         // minimum column j1 is assigned.
        { 
          // swap columns j1 and j2, as j2 may be unassigned.
          j1 = j2; 
          i0 = colsol[j2];
        }

      // (re-)assign i to j1, possibly de-assigning an i0.
      rowsol[i] = j1; 
      colsol[j1] = i;

      if (i0 >= 0)           // minimum column j1 assigned earlier.
        if (umin < usubmin) 
          // put in current k, and go back to that k.
          // continue augmenting path i - j1 with i0.
          free[--k] = i0; 
        else 
          // no further augmenting reduction possible.
          // store i0 in list of free rows for next phase.
          free[numfree++] = i0; 
    }
  }
  while (loopcnt < 2);       // repeat once.

  // AUGMENT SOLUTION for each free row.
  for (f = 0; f < numfree; f++) 
  {
    freerow = free[f];       // start row of augmenting path.

    // Dijkstra shortest path algorithm.
    // runs until unassigned column added to shortest path tree.
    for (j = 0; j < dim; j++)  
    { 
      d[j] = assigncost[freerow][j] - v[j]; 
      pred[j] = freerow;
      collist[j] = j;        // init column list.
    }

    low = 0; // columns in 0..low-1 are ready, now none.
    up = 0;  // columns in low..up-1 are to be scanned for current minimum, now none.
             // columns in up..dim-1 are to be considered later to find new minimum, 
             // at this stage the list simply contains all columns 
    unassignedfound = FALSE;
    do
    {
      if (up == low)         // no more columns to be scanned for current minimum.
      {
        last = low - 1; 

        // scan columns for up..dim-1 to find all indices for which new minimum occurs.
        // store these indices between low..up-1 (increasing up). 
        min = d[collist[up++]]; 
        for (k = up; k < dim; k++) 
        {
          j = collist[k]; 
          h = d[j];
          if (h <= min)
          {
            if (h < min)     // new minimum.
            { 
              up = low;      // restart list at index low.
              min = h;
            }
            // new index with same minimum, put on undex up, and extend list.
            collist[k] = collist[up]; 
            collist[up++] = j; 
          }
        }

        // check if any of the minimum columns happens to be unassigned.
        // if so, we have an augmenting path right away.
        for (k = low; k < up; k++) 
          if (colsol[collist[k]] < 0) 
          {
            endofpath = collist[k];
            unassignedfound = TRUE;
            break;
          }
      }

      if (!unassignedfound) 
      {
        // update 'distances' between freerow and all unscanned columns, via next scanned column.
        j1 = collist[low]; 
        low++; 
        i = colsol[j1]; 
        h = assigncost[i][j1] - v[j1] - min;

        for (k = up; k < dim; k++) 
        {
          j = collist[k]; 
          v2 = assigncost[i][j] - v[j] - h;
          if (v2 < d[j])
          {
            pred[j] = i;
            if (v2 == min)   // new column found at same minimum value
              if (colsol[j] < 0) 
              {
                // if unassigned, shortest augmenting path is complete.
                endofpath = j;
                unassignedfound = TRUE;
                break;
              }
              // else add to list to be scanned right away.
              else 
              { 
                collist[k] = collist[up]; 
                collist[up++] = j; 
              }
            d[j] = v2;
          }
        }
      } 
    }
    while (!unassignedfound);

    // update column prices.
    for (k = 0; k <= last; k++)  
    { 
      j1 = collist[k]; 
      v[j1] = v[j1] + d[j1] - min;
    }

    // reset row and column assignments along the alternating path.
    do
    {
      i = pred[endofpath]; 
      colsol[endofpath] = i; 
      j1 = endofpath; 
      endofpath = rowsol[i]; 
      rowsol[i] = j1;
    }
    while (i != freerow);
  }

  // calculate optimal cost.
  cost lapcost = 0;
  for (i = 0; i < dim; i++)  
  {
    j = rowsol[i];
    u[i] = assigncost[i][j] - v[j];
    lapcost = lapcost + assigncost[i][j]; 
  }

  // free reserved memory.
  delete[] pred;
  delete[] free;
  delete[] collist;
  delete[] matches;
  delete[] d;

  return lapcost;
}

void checklap(int dim, cost **assigncost,
              col *rowsol, row *colsol, cost *u, cost *v)
{
  row  i;
  col  j;
  cost lapcost = 0, redcost = 0;
  boolean *matched;
  char wait;
  
  matched = new boolean[dim];
  
  for (i = 0; i < dim; i++)  
    for (j = 0; j < dim; j++)  
      if ((redcost = assigncost[i][j] - u[i] - v[j]) < 0)
      {
        printf("\n");
        printf("negative reduced cost i %d j %d redcost %d\n", i, j, redcost);
        printf("\n\ndim %5d - press key\n", dim);
        scanf("%d", &wait);
        break; 
      }

  for (i = 0; i < dim; i++)  
    if ((redcost = assigncost[i][rowsol[i]] - u[i] - v[rowsol[i]]) != 0)
    {
      printf("\n");
      printf("non-null reduced cost i %d soli %d redcost %d\n", i, rowsol[i], redcost);
      printf("\n\ndim %5d - press key\n", dim);
      scanf("%d", &wait);
      break; 
    }
  
  for (j = 0; j < dim; j++)  
    matched[j] = FALSE;
    
  for (i = 0; i < dim; i++)  
    if (matched[rowsol[i]])
    {
      printf("\n");
      printf("column matched more than once - i %d soli %d\n", i, rowsol[i]);
      printf("\n\ndim %5d - press key\n", dim);
      scanf("%d", &wait);
      break; 
    }
    else
      matched[rowsol[i]] = TRUE;
      
    
  for (i = 0; i < dim; i++)  
    if (colsol[rowsol[i]] != i)
    {
      printf("\n");
      printf("error in row solution i %d soli %d solsoli %d\n", i, rowsol[i], colsol[rowsol[i]]);
      printf("\n\ndim %5d - press key\n", dim);
      scanf("%d", &wait);
      break; 
    }

  for (j = 0; j < dim; j++)  
    if (rowsol[colsol[j]] != j)
    {
      printf("\n");
      printf("error in col solution j %d solj %d solsolj %d\n", j, colsol[j], rowsol[colsol[j]]);
      printf("\n\ndim %5d - press key\n", dim);
      scanf("%d", &wait);
      break; 
    }

  delete[] matched;
  return;
}



void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  #define COSTRANGE 1000.0
  #define PRINTCOST 0

  int dim, startdim, enddim;
  cost **assigncost, *u, *v, lapcost;
  row i, *colsol;
  col j, *rowsol;
  double runtime;

  mxArray *xCost;
  double *xValues;
  int rows, cols;

  double *outArray;

  /* Get matrix x */
  xValues = mxGetPr(prhs[0]);
  cols = mxGetN(prhs[0]);
  rows = mxGetM(prhs[0]);

  //  printf("Rows: %d, Cols %d\n", rows, cols);

  //  printf("start dimension ?\n");
  //  scanf("%d", &startdim);
  //  printf("end dimension ?\n");
  //  scanf("%d", &enddim);
  //  printf("\ndimensions %d .. %d\n", startdim, enddim);

  if(cols != rows) {
    printf("Error: Assignment matrix must be square!\n");
    return;
  }

  enddim = cols;
  startdim = 1;

  assigncost = new cost*[enddim];
  for (i = 0; i < enddim; i++)
    assigncost[i] = new cost[enddim];

  rowsol = new col[enddim];
  colsol = new row[enddim];
  u = new cost[enddim];
  v = new cost[enddim];
 
    dim = enddim;
   
    //  for (dim = startdim; dim <= enddim; dim++)
    //  {
    for (j = 0; j < dim; j++) {
      for (i = 0; i < dim; i++) {
	assigncost[i][j] = (cost) xValues[(i * rows) + j];
	  //	  assigncost[i][j] = (cost) (random_new() * (double) COSTRANGE);
      }
	//	printf("\n");
    }

#if (PRINTCOST) 
      for (i = 0; i < dim; i++)
	{
	  printf("\n");
	    for (j = 0; j < dim; j++)
	      printf("%4d ", assigncost[i][j]);
	      }
#endif
	
	
	//    printf("start\n");
    runtime = seconds();
    lapcost = lap(dim, assigncost, rowsol, colsol, u, v);
      //    runtime = seconds() - runtime;
      //    printf("dim  %4d - lap cost %5d - runtime %6.3f\n", dim, lapcost, runtime);
    checklap(dim, assigncost, rowsol, colsol, u, v);
      //  }

      plhs[0] = mxCreateDoubleMatrix(enddim, enddim, mxREAL);

  /* Get a pointer to the data space in our newly allocated memory */
      outArray = mxGetPr(plhs[0]);

    for(i = 0; i < enddim; i++) {
      //     printf("Row %d assigned to col %d\n", i, rowsol[i]);
       outArray[(i*enddim)+rowsol[i]] = 1;
       //       outArray[i] = rowsol[i];
    }

  delete[] assigncost;
  delete[] rowsol;
  delete[] colsol;
  delete[] u;
  delete[] v;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区久久| 国产一区二区免费在线| 亚洲综合小说图片| 亚洲日本护士毛茸茸| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产精品国模大尺度视频| 91麻豆精品国产| 欧美精品精品一区| 欧美日韩精品欧美日韩精品| 99re视频精品| 91女神在线视频| 在线观看中文字幕不卡| 欧美午夜寂寞影院| 欧美日韩国产天堂| 91精品啪在线观看国产60岁| 7777精品伊人久久久大香线蕉经典版下载| 欧美性猛片xxxx免费看久爱| 欧美日韩视频第一区| 欧美丝袜自拍制服另类| 5月丁香婷婷综合| 精品少妇一区二区三区在线视频| 欧美不卡激情三级在线观看| 久久精品亚洲麻豆av一区二区| 国产精品女人毛片| 亚洲精品va在线观看| 三级精品在线观看| 国产一区二区三区香蕉| 成人ar影院免费观看视频| 91久久一区二区| 91精品婷婷国产综合久久性色 | 精品久久久久av影院 | 欧美bbbbb| 国产一区在线精品| 99精品久久久久久| 欧美日韩国产小视频在线观看| 日韩美女在线视频| 中文字幕第一区综合| 一区二区三区日韩精品视频| 秋霞影院一区二区| 国产成人综合在线播放| 91黄视频在线| 欧美mv日韩mv亚洲| 亚洲日本va在线观看| 日韩av在线发布| 大尺度一区二区| 欧美丝袜自拍制服另类| 久久久久久黄色| 亚洲一区二区三区视频在线| 久国产精品韩国三级视频| 99久久精品情趣| 欧美一卡二卡在线| 成人欧美一区二区三区| 日产精品久久久久久久性色| 成人国产精品免费观看动漫| 欧美日韩三级一区| 国产精品久久久久永久免费观看| 视频一区在线播放| 国产凹凸在线观看一区二区| 337p亚洲精品色噜噜| 国产精品女主播在线观看| 视频在线观看一区| 97国产一区二区| 久久久综合网站| 午夜精品福利一区二区三区av | 亚洲一区二区在线视频| 极品少妇xxxx精品少妇| 日本韩国欧美三级| 欧美国产97人人爽人人喊| 9i看片成人免费高清| 91精品国产黑色紧身裤美女| 综合久久国产九一剧情麻豆| 国模少妇一区二区三区| 欧美日韩精品欧美日韩精品一 | 欧美日韩成人综合天天影院| 国产精品女同互慰在线看| 奇米影视7777精品一区二区| 在线免费观看日本欧美| 一区二区日韩av| 国产精品1024| 日韩情涩欧美日韩视频| 亚洲成人黄色影院| 91色视频在线| 国产亲近乱来精品视频| 久久精品国产亚洲aⅴ| 欧美二区乱c少妇| 亚洲一区二区三区四区在线免费观看 | 制服丝袜中文字幕亚洲| 亚洲欧美偷拍三级| 成人综合在线网站| 日韩精品最新网址| 日韩专区中文字幕一区二区| 欧美日韩综合一区| 亚洲综合色网站| 色婷婷久久综合| 日韩理论片在线| 99久久免费精品| 亚洲精品视频在线| 色综合天天综合狠狠| 综合av第一页| 99国内精品久久| 亚洲少妇最新在线视频| 99精品欧美一区二区蜜桃免费| 国产精品欧美一区喷水| 日韩高清不卡在线| 国产无人区一区二区三区| 亚洲精品ww久久久久久p站| 国产suv精品一区二区883| 久久综合国产精品| 国产乱子轮精品视频| 国产亚洲美州欧州综合国| 国产v日产∨综合v精品视频| 久久精品视频一区| 国产成人精品免费在线| 国产精品人成在线观看免费 | 国产成人一区二区精品非洲| 久久在线免费观看| 国产盗摄精品一区二区三区在线| 国产蜜臀av在线一区二区三区| 高清成人在线观看| 亚洲你懂的在线视频| 欧美性大战久久久久久久蜜臀| 性做久久久久久久久| 6080日韩午夜伦伦午夜伦| 久久99精品国产麻豆婷婷| 久久久国产午夜精品| 成人18精品视频| 亚洲精品国久久99热| 欧美日韩一区 二区 三区 久久精品| 香蕉久久夜色精品国产使用方法 | 国产成人在线影院| 亚洲图片另类小说| 欧美日本在线播放| 精品一区中文字幕| 国产精品日韩成人| 欧美日韩精品专区| 激情伊人五月天久久综合| 国产精品免费av| 欧美日韩亚州综合| 韩国视频一区二区| 亚洲欧美偷拍三级| 日韩欧美美女一区二区三区| 国产不卡在线一区| 亚洲资源在线观看| 久久综合色婷婷| 色欧美日韩亚洲| 激情综合网最新| 亚洲欧美国产三级| 欧美va亚洲va国产综合| 波多野结衣中文字幕一区 | 欧美日韩视频第一区| 国产中文一区二区三区| 玉足女爽爽91| 欧美www视频| 欧洲一区二区av| 国产乱码一区二区三区| 亚洲最新在线观看| 久久精品亚洲一区二区三区浴池| 色综合久久中文字幕| 国产一区二区三区| 午夜久久久久久久久| 国产精品美女一区二区| 欧美一区二区三区四区视频| youjizz久久| 久久电影国产免费久久电影| 亚洲色图制服丝袜| 26uuu精品一区二区三区四区在线| 91国偷自产一区二区三区成为亚洲经典 | 色综合一区二区| 久久精品噜噜噜成人av农村| 亚洲区小说区图片区qvod| 精品久久一区二区三区| 91亚洲精品一区二区乱码| 精品夜夜嗨av一区二区三区| 一区二区高清免费观看影视大全| 久久综合狠狠综合| 欧美日本国产视频| av中文字幕不卡| 国产麻豆精品95视频| 视频一区在线播放| 亚洲精品ww久久久久久p站| 欧美高清在线视频| 欧美变态tickling挠脚心| 欧美色综合网站| 99久久精品99国产精品| 国产成人精品免费在线| 久久69国产一区二区蜜臀| 亚洲高清在线精品| 亚洲裸体在线观看| 中文字幕欧美国产| 精品成人a区在线观看| 欧美精品丝袜中出| 日本高清不卡视频| 91在线视频在线| 成人午夜av在线| 岛国精品在线播放| 国产一区三区三区| 国产在线乱码一区二区三区| 青青草国产精品亚洲专区无| 婷婷夜色潮精品综合在线| 亚洲国产婷婷综合在线精品|