C语言表上作业法运输问题,表上作业法解运输问题

《表上作业法解运输问题》由会员分享,可在线阅读,更多相关《表上作业法解运输问题(2页珍藏版)》请在人人文库网上搜索。

1、1.求解下列运输问题使总运费最低(下表给出的数字为运价)肖地产地Bib2b3产重Ai651320a21071616a38244101416401.解:用表上作业法计算如下:(注:采用了差额法、位势法)Bib2b3产壘行差行位势UiAi61015131020, 10, 01, 8,00a21 1071416216, 2, 03, 9,03a311 872444 02910, 014, 016, 12, 2,040列差2, 43, 29, 3,0列位势Uj6413(10分,其中求出初时方案5分)由二表知,此运输间题的最优调运方案是:Ai运往B】10个单位,运往比10个单位,他运往B214个单位,A。

2、?运往Bs2个单位,As运往Bs4个单位.最小运费为6X10+13X10+7X14+16 X2+4X4=336.(2 分)1)分别计算出各行和各列的最小运费和次最小运费的差额,填入表格的最右列 和最下行。2)从行或列差额中选出最大者, 选择它所在行或列中的最小元素。 B3 列中的最 小元素是9,可确定B3的产品先满足A3的需要,同时将A3行划去。A3B3=4。3)对未划去的元素再分别计算出各行、各列的最小运费和次最小运费的差额, 重新填入表格的最右列和最下行。 从行或列差额中选出最大者, 选择它所在行或 列中的最小元素。 B1 列中的最小元素是 6,可确定用 A1 的产品先满足 B1 的需 要。

3、,同时将 B1 列划去。 A1B1=10 。4)对未划去的元素再分别计算出各行、各列的最小运费和次最小运费的差额, 重新填入表格的最右列和最下行。 从行或列差额中选出最大者, 选择它所在行或 列中的最小元素。 A2 行中的最小元素是 7,可确定用 A2 的产品先满足 B2 的需 要,同时将 B2 列划去。 A2B2=14 。5)现在未划去的只剩 A1B3 和 A2B3, A1B3 的单位运费比 A2B3 的单位运费少, 所以选用用 A1 的产量满足 B3 的销量,剩余的再用 A2 的产量满足。 A1B3=10 , A2B3=2。6)将算出的 A3B3=4 , A1B1=10 , A2B2=14 , A1B3=10, A2B3=2 乘以相应表 格中的单位运费,得到总运费为 336 元。即:A3运往B3 4个单位,A1运往B1 10个单位,A2运往B2 14个单位,A1 运往 B3 10 个单位, A2 运往 B3 2 个单位。最小总运费 =4*4+10*6+14*7+10*13+2*16=336 元。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 运输问题可以使用表上作业法(Northwest Corner Method)进行求。下面是使用C语言实现该算法的示例代码: ``` #include <stdio.h> #define MAX_SIZE 100 int main() { int supply[MAX_SIZE], demand[MAX_SIZE], allocation[MAX_SIZE][MAX_SIZE]; int num_sources, num_destinations, total_supply = 0, total_demand = 0; int i, j, row = 0, col = 0; printf("Enter the number of sources: "); scanf("%d", &num_sources); printf("Enter the number of destinations: "); scanf("%d", &num_destinations); printf("Enter the supply for each source:\n"); for (i = 0; i < num_sources; i++) { scanf("%d", &supply[i]); total_supply += supply[i]; } printf("Enter the demand for each destination:\n"); for (i = 0; i < num_destinations; i++) { scanf("%d", &demand[i]); total_demand += demand[i]; } if (total_supply != total_demand) { printf("Error: Total supply (%d) does not match total demand (%d)\n", total_supply, total_demand); return 1; } // Initialize allocation matrix to 0 for (i = 0; i < num_sources; i++) { for (j = 0; j < num_destinations; j++) { allocation[i][j] = 0; } } i = 0; j = 0; while (row < num_sources && col < num_destinations) { if (supply[row] < demand[col]) { allocation[row][col] = supply[row]; demand[col] -= supply[row]; row++; } else { allocation[row][col] = demand[col]; supply[row] -= demand[col]; col++; } } // Print the allocation matrix printf("Allocation matrix:\n"); for (i = 0; i < num_sources; i++) { for (j = 0; j < num_destinations; j++) { printf("%d ", allocation[i][j]); } printf("\n"); } return 0; } ``` 该代码中使用了一个二维数组 `allocation` 来表示每个源点分配给每个目的地的数量。使用两个变量 `row` 和 `col` 来记录当前要分配的源点和目的地。在循环中,如果当前源点的供应量小于目的地的需求量,则将当前源点的全部供应量全部分配给该目的地,然后将源点的指针后移;否则将目的地的全部需求量分配给该源点,然后将目的地的指针后移。最终得到的 `allocation` 数组即为所求的最优。 需要注意的是,该代码的实现仅适用于基本型运输问题,即每个源点都有供应量,每个目的地都有需求量。如果出现多余或不足的供应量或需求量,则需要进行相应的调整。 ### 回答2: 运输问题是指在有限的资源条件下,如何确定物资的调度和运输方案,以最大限度地满足需求并降低运输成本。在C语言中,可以通过使用不同的数据结构和算法来运输问题。 首先,我们可以使用图论中的最短路径算法来确定不同地点之间的最短路径。例如Dijkstra算法或Floyd-Warshall算法可以帮助我们确定运输路径以及对应的距离,并找到最优路径。 其次,我们可以使用贪心算法或动态规划来确定最佳的调度方案。贪心算法通常根据当前情况下的最佳选择来进行决策,而动态规划则根据问题的最优子结构性质将问题分为较小的子问题并逐步求。 另外,我们还可以使用网络流算法来决一些运输问题,例如最小费用最大流算法可以帮助我们确定最优的供应和需求分配方案,以及最小费用的运输路径。 在C语言中,可以利用相应的数据结构和函数库来实现上述算法。例如,使用邻接矩阵或邻接表来表示图的数据结构,利用数组和指针等来实现贪心算法或动态规划,使用矩阵和向量等数据结构来实现网络流算法。 总之,通过在C语言中运用适当的数据结构和算法,我们可以有效地运输问题,找到最佳的调度和运输方案,以提高效率和降低成本。 ### 回答3: 运输问题是指在一个给定的网络中,如何在最短时间和最低成本的情况下完成货物的运输。对于这个问题,可以使用表上作业法来求,而C语言是一种广泛使用的编程语言,非常适合表上作业法的实现。 在C语言中,可以使用二维数组来表示运输问题的网络。如果有n个供应商和m个收货点,可以创建一个n行m列的二维数组,表示每个供应商向每个收货点运输的成本。 接下来,可以使用循环和条件语句来实现表上作业法。首先,需要计算每行和每列的最小值,并将其保存在临时的一维数组中。这可以使用嵌套循环来实现,循环遍历每个元素并比较大小。 然后,可以找到最小值的索引,并将其用于更新运输矩阵。这可以使用另一个循环来实现,循环遍历每一行或每一列,并根据最小值索引的位置更新对应的值。 重复以上步骤,直到所有供应商和收货点都得到满足,即矩阵中没有剩余的非零元素。 最后,可以计算总的运输成本或时间,以及每个供应商和收货点的具体运输路径。这可以使用另外的循环来实现,在每次更新运输矩阵时记录相关的信息。 通过使用C语言的二维数组、循环和条件语句,可以相对较简单地实现运输问题表上作业法。这种方法在运输问题时非常有效,并且在实际应用中被广泛使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值