矩阵 一种最小值 算法

来源:百度知道 编辑:UC知道 时间:2024/09/21 10:52:11
对于一个n*n的矩阵,取矩阵中的n个数,保证每一行每一列都取且只取一个数,怎么的算法能够使得这n个数的和最小??举个例子:
对于一个3×3的矩阵A,如下:

3 2 2
4 3 4
5 2 4

取A02(即数值2,第一行第三列),A10(即数值4,第二行第一列),A21(即数值2,第三行第二列),它们的和为:2+4+2=8,最小。
我也不知道怎么描述这个概念,不知道有没有甚么概念来描述这个最小值。

不知道达人能不能提供一种好的算法并实现,无论用C语言还是matlab实现都行。但不能用穷举法……

要求~明天(周日)晚上之前给出答案者,再追加分!
急用!!!
答案可以跟帖发布,也可以发到changtwzlc@163.com

先谢谢了!

我觉得可以用 遗传算法解决
你问的问题可以看成tsp的一类,tsp可以用遗传算法解决。
具体的我已发到你的邮箱。请注意查收。

动态规划.

用二分图匹配或者最小费用最大流,每一行和每一列连边。

如果n<14,搜索就可以了。
如果n>14 ,用网络流或者KM算法 。

//二分图最佳匹配KM算法
const int INF = 1000000;
int l1[MAXN],l2[MAXN]; //可行顶标,程序里面用
int s[MAXN],t[MAXN];//记录已用的节点集合,程序里面用
bool gl[MAXN][MAXN]; //相等子图,程序里面用
int match1[MAXN], match2[MAXN];//记录两部分的匹配情况
int match(int g[][MAXN], int n, int m)
{//接口:g[][]是所求图的关联矩阵,如果只对一个图进行算法,则可定义为全局变量
//关联矩阵存放的是相连点间的权值。n, m分别是二分图两部分的数目
//返回值是最佳匹配的权值总和。注意,算法的运行之前要保证二分图能够匹配。
int i, j, k, ret(0);
int p, q, al;
for(i = 0; i < n; i++)
{
for(k = 0,j = 1; j < m; j++)
if (g[i][j] > g[i][k]) k = j;
l1[i]=g[i][k];
} //初始化顶标l1
for(i = 0; i < m; i++) l2[i] = 0;//初始化顶标l2
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
if (g[i][j] == l1[i]) gl[i][j] = true;