负载平衡问题
G公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最少搬运量可以使n个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。
编程任务:
对于给定的n个环形排列的仓库的库存量, 编程计算使n 个仓库的库存数量相同的最少搬运量。
数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行中有 1 个正整数 n(n<=100) ,表示有 n个仓库。第2行中有 n个正整数,表示n个仓库的库存量。
数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行中有 1 个正整数 n(n<=100) ,表示有 n个仓库。第2行中有 n个正整数,表示n个仓库的库存量。
结果输出:
程序运行结束时,将计算出的最少搬运量输出到文件output.txt中。
输入文件示例
5
17 9 14 16 4
输出文件示例
11
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方案:
1 . 问 题 分 析 :
转 化 为 供 求 平 衡 问 题 , 用 最 小 费 用 最 大 流 解 决 。
2 . 建 模 方 法 :
首 先 求 出 所 有 仓 库 存 货 量 平 均 值 , 设 第 i 个 仓 库 的 盈 余 量 为 A [ i ] , A [ i ] = 第 i 个 仓库 原 有 存 货 量 - 平 均 存 货 量 。 建 立 二 分 图 , 把 每 个 仓 库 抽 象为 两 个 节 点 X i 和 Y i 。 增设 附 加 源 S 汇 T 。
( 1 ) : 如 果 A [ i ] > 0 , 从 S 向 X i 连 一 条 容 量 为 A [ i ] , 费 用 为 0 的 有 向 边 。
( 2 ) : 如 果 A [ i ] < 0 , 从 Y i 向 T 连 一 条 容 量 为 - A [ i ] , 费 用 为 0 的 有 向 边 。
( 3 ) : 每 个 X i 向 两 个 相 邻 顶 点 j , 从 X i 到 Y j 连 接 一 条 容 量 为 无 穷 大 , 费 用 为 1 的有 向 边 。
( 4 ) : 每 个 X i 向 两 个 相 邻 顶 点 j , 从 X i 到 X j 连 接 一 条 容 量 为 无 穷 大 , 费 用 为 1 的有 向 边 。
求 最 小 费 用 最 大 流 , 最 小 费 用 流 值 就 是 最 少 搬 运 量 。
3 . 建 模 分 析 :
(1)、计 算 出 每 个 仓 库 的 盈 余 后 , 可 以 把 问 题 转 化 为 供 求 问 题 。
(2)、建 立 供 求 网 络 , 把 二 分 图 X 集 合 中 所 有 节 点 看 做 供 应 节 点 , Y 集 合 所 有 节 点 看 做需 求 节 点 。
(3)、在 能 一 次 搬 运 满 足 供 需 的 X i 和 Y j 之 间 连 接 一 条 费 用 为 1 的 有 向 边 , 表 示 搬 运 一 个单 位 货 物 费 用 为 1 。 建 图 中 的 第 ( 3 ) 步
(4)、另 外 还 要 在 X i 与 相 邻 的 X j 之 间 连 接 边 , 表 示 货 物 可 以 暂 时 搬 运 过 去 , 不 立 即 满足 需 求 , 费 用 也 为 1 。 建 图 中 的 第 ( 4 ) 步
(5)、最 大 流 满 足 了 所 有 的 盈 余 和 亏 损 供 求 平 衡 , 最 小 费 用 就 是 最 少 搬 运 量 。