【算法设计与分析】旅行商问题

1. 实验内容

利用蛮力法解决旅行商问题,求解最短路径。

2. 算法思想

旅行商问题可以表述为求一个最短的哈密顿回路问题。
因为是回路,所以可以假设所有的回路都起点和终点都为同一个点,从而生成n-1个中间城市的组合。
通过递归函数遍历所有城市,并记录每一种排列所得路径的长度,比较后得到最短路径。

2.1. 实现思想

  1. 读取节点数目【n】
  2. 动态建立一个【n*n】的【距离矩阵】
  3. 将路径看作一个【栈】
  4. 默认第【1】个节点为【出发城市】
  5. 遍历与当前节点关联的【关联城市】并执行【压栈】操作
  6. 计算目前的【路径长度】
  7. 循环递归,重复步骤【5】,直到所有城市都走过
  8. 计算【总长度】,与储存的长度比较,选取最小的长度和路径【存储】
  9. 输出【最短距离】和【最短路径】

2.2. 算法优化【剪枝】

在上述步骤第【6】步,可以通过比较与【已知最短长度】的大小比较,若大于则后续步骤无需进行。

3.算法代码【VS Code + Cpp】

#include 

using namespace std;

#define MAX_INT (1 << (sizeof(int) * 8 - 1)) - 1

int nodeNum;                    //节点数目
bool *isPass;                   //走过的路
vector<vector<int>> roadMartix; //距离矩阵
int minLength = MAX_INT;        //最短距离
stack<int> minRoad;             //最短路途

void ReadMartix(vector<vector<int>> &); //写入矩阵
void ShowMartix(vector<vector<int>>);   //显示矩阵
void Walk(stack<int> &, int &, int);    //递归走
int ShowRoad(stack<int> &);             //展示路径

int main()
{
    //辅助循环变量
    int i, j;

    //获取节点数目
    cout << "输入节点数目【nodeNum】:";
    cin >> nodeNum;

    //初始化各种矩阵、数组
    isPass = new bool[nodeNum];
    for (i = 0; i < nodeNum; i++)
    {
        isPass[i] = false;
    }
    roadMartix.resize(nodeNum, vector<int>(nodeNum, 0));

    //读取距离矩阵
    ReadMartix(roadMartix);

    //寻找最短路径
    //遍历所有节点【以每个节点作为起点开始遍历】
    stack<int> tempRoad; //临时存储每次路径
    int tempLength = 0;  //临时长度
    //入栈第一个元素
    tempRoad.push(0);
    isPass[0] = true;
    //穷举
    Walk(tempRoad, tempLength, 0);

    ShowRoad(minRoad);

    system("pause");
    return 0;
}

//读取矩阵
void ReadMartix(vector<vector<int>> &m)
{
    for (int i = 0; i < m.size(); i++)
    {
        for (int j = 0; j < m.size(); j++)
        {
            cin >> m[i][j];
        }
    }
    return;
}

//输出矩阵
void ShowMartix(vector<vector<int>> m)
{
    for (int i = 0; i < m.size(); i++)
    {
        for (int j = 0; j < m.size(); j++)
        {
            cout << roadMartix[i][j] << "\t";
        }
        cout << "\n";
    }
}

//穷举
void Walk(stack<int> &road, int &length, int prelength)
{
    if (road.size() != nodeNum)           //如果还有城市没有排列
        for (int i = 1; i < nodeNum; i++) //起始城市已经默认,从1—(n-1)开始循环遍历
        {
            //判断是否走过并且剪枝
            if (!isPass[i] && length + roadMartix[road.top()][i] < minLength) //如果已经大于则没有必要继续判断
            {
                int tempLength = length;
                isPass[i] = true;                    //标记start城市已排列
                length += roadMartix[road.top()][i]; //记录长度
                road.push(i);                        //压栈
                Walk(road, length, tempLength);      //递归调用
            }
        }
    else //所有城市都排列好,一次遍历结束
    {
        //判断最小
        if (length + roadMartix[road.top()][0] < minLength)
        {
            minLength = length + roadMartix[road.top()][0]; //总长度
            minRoad = *(new stack<int>(road));
        }
    }
    isPass[road.top()] = false; //一次遍历结束,将已排列城市的标记解除
    road.pop();                 //出栈
    length = prelength;         //还原为入栈前的长路径长
}

//展示路径规划
int ShowRoad(stack<int> &road)
{
    cout << "【0】";
    int last = 0; //上一次存储的节点
    while (!road.empty())
    {
        cout << "--" << roadMartix[last][road.top()]
             << "-->【" << road.top() << "】";
        last = road.top();
        road.pop();
    }
    cout << endl
         << "最短路径长度为:" << minLength << endl;
}

4. 结果示例

输入:
10
0 180 206 792 459 788 742 248 378 364
397 0 974 945 758 960 47 476 457 475
6 399 0 477 110 61 644 28 65 552
707 74 907 0 883 710 267 564 167 300
220 870 435 126 0 284 130 815 249 890
602 4 375 256 859 0 815 320 606 473
603 383 985 254 998 392 0 273 436 552
810 664 576 119 534 176 500 0 46 918
16 263 221 68 932 455 168 687 0 126
498 315 210 995 6 957 867 263 889 0
输出:
> 【0】--459-->【4】--890-->【9】--889-->【8】--68-->【3】--564-->【7】--500-->【6】--383-->【1】--960-->【5】--375-->【2 】--6-->【0】
> 最短路径长度为:1229
输入:
5
0   8  6  10  8
8   0  4   9  3
6   4  0   7  11
10  9  7   0  5
8   3  11  5  0
输出:
> 【0】--10-->【3】--5-->【4】--3-->【1】--4-->【2】--6-->【0】
> 最短路径长度为:28
输入:
10
0 103 389 64 482 144 329 624 904 692 276 679 751 611 80 992 392 281 180 114 440 621 720 853 135 188 492 612 661 600 833 950 260 559 959 620 461 516 73 664 979 656 917 600 573 129 588 891 959 811 
718 0 894 515 206 483 748 379 807 673 48 671 855 738 586 615 843 365 504 234 318 107 798 694 467 901 519 73 220 363 453 613 376 54 479 504 469 937 942 358 626 610 38 315 876 778 541 733 125 770 
647 118 0 932 646 384 399 721 558 977 940 530 96 212 72 984 28 820 294 128 161 296 716 451 618 416 980 143 909 890 161 340 859 194 214 545 855 320 928 642 128 143 299 731 988 492 404 783 740 31
557 992 772 0 424 669 236 193 23 266 393 884 16 645 758 284 699 290 378 511 38 646 327 618 334 914 864 341 738 57 966 190 501 845 226 408 898 280 738 501 381 265 909 692 154 113 837 18 349 124
136 40 902 787 0 951 648 538 270 82 722 395 84 477 37 628 608 589 514 146 123 318 121 977 383 684 17 520 182 361 433 493 523 247 609 410 207 413 232 601 743 688 235 622 555 887 297 289 965 998
628 779 968 604 648 0 810 674 775 47 402 846 617 120 827 739 380 518 741 685 353 217 269 660 236 439 851 282 972 608 621 368 624 512 740 360 214 924 826 90 
793 981 196 897 195 622 406 190 797 911 
806 829 997 835 743 112 0 629 755 913 627 473 857 525 968 318 635 570 746 423 804 105 511 605 448 171 349 268 190 918 77 499 193 536 56 71 717 474 708 893 280 727 136 1 812 617 661 398 251 246
359 324 327 606 657 326 336 0 600 814 897 870 137 412 371 637 412 777 965 30 237 875 581 115 786 202 794 282 268 988 749 788 186 657 849 274 176 450 175 908 575 44 177 748 177 181 932 782 189 943 
826 203 836 632 104 812 660 216 0 603 364 24 911 29 857 830 480 209 637 305 202 733 465 678 138 646 936 980 636 605 11 37 976 392 657 146 266 850 37 465 832 310 163 843 612 180 656 525 125 705
61 826 953 512 616 489 975 336 500 0 30 432 410 806 449 735 740 750 125 77 184 13 460 345 576 702 172 728 757 185 804 960 650 623 310 180 648 548 878 744 795 608 492 599 258 50 740 414 678 295
616 167 757 583 768 341 614 812 506 501 0 592 674 103 657 963 423 278 82 487 524 789 439 884 287 229 692 460 805 226 119 569 607 520 259 478 33 267 588 657 
413 975 27 380 387 219 862 511 972 916
234 436 722 129 990 695 851 472 982 704 957 0 738 654 546 388 15 140 765 234 877 860 286 150 856 255 405 771 492 860 228 580 154 318 950 265 245 687 159 266 414 913 186 37 118 603 53 825 533 503
17 961 311 569 325 298 997 728 174 584 44 554 0 277 11 667 868 424 594 421 311 468 34 523 449 5 722 173 727 785 760 368 906 119 864 779 117 294 935 324 574 
179 419 247 307 52 995 726 169 615
915 567 799 422 100 348 565 488 460 28 965 12 936 0 793 395 898 314 925 460 688 118 456 167 585 336 153 130 987 66 445 500 151 336 587 751 944 261 143 768 379 717 317 590 8 436 119 665 59 186
594 698 738 706 201 810 956 983 972 970 493 600 490 966 0 831 596 441 399 787 61 695 234 279 615 452 707 718 662 178 879 869 964 205 695 977 472 401 222 327 697 169 350 873 588 845 878 434 102 332
165 625 614 317 353 253 167 811 69 626 633 997 937 729 136 0 451 106 575 492 812 617 43 328 973 770 402 433 215 987 504 756 285 253 810 744 72 924 373 681 621 152 855 371 983 228 174 116 302 369 
511 82 740 65 510 92 146 19 717 853 739 577 282 111 741 915 0 424 680 464 338 26 886 120 175 122 416 193 857 92 351 33 842 660 79 96 363 159 188 868 561 636 792 564 592 654 850 605 380 929
381 616 690 597 701 621 230 44 971 145 108 903 126 349 634 777 543 0 699 275 413 516 635 30 641 413 204 363 221 412 744 927 983 999 279 26 335 496 662 535 631 482 298 175 515 551 246 144 676 529 
541 823 299 763 877 890 807 717 681 20 648 937 91 788 541 516 754 887 0 163 136 87 487 444 515 446 527 924 52 400 178 80 244 368 134 867 950 164 420 635 536 466 500 921 645 631 263 178 205 104 
366 462 505 942 223 491 121 568 588 783 677 756 230 958 88 586 916 468 932 0 669 335 638 586 488 148 738 198 923 779 425 407 741 864 781 583 676 832 594 123 100 771 240 16 657 509 16 363 501 893 
635 611 286 324 563 761 266 967 853 340 662 715 997 989 804 405 780 803 254 82 0 846 582 161 192 524 733 241 135 155 95 788 955 839 952 291 156 467 554 456 
496 9 536 36 805 249 501 625 12 209
94 806 37 91 568 292 914 319 850 282 928 931 895 199 699 425 588 224 264 286 149 0 310 841 668 150 766 825 52 738 220 542 35 909 873 348 51 646 461 878 860 
774 791 415 854 620 416 910 559 846
51 100 133 404 442 733 488 838 593 893 437 949 362 347 201 328 111 928 736 129 750 848 0 797 619 717 282 262 968 621 568 413 746 186 672 310 480 86 362 301 
461 779 804 145 354 631 163 468 201 454
887 518 613 638 488 316 969 164 879 187 335 913 401 345 802 343 939 830 304 110 815 622 810 0 130 181 712 187 529 502 563 34 642 928 44 885 985 47 744 714 65 816 215 498 513 680 644 87 340 596 
108 406 2 213 649 182 226 347 436 999 314 26 77 201 258 68 907 457 470 725 542 686 252 369 0 255 286 44 354 746 988 655 153 395 333 41 26 161 418 341 546 365 87 578 49 323 454 901 252 533
150 834 627 541 354 718 493 861 673 919 899 428 155 194 592 471 200 885 481 218 966 32 173 598 38 0 487 73 584 499 407 767 625 189 571 753 38 778 314 887 719 828 780 759 840 109 241 735 300 630 
202 667 312 170 635 838 188 8 169 134 854 607 990 589 378 556 60 621 793 435 993 908 338 707 222 557 0 487 255 390 957 708 240 95 350 87 257 415 271 272 510 202 777 324 309 385 251 369 813 379 
118 391 849 733 266 779 729 333 891 901 985 312 731 918 645 989 654 632 735 272 414 547 463 662 95 814 132 0 999 829 450 3 972 260 797 989 807 501 375 119 710 770 108 933 699 700 656 784 70 399
703 195 285 517 10 931 766 255 852 689 363 307 599 90 601 721 865 665 997 17 904 463 671 357 25 131 27 478 0 361 880 981 28 80 278 741 357 946 60 163 852 816 519 7 94 671 651 288 960 26 
970 148 652 384 802 105 780 247 912 564 289 672 931 353 897 27 244 554 280 158 358 272 911 172 752 551 212 246 981 0 678 11 560 226 961 969 884 934 194 448 
47 736 144 299 29 571 703 355 237 780 
941 964 375 799 481 517 118 345 832 246 555 101 393 606 729 328 291 373 651 3 187 750 242 142 382 325 699 193 456 319 0 974 127 891 330 835 120 610 623 362 
861 288 617 137 703 127 531 120 156 714 
279 390 369 282 632 245 669 629 297 29 138 110 526 498 70 198 45 935 968 808 63 992 928 800 889 435 878 418 463 514 254 0 350 620 319 38 446 572 984 506 473 958 875 178 19 312 386 764 794 219
256 866 597 352 328 762 713 873 826 26 378 899 537 665 150 393 340 542 597 181 767 781 763 497 943 843 314 259 522 45 343 981 0 816 161 422 371 83 275 724 101 469 474 214 34 178 503 504 725 786 
144 456 161 956 134 672 936 549 992 901 683 942 813 964 412 273 852 952 495 833 632 966 107 748 907 886 415 670 547 987 104 809 952 0 255 905 598 594 987 846 862 261 355 135 262 111 779 745 118 340 
88 740 571 695 276 498 485 781 862 463 407 505 928 974 34 253 142 165 56 127 296 523 524 14 456 501 249 250 983 803 495 861 568 710 0 596 877 515 659 948 944 561 913 241 313 656 6 39 997 771 
9 171 803 623 813 568 429 393 62 129 321 713 579 935 317 975 827 3 593 98 32 604 376 557 11 385 47 174 961 818 966 159 71 765 252 0 390 447 986 413 212 278 
211 850 604 483 626 893 144 772 
605 699 906 477 144 704 301 178 203 771 608 791 974 14 362 406 295 30 699 488 30 749 407 243 774 780 756 407 559 744 331 730 514 1 382 717 0 349 958 327 255 99 642 369 712 209 401 577 386 139
188 583 676 730 231 990 152 81 922 843 791 62 548 505 492 518 666 735 76 450 56 131 32 440 202 483 145 951 350 102 795 37 977 581 163 951 1 0 534 771 78 953 20 537 833 872 644 564 376 326 
821 864 330 919 501 476 628 577 730 8 199 834 803 526 535 714 937 196 986 141 533 127 559 659 838 376 161 682 808 266 582 267 845 668 695 125 993 176 0 713 
91 760 914 74 847 51 86 567 547 128
454 145 691 649 488 810 64 967 326 318 719 312 843 246 346 635 610 904 443 471 489 112 74 745 51 462 763 524 284 715 264 792 549 244 482 501 679 178 759 0 952 723 973 94 521 835 757 435 122 302 
798 516 945 619 488 909 677 532 626 670 152 334 146 42 370 229 526 995 950 232 20 633 185 13 983 869 685 277 626 679 539 332 63 907 993 952 682 180 532 818 
0 555 328 759 107 362 7 842 121 988
663 218 599 663 138 231 168 901 811 131 760 325 559 134 558 636 119 704 560 189 155 784 350 43 184 483 978 539 942 622 832 885 995 350 208 685 562 512 125 403 648 0 978 836 640 250 333 716 648 330 
149 556 243 61 81 63 641 348 79 50 965 967 593 676 410 258 650 356 896 859 808 79 21 943 562 617 532 864 566 493 868 151 45 180 8 262 457 507 660 737 709 898 0 796 621 74 577 199 328 504
491 9 542 292 521 85 239 371 846 332 168 300 831 469 586 422 455 766 721 955 481 53 580 563 929 706 76 236 914 858 585 312 516 935 123 826 122 596 776 288 128 461 100 0 235 283 731 64 944 202
971 717 71 823 548 461 772 170 79 244 192 39 70 744 794 127 542 741 42 310 669 293 614 862 984 946 737 743 541 753 887 483 492 482 910 786 978 814 344 480 781 648 935 696 0 803 96 561 941 277
999 598 895 994 335 509 979 641 978 902 335 732 43 217 474 686 867 386 806 29 164 761 32 268 328 333 908 764 156 93 27 866 126 921 144 841 522 201 802 169 209 957 730 612 306 0 241 660 240 838
905 856 517 401 306 610 322 752 487 367 278 252 162 663 948 5 584 420 341 123 641 775 362 819 275 5 110 595 831 909 455 161 774 561 170 969 411 803 856 736 
312 794 2 654 338 409 0 411 197 459
818 843 41 208 306 394 81 489 184 221 589 352 753 435 175 928 268 890 715 675 54 929 736 745 934 269 473 995 793 21 810 990 945 55 636 962 289 726 123 850 707 484 29 155 450 248 451 0 3 47
523 852 733 751 899 137 177 875 209 468 42 11 966 264 757 606 695 98 38 632 724 440 315 156 823 685 769 453 451 982 114 32 743 648 778 600 749 178 521 553 868 75 594 747 827 597 869 224 0 661
447 663 897 882 291 206 25 680 108 337 830 431 184 123 685 807 955 515 592 295 610 162 793 414 24 812 774 898 551 401 378 213 965 797 173 949 217 403 721 66 525 711 153 444 274 127 26 643 370 0
输出:
等了很久还是没结果

5. 算法复杂度

该算法是递归穷举所有可能排列,但中间存在剪枝操作。
基本操作是递归函数Walk中内嵌循环下的比较运算。
最好的情况下第一次递归得到了最短路径,而后每次都直接剪枝,大概进行【2n】次基础操作。
最差的情况下是最后一次才最短且前面无剪枝操作,大概进行【n*(n-1)*(n-2)……*1】次,所以是【n^n】
该算法的时间复杂度为:C(n)=n!∈O(n^n)

你可能感兴趣的:(算法)