C 语言旅行商问题2024 年 8 月 28 日 | 3 分钟阅读 旅行商问题 (TSP) 是 数学 和 计算机科学 领域一个著名的优化问题。可以这样描述:找到一条访问每个城市恰好一次的 最短路径,计算每对城市之间的 旅行距离,然后 返回 起始城市。这个问题有许多实际应用,包括 物流规划、电路设计 和 车辆路径规划。在本文中,我们将探讨如何使用 动态规划 来解决 C 语言中的 旅行商问题,并提供一个示例程序及其结果。 使用动态规划解决旅行商问题 (TSP)动态规划 是一种强大的工具,通过将优化问题分解成更小的 子问题 并存储这些 子问题 的解来避免重复计算,从而解决优化问题。可以使用下面列出的步骤通过 动态规划 来解决 TSP: 子问题定义现在我们来定义我们的 子问题:dp[mask][i],其中 'mask' 是一个二进制数,表示已访问城市的集合,'i' 表示 当前城市。dp[mask][i] 的值将是在 “mask” 中访问了所有城市并最终停留在城市 “i” 的 最低成本。 基本情况当 'mask' 只包含 一个城市 时(即 'mask' 的二进制 编码 中只有一个 位 被设置为 1),将 dp[mask][i] 初始化为一个很大的值(表示无穷大)。 递推关系对于每个 子问题 dp[mask][i],遍历所有不在 'mask' 中的城市 'j',并计算从 'mask' 中已访问过的任何城市 'k' 前往城市 'j' 的成本。将 最低成本 添加到 dp[mask | (1 << j)][j] 中。 最终答案最终答案 将是 dp[(1 << n) - 1][i] 的最小值,其中 'n' 是城市总数。 递归方程动态规划解决 TSP 的 递归方程 如下: dp[mask][i] = min(dp[mask ^ (1 << j)][j] + cost[i][j]) 对于所有不在 mask 中的 j。 在此,cost[i][j] 表示城市 'i' 和 'j' 之间的距离。 dp[mask][i]: 它表示从城市 “i” 开始,访问二进制掩码 “mask” 中列出的所有城市的 最低成本。'mask' 是一个二进制数,如果城市 j 已被访问,则第 j 位设置为 1,否则为 0。 mask ^ (1 << j): 通过翻转 “mask” 中的第 j 位,此表达式创建了一个新的 mask,并有效地将城市 “j” 标记为已访问。这是通过将 左移操作 与 异或运算符 () 结合来实现的。 从城市 'i' 到城市 'j' 的旅行成本是 cost[i][j]。它从成本矩阵中获取,该矩阵包含每对城市之间的旅行时间。 时间复杂度动态规划 方法,其中 'n' 是城市数量,解决 TSP 的时间复杂度为 O(n^2 * 2^n)。这是因为有 2^n 种可能的 城市 子集,并且我们必须为每个子集遍历 'n' 个城市才能确定最低成本。 示例下面是一个 C 语言中 旅行商问题 的程序示例 输出 Enter the number of cities: 4 Enter the cost matrix: 0 10 15 20 下一个主题C语言中的双精度浮点数 |
开发人员在学习一种不熟悉的编程语言时,通常会创建的第一个程序是 “Hello, world!” 程序。它只是一个打印 “Hello, world!” 到控制台的基本程序。下面的文章将演示如何编写一个 C 程序,该程序说明 “Hello,……”
阅读 3 分钟
如果开发人员希望进行断言或做出假设,则会在程序中使用编程断言。一个可以使用 assert 的例子是检查 malloc() 返回的指针是否为 NULL 值。它是一个诊断工具。断言的语法是...
阅读 2 分钟
简介:Printf()和Scanf()是C语言中内置的库函数,用于执行格式化输入和格式化输出功能。这些函数在stdio.h头文件中定义和声明。“f”在printf和scanf中代表“formatted”(格式化)。因此,printf()和scanf()函数都使用代码...
阅读 4 分钟
C语言中的星形图案程序 在本主题中,我们将学习如何使用C语言创建图案。我们将使用'*'星号字符或其他字符来创建图案。我们将创建不同的图案或几何形状,例如...
阅读 15 分钟
在本主题中,我们将讨论 C 编程语言中的静态函数。默认情况下,每个函数都声明为全局函数,可以在程序内的任何位置访问。`static` 关键字用于函数名之前,以将任何函数设为静态...
阅读 4 分钟
数学中的 floor() 函数 在数学中,floor() 函数需要一个实数,它计算小于或等于 x 值的最大整数。C 编程中的 floor() 函数:它是一个在 math.h 头文件中定义的函数,以及其他...
阅读 2 分钟
C语言中的多维数组 在C编程中,多维数组是数组的数组。它允许我们将数据存储在表格或矩阵格式中,可以通过索引访问每一行和每一列。最常用的类型是二维数组,...
11 分钟阅读
在本文中,您将了解一个演示如何构建语言的项目。您将通过一个程序来学习这个概念,该程序详细说明了整个过程中发生的所有函数。什么是学生记录系统,我们为什么要使用...
阅读 51 分钟
简介 在 C 编程中,全局变量是声明在任何函数之外且可以被程序中任何函数访问的变量。与只能在其自身函数内访问的局部变量不同,全局变量对整个程序可见。在...
阅读 6 分钟
C 程序打印类似字母的三角形,我们可以编写 C 程序来打印数字三角形。数字三角形可以有多种打印方式。让我们看看 C 示例来打印数字三角形。示例 #include<stdio.h> #include<stdlib.h> int main(){ int i,j,k,l,n; system("cls"); printf("enter the range=");...
阅读1分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India