分支限界求解旅行商/货郎担问题 python

本文介绍了如何使用分支限界法解决旅行商问题。通过建立带权有向图,利用归约矩阵的概念逐步求解最小耗费的周游路线。在归约过程中,通过对矩阵行和列的操作确保路线的唯一性和最小耗费,最终得出最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题陈述:

设G(V,E)是一带权有向图,V={1,2,…n }, 其耗费矩阵C=(ci,j)当(i, j) E时,记 ci,j= 且 ci,i= .问如何选择周游路线使耗费最小。

算法思路:

在本文中使用了图G的归约矩阵。如果矩阵的一行(列)至少包含一个零元素且其余元素均为非负,则此行(列)称为已归约行(列)。所有行和列均为已归约和列的矩阵成为归约矩阵。

可以通过对一行(列)中每个元素都减去同一个常数t(称为约数)将该行(列)变成已归约行(列)。逐行逐列归约就可以得到原矩阵的归约矩阵。

设A是结点R的归约成本矩阵,S是R的儿子且树边<R,S>对应的这条周游路线中的边<i,j>。

在S是非叶子结点的情况下,它的归约矩阵成本矩阵可以按照下面的步骤求得:

       1.为了保证这条边周游路线采用边<i,j>而不采用其他由i出发或进入的j边,将A中i行j列的元素置为无穷

       2.为了防止采用边<i,0>(因为在已选定的路线上加入边<i,j>之后若采用边<i,0>就会构成一个环,从而得不到这条周游路线),将A(j,0)置为无穷

        3.对于那些不全为无穷的行和列施行归约,则得到S的归约成本矩阵,令其为B,矩阵的约数为r。

from queue import Queue
import copy
import heapq
global MAXNUM
class Node:
    def __init__
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值