蛮力法求解旅行商

Posted Wiiix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蛮力法求解旅行商相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 蛮力法求解旅行商

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
        int vn;//顶点个数
        int pathlong = 0;//初始化路径长度
        int[,] matrix;//用来存放邻接矩阵    
        int min = 9999;//初始化最短路径长度
        private void button1_Click(object sender, EventArgs e)
        
            min = 9999;//初始化最短路径长度
            string mx;//用来存放读取文件的信息
            pathlong = 0;//初始化路径长度
            string Chosen_File = "";
            openFD.InitialDirectory = "C:";
            openFD.Title = "Open a Text File";
            openFD.FileName = "";
            if (openFD.ShowDialog() != DialogResult.Cancel)//读取文件
            
                
                Chosen_File = openFD.FileName;
                System.IO.StreamReader objReader;
                objReader = new System.IO.StreamReader(Chosen_File);
                vn = Convert.ToInt32(objReader.ReadLine());//文本的第一行为矩阵大小
                mx = objReader.ReadToEnd();//读取矩阵信息
                Amatrix.Clear();//清空显示邻接矩阵的文本框
                listBox1.Items.Clear();//清空记录
                listBox2.Items.Clear();
                string[] temp;//把mx的字符串转为矩阵信息
                temp = mx.Split(' ');//读取矩阵信息
                int k = 0;
                matrix = new int[vn, vn]; //初始化邻接矩阵
                for (int i = 0; i < vn; i++)
                    for (int j = 0; j < vn; j++)
                    
                        matrix[i, j] = Convert.ToInt32((temp[k]));//写入邻接矩阵
                        k++;
                    
                Amatrix.Font = new Font("Verdana", 77 / vn, FontStyle.Regular);
                print(matrix);
                    int[] a = new int[vn-1]; //初始化矩阵a
                    for (int i = 0; i < vn - 1; i++)//为数组a赋值从1到n的数字
                        a[i] = i + 1;  
                    Permutation(a);//进行全排列
                
            
        

      private void print(int[,] matrix)//打印邻接矩阵
          
            for (int i = 0; i < vn; i++) //输出邻接矩阵
            
                for (int j = 0; j < vn; j++)
                    Amatrix.Text += matrix[i, j] + " ";
                Amatrix.Text += Environment.NewLine;
            
        
    
      public void Permutation(int[] a)
        
            
            while (true)
            
                printArray(a);//输出当前排列
                int i, j;
                for (i = a.Length - 2; i >= 0; i--)//从最后第二个元素开始向前,如果后面的元素大于当前i所指向的元素则记录i的下标
                
                    if (a[i] < a[i + 1])//如果找到i跳出循环
                        break;
                    else if (i == 0)//说明是最大逆序数,排列完毕退出函数
                        return;
                
                for (j = a.Length - 1; j > i; j--)//从后向前,记录比i大的第一个数
                
                    if (a[j] > a[i])//找到j跳出
                        break;
                
                swap(a, i, j);//交换i,j
                reverse(a, i + 1, a.Length - 1);//对当前的子串a[i+1]到a[a.length-1]进行反转
            
        

        public void swap(int[] a, int i, int j)//交互数组元素
        

            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        

        public void reverse(int[] a, int i, int j)//将字符串进行反转
        
            while (i < j)
                swap(a, i++, j--);
        

        public void printArray(int[] a) //输出排列结果
        
            string per = "0=>"; //初始化路径信息
            for (int i = 0; i < a.Length; i++)
            
                per += a[i] + "=>"; //写入路径信息
            
            per += "0"; //加入返回路径
            listBox1.Items.Add(per + " 长度:" + citylength(a)); // 把per列入listBox1
            if (citylength(a) < min)  //计算最短路径,过滤所有路径筛选出最短路径
            
                min = citylength(a); //发现更短路径就更新min
                listBox2.Items.Clear(); //之前的路径清空
                listBox2.Items.Add("最短路径为:" + per + " 长度:" + min);//重新列入当前最短路径
            
            else if (citylength(a) == min) //如果相同则列入
                listBox2.Items.Add("最短路径为:"+per + " 长度:" + min);
        

           private int citylength(int[]city)//计算数组并返回路径长度
        
            pathlong = 0;
            for (int i = 0; i < city.Length - 1; i++)//对于数组中每一个元素,计算i到i+1的距离
                pathlong += matrix[city[i], city[i + 1]];
            pathlong += matrix[0, city[0]];//加上返回路径的长度
            pathlong += matrix[city[city.Length - 1],0];//加上返回路径的长度
            return pathlong;
        

        
    

以上是关于蛮力法求解旅行商的主要内容,如果未能解决你的问题,请参考以下文章

SSA TSP基于matlab麻雀算法求解旅行商问题含Matlab源码 1575期

算法笔记_018:旅行商问题(Java)

算法笔记_017:递归执行顺序的探讨(Java)

算法设计与分析--求最大子段和问题(蛮力法分治法动态规划法) C++实现

Python数模笔记-模拟退火算法求解旅行商问题的联合算子模拟退火算法

Python数模笔记-模拟退火算法求解旅行商问题的联合算子模拟退火算法