想问一下如何用matlab编写下面的算法,关于路径优化:

min z=∑(i=0→n)∑(j=0→n)C(ij)X(ij)
X(ij)=①1(i,j连接情况)②0(不连接)
∑(i=1→n)X(ij)=1, j=1,2,...n
∑(j=1→n)X(ij)=1, i=1,2,...n
∑(i=1→n)X(ip)-∑(j=1→n)X(pj)=0, p=1,2,...n

嗯,某个矩阵,一行元素之和为1,一列元素之和为1,某p行的元素之和减去某p列的元素之和为零。目标函数是什么?C(i,j)是已知的距离矩阵吧。

如果这样的话,用lingo解很快,引入一个限制x变量为@bin,也就是0-1变量。推荐用这个软件来做很快很简单。

matlab的忘得差不多了。你要是想了解的话留个邮箱,我把课件发给你,你自己琢磨一下。数学不好,扯到算法上去就不懂不懂了。追问

还是用运筹学的软件方便是么?

追答

1.个人认为长痛不如短痛,要学的早学,要是临时要用的话想死的心都有。
2.lingo不是很难,基本语句入门了就可以编程了。其中的一个难点是lingo的循环很蛋疼,所以建议阁下用点时间领会一下lingo循环的使用,变起来就顺手多了。有本书和运筹学有关的很厚,两本微积分加起来那么厚,这本书帮你把什么图论问题啊都表示成规划的形式,用lingo编起来不要太容易。
3.这个问题真的是个问题。我的意思是指如果你不掌握整个算法过程的话,做题做起来比较虚。我的意思也是指不要半吊子,这样很吃亏。就像你提的这个问题如果你不了解一下算法,不自己编一次,那么这个问题你终究不是自己解得,一方面你不知道结果到底合理不合理,另一方面成就感比较低啊,有木有。
4.你这个是不是最小生成树啊,如果是啊,我提供一点思路啊。kruskal算法,嗯嗯,我不是很懂你这个问题是什么。kruskal算法比较好玩,选最小边,将最小边加入已选边中,判断时候连成回路,如果有那么放弃它(以后都不要了),继续选最小的边。这个算法看起来简单,但是自己编起来比较麻烦(个人觉得很麻烦)。参考了一下书本,书本的解决办法是构建并查集,只要检测选得的最小边端点时候同属一个并查集,如果属于同一并查集,那么就不要这个边了。具体怎么编,自己看一下啊,一来我说的不是很清楚,而来有点长。
5.还有一种出路,那就是用现代算法,什么模拟退火算法,什么遗传算法啊,蒙特卡罗啊,这些方法是万金油啊,什么都可以用上。这是好处之一,还有一个好处就是显得你的解题方法比较高级,有优势,有优势。这一类的算法的难点在于把实际问题转换到算法的变量集里面去。

温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜