首页 > 其他分享 >装载问题(最优装载问题变形)-回溯法-深度搜索

装载问题(最优装载问题变形)-回溯法-深度搜索

时间:2023-05-25 17:04:18浏览次数:44  
标签:载重量 int cw 回溯 装载 集装箱 最优 bestw


问题描述:

有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi <= c1 + c2。

问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。

问题分析:

如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。
(1)首先将第一艘轮船尽可能装满;
(2)将剩余的集装箱装上第二艘轮船。

将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近c1。由此可知,装载问题等价于以下特殊的0-1背包问题:

∑ wi * xi <= c1, xi ∈ {0, 1}, 1 <= i <= n;

算法思路:

排序树表示解空间,则解为n元向量{x1,  ... ,xn }, xi∈{0, 1} 。

约束条件:

当前搜索的层i <= n时,当前扩展结点Z为子集树的内部结点,仅当满足cw+w[i] <= c时进入左子树,x[i]=1; 当cw+w[i] > c ,在以结点Z为根的子树中所有结点都不满足约束条件,因而该子树中解都是不可行解,因而将在该子树删去。

限界函数:

由于是最优化问题, 可利用最优解性质进一步剪去不含最优解的子树:
设Z是解空间树第i层上的当前扩展结点。
设           bestw:  当前最优载重量, 
              cw     :  当前扩展结点Z的载重量 ; 
              r        :  剩余集装箱的重量;
在以Z为根的子树中任意叶结点所相应的载重量不超过cw + r。因此,当cw + r (限界函数) ≤ bestw时,可将Z的右子树剪去。
即:cw +  r > bestw 时搜索右子树,x[i]=0;

代码:

#include <bits/stdc++.h>
using namespace std;
int n; //集装箱数
int cw; // 当前载重量, current weight
int bestw; //最优载重重量
int r;  //剩余集装箱重量
int c1; //第一艘轮船的载重量
int c2; //第二艘轮船的载重量
int x[100]; //当前解
int bestx[100]; //当前最优解
int w[100]; //集装箱重量数组
void OutPut()
{
    int restweight = 0;
    for(int i = 1; i <= n; ++i)
        if(bestx[i] == 0)
           restweight += w[i];
    if(restweight > c2)
        printf("不能装入\n");
    else
    {
        printf("船1装入的货物为:");
        for(int i = 1; i <= n; ++i)
            if(bestx[i] == 1)
               printf(" %d", i);
        printf("\n船2装入的货物为:");
        for(int i = 1; i <= n; ++i)
            if(bestx[i] != 1)
               printf(" %d", i);

    }
}
void BackTrack(int i)
{
    if(i > n)
    {
        if(cw > bestw)
        {
            for(int i = 1; i <= n; ++i)
                bestx[i] = x[i];
            bestw = cw;
        }
        return;
    }
    r -= w[i];
    if(cw + w[i] <= c1) //约束条件
    {
        cw += w[i];
        x[i] = 1;
        BackTrack(i + 1);
        x[i] = 0;
        cw -= w[i];
    }
    if(cw + r > bestw) //限界函数
    {
        x[i] = 0;
        BackTrack(i + 1);
    }
    r += w[i];

}
void Initialize()
{
    bestw = 0;
    r = 0;
    cw = 0;
    for(int i = 1; i <= n; ++i)
        r += w[i];
}
void InPut()
{
    scanf("%d", &n);
    scanf("%d %d", &c1, &c2);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &w[i]);
}
int main()
{
    InPut();
    Initialize();
    BackTrack(1);
    OutPut();
}



测试样例:

测试样例一:

输入:

3

50 50

10 40 40

输出

船1装入的货物为: 1 2

船2装入的货物为: 3

截图:

装载问题(最优装载问题变形)-回溯法-深度搜索_最优解

测试样例2:

输入:

3

50 50

20 40 40

输出:

不能装入

截图:

装载问题(最优装载问题变形)-回溯法-深度搜索_子树_02

标签:载重量,int,cw,回溯,装载,集装箱,最优,bestw
From: https://blog.51cto.com/u_16129621/6350074

相关文章

  • 独立任务最优调度问题-动态规划
    问题描述:用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规......
  • 路径总和 leetcode——递归+回溯
    题目leetcode:113代码与解析这道题可以看做leetcode112和leetcode257合体这道题要遍历整棵树,把所有符合条件的路径添加进去,所以不需要返回值递归三部曲:确定参数和返回值要传入当前节点,和总和,不需要返回值确定终止条件如果当前节点没有叶子结点,并且和等于target.那么添加进r......
  • 算法学习day25回溯part02-216、17
    packageLeetCode.backtrackpart02;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;/***216.组合总和III*找出所有相加之和为n的k个数的组合,且满足下列条件:*只使用数字1到9*每个数字最多使用一次*返回所有可能的有效......
  • 7、递归和回溯法
    内容来自刘宇波老师玩转算法面试7.1、树形问题7.2、什么是回溯7.3、排列问题7.4、组合问题7.5、回溯法解决组合问题的优化7.6、二维平面上的回溯法WordSearch7.7、floodfill算法,一类经典问题NumberofIslands-7.8、回溯法是经典人工智能的基础NQueens......
  • 基于模型预测控制(自带的mpc模块)和最优控制理论的Carsim与Matlab/simulink联合仿真实现
    基于模型预测控制(自带的mpc模块)和最优控制理论的Carsim与Matlab/simulink联合仿真实现汽车主动避撞和跟车功能(acc自适应巡航),包含simulink模型(其中有车辆逆纵向动力学模型、逆发动机模型、切换控制逻辑等),Carsim模型,资料。(最好用Carsim2016版本及以上版本,模型不是很难,适合新手初步学......
  • 利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数,获取最
    利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数,获取最优的权值和阈值在反向输入到BP神经网络里构建回归预测模型,同时能够打印出模型的多个评价指标,具体效果可以看图ID:3250669194443543......
  • 利用鲸鱼算法WOA优化随机森林RF,确定最优的叶子节点数与树数,然后将最优的参数输入随机
    利用鲸鱼算法WOA优化随机森林RF,确定最优的叶子节点数与树数,然后将最优的参数输入随机森林模型中做多维输入单维输出的回归预测,实现提高模型预测精度的效果,模型中都有基本的注释和测试数据集,直接替换数据就可以使用。ID:7430667081761891......
  • CRUISE纯电动车双电机四驱仿真模型,基于simulink DLL联合仿真模型,实现前后电机效率最优
    CRUISE纯电动车双电机四驱仿真模型,基于simulinkDLL联合仿真模型,实现前后电机效率最优及稳定性分配。关于模型:1.策略是用64位软件编译的,如果模型运行不了请将软件切换成64位。切换位置在启动界面platform,或者进入软件后点option→layout。另外需要注意的是,模型存放路径不要有中文......
  • 基于二阶锥规划的主动配电网动态最优潮流求解 关键词:配电网优化
    基于二阶锥规划的主动配电网动态最优潮流求解关键词:配电网优化二阶锥优化动态优化最优潮流仿真代码:MATLABYALMIP+CPLEX优势:代码注释详实,适合参考学习!主要内容:代码主要主要研究的配电网优化,具体为配电网中的最优潮流优化,考虑了风电、CB、SVG以及OLTC等设备,更加具有代表性,同时......
  • 【转载】基于物料限制逆向实现产品组合的最优规划
    原文:https://www.logclub.com/articleInfo/NTEwNzg= 在之前的案例中,我们分享的主要是如何用算法模型来提高决策效率与质量,并以此节约运营成本,整体上是如何把已有的事情做的更快更好。这次给大家分享的是,过去比较少见,但是当前越发频繁的场景,就是关键物料短缺下如何实现资源效率......