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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? a.c

?? 貨郎擔問題源代碼 貨郎擔問題源代碼
?? C
字號:
/*
 * File: tsp.c
 * Description: 求解貨郎擔問題的分枝限界算法
 *              Branch-and-bound algorithm to solve
 *                  the travelling salesman problem.
 * Created: 2001/11/29
 * Author: Justin Hou [mailto:justin_hou@hotmail.com]
 *         C.S.Department of Tongji University
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define TRUE (1)
#define FALSE (0)

#define MAX_CITIES (10)
#define INFINITY  (999)
#define I INFINITY

typedef int bool;

/* 定義邊結構 */
typedef struct _EDGE {
	int head;
	int tail;
} EDGE;

/* 定義路徑結構 */
typedef struct _PATH {
	EDGE edge[MAX_CITIES];
	int  edgesNumber;
} PATH;

/* 定義花費矩陣結構 */
typedef struct _MATRIX {
	int distance[MAX_CITIES][MAX_CITIES];
	int citiesNumber;
} MATRIX;

/* 定義樹結點 */
typedef struct _NODE {
	int bound;	/* 相應于本結點的花費下界 */
	MATRIX matrix;	/* 當前花費矩陣 */
	PATH path;	/* 已經選定的邊 */
	struct _NODE* left;	/* 左枝 */
	struct _NODE* right;	/* 右枝 */
} NODE;

int Simplify(MATRIX*);
EDGE SelectBestEdge(MATRIX);
MATRIX LeftNode(MATRIX, EDGE);
MATRIX RightNode(MATRIX, EDGE, PATH);
PATH AddEdge(EDGE, PATH);
PATH BABA(NODE);
PATH MendPath(PATH, MATRIX);
int MatrixSize(MATRIX, PATH);
void ShowMatrix(MATRIX);
void ShowPath(PATH, MATRIX);

main()
{
	PATH path;
	NODE root = {
		0, /* 花費下界 */
		{{{I, 1, 2, 7, 5}, /* 花費矩陣 */
		  {1, I, 4, 4, 3},
		  {2, 4, I, 1, 2},
		  {7, 4, 1, I, 3},
		  {5, 3, 2, 3, I}}, 5}, /* 城市數目 */
		{{0}, 0}, /* 經歷過的路徑 */
		NULL, NULL /* 左枝與右枝 */
	};

	/* 歸約,建立根結點 */
	root.bound += Simplify(&root.matrix);
	/* 進入搜索循環 */
	path = BABA(root);
	ShowPath(path, root.matrix);
return 0;
}

/*
 * 算法主搜索函數,Branch-And-Bound Algorithm Search
 *             root 是當前的根結點,已歸約,數據完善
 */
PATH BABA(NODE root)
{
	int i;
	static int minDist = INFINITY;
	static PATH minPath;
	EDGE selectedEdge;
	NODE *left, *right;

	puts("Current Root:\n------------");
	ShowMatrix(root.matrix);
	printf("Root Bound:%d\n", root.bound);

	/* 如果當前矩陣大小為2,說明還有兩條邊沒有選,而這兩條邊必定只能有一種組合,
	 * 才能構成整體回路,所以事實上所有路線已經確定。
	 */
	if (MatrixSize(root.matrix, root.path) == 2) {
		if (root.bound < minDist) {
			minDist = root.bound;
			minPath = MendPath(root.path, root.matrix);
			getch();
			return (minPath);
		}
	}
	/* 根據左下界盡量大的原則選分枝邊 */
	selectedEdge = SelectBestEdge(root.matrix);
	printf("Selected Edge:(%d, %d)\n", selectedEdge.head + 1, selectedEdge.tail + 1);

	/* 建立左右分枝結點 */
	left = (NODE *)malloc(sizeof(NODE));
	right = (NODE *)malloc(sizeof(NODE));
	if (left == NULL || right == NULL) {
		fprintf(stderr,"Error malloc.\n");
		exit(-1);
	}
	/* 初始化左右分枝結點 */
	left->bound = root.bound; /* 繼承父結點的下界 */
	left->matrix = LeftNode(root.matrix, selectedEdge); /* 刪掉分枝邊 */
	left->path = root.path; /* 繼承父結點的路徑,沒有增加新邊 */
	left->left = NULL;
	left->right = NULL;

	right->bound = 	root.bound;
	right->matrix = RightNode(root.matrix, selectedEdge, root.path);/* 刪除行列和回路邊 */
	right->path = AddEdge(selectedEdge, root.path); /* 加入所選邊 */
	right->left = NULL;
	right->right = NULL;

	/* 歸約左右分枝結點 */
	left->bound += Simplify(&left->matrix);
	right->bound += Simplify(&right->matrix);

	/* 鏈接到根 */
	root.left = left;
	root.right = right;

	/* 顯示到監視器 */
	puts("Right Branch:\n------------");
	ShowMatrix(right->matrix);
	puts("Left Branch:\n-----------");
	ShowMatrix(left->matrix);

	/* 如果右結點下界小于當前最佳答案,繼續分枝搜索 */
	if (right->bound < minDist) {
		BABA(*right);
	}
	/* 否則不搜索,因為這條枝已經不可能產生更佳路線 */
	else {
		printf("Current minDist is %d, ", minDist);
		printf("Right Branch's Bound(= %d).\n", right->bound);
		printf("This branch is dead.\n");
	}

	/* 如果右結點下界小于當前最佳答案,繼續分枝搜索 */
	if (left->bound < minDist) {
		BABA(*left);
	}
	/* 否則不搜索,因為這條枝已經不可能產生更佳路線 */
	else {
		printf("Current minDist is %d, ", minDist);
		printf("Left Branch's Bound(= %d).\n", left->bound);
		printf("This branch is dead.\n");
	}

	printf("The best answer now is %d\n", minDist);
	return (minPath);
}

/* 修補路徑 */
PATH MendPath(PATH path, MATRIX c)
{
	int row, col;
	EDGE edge;
	int n = c.citiesNumber;

	for (row = 0; row < n; row++) {
		edge.head = row;
		for (col = 0; col < n; col++) {
			edge.tail = col;
			if (c.distance[row][col] == 0) {
				path = AddEdge(edge, path);
			}
		}
	}
	return path;

}

/* 歸約費用矩陣,返回費用矩陣的歸約常數 */
int Simplify(MATRIX* c)
{
	int row, col, min_dist, h;
	int n = c->citiesNumber;

	h = 0;
	/* 行歸約 */
	for (row = 0; row < n; row++) {
		/* 找出本行最小的元素 */
		min_dist = INFINITY;
		for (col = 0; col < n; col++) {
			if (c->distance[row][col] < min_dist) {
				min_dist = c->distance[row][col];
			}
		}
		/* 如果本行元素都是無窮,說明本行已經被刪除 */
		if (min_dist == INFINITY) continue;
		/* 本行每元素減去最小元素 */
		for (col = 0; col < n; col++) {
			if (c->distance[row][col] != INFINITY) {
				c->distance[row][col] -= min_dist;
			}
		}
		/* 計算歸約常數 */
		h += min_dist;
	}

	/* 列歸約 */
	for (col = 0; col < n; col++) {
		/* 找出本列最小的元素 */
		min_dist = INFINITY;
		for (row = 0; row < n; row++) {
			if (c->distance[row][col] < min_dist) {
				min_dist = c->distance[row][col];
			}
		}
		/* 如果本列元素都是無窮,說明本列已經被刪除 */
		if (min_dist == INFINITY) continue;
		/* 本列元素減去最小元素 */
		for (row = 0; row < n; row++) {
			if (c->distance[row][col] != INFINITY) {
				c->distance[row][col] -= min_dist;
			}
		}
		/* 計算歸約常數 */
		h += min_dist;
	}
	return (h);
}

/* 搜索所有花費為零的邊中最合適的,使左枝下界更大 */
EDGE SelectBestEdge(MATRIX c)
{
	int row, col;
	int n = c.citiesNumber;
	int maxD;
	EDGE best, edge;

	/* 所用函數聲明 */
	int D(MATRIX, EDGE);

	maxD = 0;
	for (row = 0; row < n; row++) {
		for (col = 0; col < n; col++) {
			edge.head = row;
			edge.tail = col;
			if (!c.distance[row][col] && maxD < D(c, edge)) {
				maxD = D(c, edge);
				best = edge;
			}
		}
	}
	return (best);
}

/* 計算如果選 edge 作為分枝邊,左枝(不含 edge)下界的增量 */
int D(MATRIX c, EDGE edge)
{
	int row, col, dRow, dCol;
	int n = c.citiesNumber;

	dRow = INFINITY;
	for (col = 0; col < n; col++) {
		if (dRow < c.distance[edge.head][col] && col != edge.tail) {
			dRow = c.distance[edge.head][col];
		}
	}
	dCol = INFINITY;
	for (row = 0; row < n; row++) {
		if (dCol < c.distance[row][edge.tail] && row != edge.head) {
			dCol = c.distance[row][edge.tail];
		}
	}
	return (dRow + dCol);
}

/* 刪掉所選分枝邊 */
MATRIX LeftNode(MATRIX c, EDGE edge)
{
	c.distance[edge.head][edge.tail] = INFINITY;
	return c;
}

/* 刪除行列和回路邊后的矩陣 */
MATRIX	RightNode(MATRIX c, EDGE edge, PATH path)
{
	int row, col;
	int n = c.citiesNumber;
	EDGE loopEdge;

	/* 聲明所需要的求回路邊函數 */
	EDGE LoopEdge(PATH, EDGE);

	for (col = 0; col < n; col++)
		c.distance[edge.head][col] = INFINITY;
	for (row = 0; row < n; row++)
		c.distance[row][edge.tail] = INFINITY;

	loopEdge = LoopEdge(path, edge);
	c.distance[loopEdge.head][loopEdge.tail] = INFINITY;

	return (c);
}

/* 計算回路邊的函數
 * 除了加入的新邊, 當前結點路線集合中還可能包含一些已經選定的邊, 這些邊構成一條或
 * 幾條路徑, 為了不構成回路, 必須使其中包含新邊的路徑頭尾不能相連,本函數返回這個
 * 頭尾相連的邊,以便把這個回路邊的長度設成無窮。
 */
EDGE LoopEdge(PATH path, EDGE edge)
{
	int i, j;
	EDGE loopEdge;

	/* 最小的回路邊 */
	loopEdge.head = edge.tail;
	loopEdge.tail = edge.head;

	/* 尋找回路邊的頭端點,即包含新邊的路徑的尾端點 */
	for (i = 0; i < path.edgesNumber; i++) {
		for (j = 0; j < path.edgesNumber; j++) {
			if (loopEdge.head == path.edge[j].head) {
				/* 擴大回路邊 */
				loopEdge.head = path.edge[j].tail;
				break;
			}
		}
	}
	/* 尋找回路邊的尾端點,即包含新邊的路徑的頭端點 */
	for (i = 0; i < path.edgesNumber; i++) {
		for (j = 0; j < path.edgesNumber; j++) {
			if (loopEdge.tail == path.edge[j].tail) {
				/* 擴大回路邊 */
				loopEdge.tail = path.edge[j].head;
				break;
			}
		}
	}

	return (loopEdge);
}

/* 將新邊加入到路徑中 */
PATH AddEdge(EDGE edge, PATH path)
{
	path.edge[path.edgesNumber++] = edge;
	return path;
}


/* 計算花費矩陣當前階數 */
int MatrixSize(MATRIX c, PATH path)
{
	return (c.citiesNumber - path.edgesNumber);
}

/* 顯示路徑 */
void ShowPath(PATH path, MATRIX c)
{
	int i, dist;
	EDGE edge;
	int n = path.edgesNumber;

	dist = 0;
	printf("\nThe path is: ");
	for (i = 0; i < n; i++) {
		edge = path.edge[i];
		printf("(%d, %d) ", edge.head + 1, edge.tail + 1);
		dist += c.distance[edge.head][edge.tail];
	}
	/* printf("[Total Cost: %d]\n", dist); */
}

/* 顯示花費矩陣 */
void ShowMatrix(MATRIX c)
{
	int row, col;
	int n =  c.citiesNumber;

	for (row = 0; row < n; row++) {
		for (col = 0; col < n; col++) {
			if (c.distance[row][col] != INFINITY) {
				printf("%3d", c.distance[row][col]);
			}
			else {
				printf("  -");
			}
		}
		putchar('\n');
	}
	getch();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区导航在线播放| 久久99日本精品| 欧美一级艳片视频免费观看| 国产精品456| 亚洲最色的网站| 精品国产精品网麻豆系列 | 亚洲国产sm捆绑调教视频| 欧美大片一区二区三区| 91福利国产成人精品照片| 国产精品一区二区在线播放| 婷婷综合另类小说色区| 日韩毛片在线免费观看| 精品国产一区a| 91精品国产一区二区| 91视频观看免费| 国产福利一区二区三区在线视频| 亚洲一区二区三区四区五区中文| 国产农村妇女毛片精品久久麻豆| 欧美一区二区三区公司| 91官网在线观看| www.99精品| 国产高清精品网站| 久久国产成人午夜av影院| 亚洲成人精品在线观看| 最新国产精品久久精品| 久久精品无码一区二区三区| 日韩欧美三级在线| 91精品国产综合久久蜜臀| 欧美探花视频资源| 欧洲av在线精品| 在线一区二区视频| 在线精品视频一区二区三四| 91视频你懂的| 91丝袜美腿高跟国产极品老师 | 国产在线精品免费| 日本欧美一区二区三区| 日日噜噜夜夜狠狠视频欧美人 | 美国毛片一区二区| 五月天国产精品| 日韩高清一级片| 日韩高清不卡一区| 日韩精品一级二级| 日本欧美韩国一区三区| 蜜臀av性久久久久蜜臀av麻豆| 日韩成人午夜精品| 免费不卡在线视频| 久99久精品视频免费观看| 久久99精品国产.久久久久久| 久久精品国产免费| 韩国成人在线视频| 国产999精品久久久久久绿帽| 国产福利91精品| 波多野结衣中文一区| av一区二区不卡| 在线一区二区三区四区五区| 欧洲生活片亚洲生活在线观看| 欧洲精品在线观看| 5月丁香婷婷综合| 欧美成人欧美edvon| 国产精品欧美经典| 一区二区三区四区不卡视频| 亚洲成人先锋电影| 精品综合免费视频观看| 高清不卡一区二区| 在线观看区一区二| 日韩一区二区三区电影在线观看 | 欧洲国产伦久久久久久久| 欧美日韩久久不卡| 精品999久久久| 国产精品久久久久久久久晋中 | www.爱久久.com| 欧美吻胸吃奶大尺度电影| 91精品国产91久久综合桃花 | 性感美女极品91精品| 蜜桃传媒麻豆第一区在线观看| 国产一区二区精品久久| 91浏览器入口在线观看| 欧美一级欧美一级在线播放| 国产日产欧美精品一区二区三区| 亚洲综合视频在线| 激情六月婷婷久久| 欧美在线影院一区二区| 欧美电影免费观看高清完整版在线| 国产精品素人视频| 无吗不卡中文字幕| 成人av在线网| 欧美高清视频在线高清观看mv色露露十八| 日韩一区二区三区三四区视频在线观看| 国产欧美一区二区精品婷婷| 午夜在线电影亚洲一区| 成人毛片在线观看| 欧美一区二区三区色| 日本一区二区三区高清不卡| 亚洲一区二区三区小说| 成人涩涩免费视频| 日韩一区国产二区欧美三区| 亚洲黄一区二区三区| 国产乱子轮精品视频| 欧美日韩国产免费一区二区 | 日本一道高清亚洲日美韩| 国产成人日日夜夜| 欧美二区三区91| 亚洲黄色性网站| 高清不卡一区二区在线| 日韩欧美美女一区二区三区| 亚洲黄色在线视频| 成人午夜视频网站| 精品国产伦一区二区三区观看方式 | 欧美精三区欧美精三区| 中文无字幕一区二区三区| 日本亚洲天堂网| 色噜噜狠狠成人中文综合 | 亚洲天堂网中文字| 国产一区二区三区香蕉| 9191久久久久久久久久久| 一区二区三区四区国产精品| 不卡电影免费在线播放一区| 久久久久国产成人精品亚洲午夜| 日韩精品视频网| 欧美日韩综合在线免费观看| 国产精品成人免费| 国产精品影视网| 2020国产精品自拍| 美女在线视频一区| 91精品国产综合久久久久久 | 26uuu亚洲综合色欧美| 婷婷久久综合九色国产成人| 欧美视频一区在线观看| 亚洲乱码日产精品bd| 99精品桃花视频在线观看| 国产人成一区二区三区影院| 精品系列免费在线观看| 日韩精品一区二区三区视频播放| 日本在线不卡一区| 日韩亚洲欧美一区| 日本特黄久久久高潮| 在线电影院国产精品| 日日摸夜夜添夜夜添亚洲女人| 欧美日韩综合在线免费观看| 亚洲一级二级在线| 欧美日韩成人高清| 奇米影视在线99精品| 精品日韩一区二区三区免费视频| 精品一区二区三区av| 久久久噜噜噜久久中文字幕色伊伊 | 国产成人在线视频网址| 久久久久国产精品人| 成人黄色综合网站| 亚洲视频你懂的| 日本高清不卡视频| 亚洲成人免费视| 日韩视频免费观看高清完整版 | 欧美视频自拍偷拍| 日韩av一区二| 久久综合丝袜日本网| 成人av在线网| 亚洲大片免费看| 日韩一区二区三区电影在线观看 | 欧美亚洲一区二区在线观看| 亚洲成在人线免费| 日韩视频123| 国产精品123| 亚洲一区二区精品3399| 日韩精品一区二区三区在线观看 | 国产·精品毛片| 亚洲综合一区二区三区| 欧美一区二区性放荡片| 国产乱一区二区| 亚洲人成在线播放网站岛国| 欧美日韩精品一区二区在线播放| 蜜臀久久99精品久久久久久9| 国产片一区二区| 在线视频欧美区| 久久av老司机精品网站导航| 国产精品久久福利| 欧美日韩国产在线观看| 国产精品 日产精品 欧美精品| 一区二区三区色| 精品国产亚洲在线| 91丨porny丨蝌蚪视频| 日韩av成人高清| 中文字幕成人在线观看| 欧美日韩高清影院| 国产成人在线影院| 日韩精品乱码免费| 1024精品合集| 欧美不卡一区二区三区| 在线观看视频一区二区 | 91丨九色porny丨蝌蚪| 美腿丝袜亚洲色图| 亚洲久草在线视频| 久久综合九色综合欧美98| 欧洲一区二区三区在线| 国产成a人无v码亚洲福利| 五月天久久比比资源色| 综合久久给合久久狠狠狠97色| 日韩精品一区国产麻豆| 欧美日韩一区二区在线观看视频| 国产成人亚洲综合a∨婷婷图片| 视频一区二区国产|