用分支限界法求解装载问题,用队列式求解c语言
时间: 2023-11-27 18:49:29 浏览: 95
装载问题可以用分支限界法求解,该方法是一种搜索算法,通过维护一个优先队列来确定下一步要扩展的节点。
以下是用队列式求解装载问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 100 // 货箱最大容量
#define M 100 // 货物最大数量
#define INF 0x3f3f3f3f // 无穷大
int n, c; // 货物数量和货箱容量
int w[M]; // 每个货物的重量
int bestw; // 最优载重量
int cw; // 当前载重量
int r; // 剩余货物总重量
int x[M]; // 当前解
int bestx[M]; // 最优解
int q[M]; // 分支队列
int head = 0, tail = 0; // 队列头尾指针
// 计算剩余货物总重量
int remainWeight(int i) {
int sum = 0, j;
for (j = i + 1; j <= n; j++) {
sum += w[j];
}
return sum;
}
// 搜索状态树
void search() {
int i = 1;
r -= w[i];
q[++tail] = i; // 将第一个货物加入队列
while (head < tail) { // 队列非空
i = q[++head]; // 取出队首元素
if (cw + w[i] <= c) { // 加入当前货物后仍不超过容量限制
x[i] = 1;
cw += w[i];
if (i == n) { // 找到一个可行解
if (cw > bestw) { // 更新最优解
bestw = cw;
int j;
for (j = 1; j <= n; j++) {
bestx[j] = x[j];
}
}
} else { // 没有找到可行解,继续搜索
r -= w[i + 1];
q[++tail] = i + 1;
}
x[i] = 0;
cw -= w[i];
}
if (cw + remainWeight(i) > bestw) { // 加入当前货物后超过容量限制,继续搜索
q[++tail] = i + 1;
}
}
}
int main() {
printf("请输入货箱容量和货物数量:");
scanf("%d%d", &c, &n);
printf("请输入每个货物的重量:");
int i;
for (i = 1; i <= n; i++) {
scanf("%d", &w[i]);
}
// 初始化
bestw = -INF;
cw = 0;
r = 0;
for (i = 1; i <= n; i++) {
r += w[i];
}
// 搜索状态树
search();
// 输出结果
printf("最优载重量为:%d\n", bestw);
printf("最优解为:");
for (i = 1; i <= n; i++) {
if (bestx[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
```
在该代码中,首先输入货箱容量和货物数量,然后输入每个货物的重量。接着,初始化最优载重量、当前载重量和剩余货物总重量。然后调用 `search()` 函数搜索状态树,该函数使用队列式分支限界法实现。最后,输出最优载重量和最优解。
阅读全文