运输问题表上作业法C语言实现
时间: 2024-05-07 11:19:09 浏览: 86
运输问题表上作业法是一种经典的求解运输问题的方法。下面是一个基于C语言的实现,仅供参考。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROW 10
#define MAX_COL 10
int main()
{
int supply[MAX_ROW], demand[MAX_COL];
int cost[MAX_ROW][MAX_COL];
int allocation[MAX_ROW][MAX_COL];
int row, col, i, j, min, num_alloc;
// 读入供需量和各运输路径的单位运输成本
printf("请输入各行的供应量:\n");
for (i = 0; i < MAX_ROW; i++) {
scanf("%d", &supply[i]);
}
printf("请输入各列的需求量:\n");
for (j = 0; j < MAX_COL; j++) {
scanf("%d", &demand[j]);
}
printf("请输入各运输路径的单位运输成本:\n");
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
scanf("%d", &cost[i][j]);
}
}
// 初始化
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
allocation[i][j] = 0;
}
}
// 循环进行分配
while (1) {
// 计算剩余供需量
for (i = 0; i < MAX_ROW; i++) {
supply[i] -= allocation[i][j];
}
for (j = 0; j < MAX_COL; j++) {
demand[j] -= allocation[i][j];
}
// 如果剩余供需量均为0,则退出循环
if (check_done(supply, demand)) {
break;
}
// 求解剩余供需量的最小值及其所在位置
min = cost[0][0];
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
if (supply[i] > 0 && demand[j] > 0 && cost[i][j] < min) {
min = cost[i][j];
row = i;
col = j;
}
}
}
// 分配
num_alloc = (supply[row] < demand[col]) ? supply[row] : demand[col];
allocation[row][col] += num_alloc;
}
// 输出结果
printf("最终分配方案如下:\n");
for (i = 0; i < MAX_ROW; i++) {
for (j = 0; j < MAX_COL; j++) {
printf("%d\t", allocation[i][j]);
}
printf("\n");
}
return 0;
}
int check_done(int supply[MAX_ROW], int demand[MAX_COL])
{
int i, j;
for (i = 0; i < MAX_ROW; i++) {
if (supply[i] > 0) {
return 0;
}
}
for (j = 0; j < MAX_COL; j++) {
if (demand[j] > 0) {
return 0;
}
}
return 1;
}
```
上述代码中,`MAX_ROW`和`MAX_COL`分别表示最大行数和最大列数,可以根据实际情况进行修改。`supply`和`demand`数组表示各行和各列的供需量,`cost`数组表示各运输路径的单位运输成本,`allocation`数组表示最终的分配方案。`check_done`函数用于判断剩余的供需量是否均为0,如果是则返回1,否则返回0。
阅读全文