贪心算法之最优装载问题


贪心算法之最优装载问题


1. 问题描述

​ 有一批集装箱要装上一艘重量为\(c\)的轮船,其中集装箱\(i\)的重量为\(W_i\)。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

2. 问题分析

2.1确定贪心策略

​ 采用重量最轻者先装的贪心选择策略,可产生该问题的最优解。

2.2代码求解

/**
 * x[]  保存最优解路径数组
 * w[]  集装箱重量数组
 * c    船的载重量
 * n    集装箱的数量
 **/
void Loading(int x[], int w[], int c, int n) {
    // 按照集装箱重量从小到大排序
    sort(w, n);
    for (int i = 1; i <= n; i++)
        x[i] = 0;
    for (int i = 1; i <= n && w[i] <= c; i++) {
        x[i] = 1;
        c -= w[i];
    }
}

2.3贪心选择性质

设集装箱依其重量从小到大排序,\((x_1,x_2,\ldots,x_n)\)是其最优解,\(x_i=\{0, 1\}\),设\(x_k\)是第一个等于1的。
(1) 如\(k = 1\),则满足贪心选择性质
(2) 如\(k \neq 1\),用\(x_1\)替换\(x_k\),构造的新解同原解最优值相同,故也是最优解,满足贪心选择性质

​ 该证明方法只证明了任何一个最优解都可以转换为第一个集装箱上船的最优解(满足贪心策略)。此方法对子问题同样有效,因此可以将一个普通最优解转化为满足贪心策略的最优解。如\((0 1 0 1) \Rightarrow (1 1 0 0)\)

2.4.最优子结构性质

​ 最优装载问题具有最优子结构性质,设1至n个集装箱装上船的最大数量为\(T(1, n, w)\),则\(T(1, n, w) = 1 + T(2, n, w - w_1)\);因\(T(1, n, w)\)是最优值,则\(T(2, n, w - w_i)\)一定是最优值,反证法证明之

反证法
​ 如果\(T(2, n, w - w_1)\)不是该问题的最优解,则存在最优值\(T'(2, n, w - w_1) > T(2, n, w - w_1)\),则\(1 + T'(2, n, w - w_1) = T'(1, n, w) > T(1, n, w)\),这与大前提\(T(1, n, w)\)是最优值相矛盾,故\(T(2, n, w - w_1)\)一定是最优值。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM