dp经典问题:装配线调度

dp经典问题:装配线调度

装配线调度问题(Assembly Line Scheduling Problem) 是一个经典的动态规划问题。这个问题的目标是通过在两条装配线上调度任务,来最小化完成整个装配过程所需的总时间。


问题描述

假设有两条装配线,每条装配线上有𝑛个工作站。每个工作站都需要一定的时间来处理其任务:

a 1 [ i ] ← 第一条装配线处理第 i 个任务所需要的时间 a_1[i] \gets 第一条装配线处理第 i 个任务所需要的时间 a1[i]第一条装配线处理第i个任务所需要的时间
a 2 [ i ] ← 第二条装配线处理第 i 个任务所需要的时间 a_2[i] \gets 第二条装配线处理第 i 个任务所需要的时间 a2[i]第二条装配线处理第i个任务所需要的时间

此外,从一个装配线切换到另一装配线是需要时间的

t 1 [ i ] ← 装配线 1 切换到装配线 2 并到达第 i 个工作站的时间。 t_1[i] \gets 装配线 1 切换到装配线 2 并到达第 i 个工作站的时间。 t1[i]装配线1切换到装配线2并到达第i个工作站的时间。
t 2 [ i ] ← 装配线 2 切换到装配线 1 并到达第 i 个工作站的时间。 t_2[i] \gets 装配线 2 切换到装配线 1 并到达第 i 个工作站的时间。 t2[i]装配线2切换到装配线1并到达第i个工作站的时间。

最初进入装配线的时间

e 1 ← 表示进入装配线 1 的时间。 e_1 \gets 表示进入装配线 1 的时间。 e1表示进入装配线1的时间。

e 2 ← 表示进入装配线 2 的时间。 e_2 \gets 表示进入装配线 2 的时间。 e2表示进入装配线2的时间。

离开装配线的时间

x 1 ← 表示离开装配线 1 的时间 x_1 \gets 表示离开装配线1的时间 x1表示离开装配线1的时间

x 2 ← 表示离开装配线 2 的时间 x_2 \gets 表示离开装配线2的时间 x2表示离开装配线2的时间

问题分析

Step1:识别状态

T i [ j ] ← 到达第 i 条装配线上第 j 个工作站的最短时间 T_i[j] \gets 到达第 i 条装配线上第j个工作站的最短时间 Ti[j]到达第i条装配线上第j个工作站的最短时间

Step2:给出边界条件

最初进入装配线的时间为
T 1 [ 0 ] = e 1 + a 1 [ 0 ] T_1[0] = e_1+a_1[0] T1[0]=e1+a1[0]
T 2 [ 0 ] = e 2 + a 2 [ 0 ] T_2[0] = e_2+a_2[0] T2[0]=e2+a2[0]

Step3:写出状态转移方程

为了从一个工作站转移到下一个工作站,我们有两种选择:继续在当前装配线上,或者切换到另一条装配线。每次都是从最优子问题解的状态转移到当前状态,具体的状态转移方程如下:

T 1 [ i ] = m i n ( T 1 [ i − 1 ] + a 1 [ i ] , T 2 [ i − 1 ] + a 1 [ i ] + t 2 [ i ] ) T_1[i] = min(T1[i-1]+a_1[i],T2[i-1]+a_1[i]+t_2[i]) T1[i]=min(T1[i1]+a1[i],T2[i1]+a1[i]+t2[i])
T 2 [ i ] = m i n ( T 2 [ i − 1 ] + a 2 [ i ] , T 1 [ i − 1 ] + a 2 [ i ] + t 1 [ i ] ) T_2[i] = min(T2[i-1]+a_2[i],T1[i-1]+a_2[i]+t_1[i]) T2[i]=min(T2[i1]+a2[i],T1[i1]+a2[i]+t1[i])

Step3:递推最终状态

从进入装配线开始进行递推,每一次的状态都是最优子问题解,最终构成了最优结构。

T n = m i n ( T 1 [ n − 1 ] + x 1 , T 2 [ n − 1 ] + x 2 ) T_n=min(T_1[n-1]+x1,T_2[n-1]+x2) Tn=min(T1[n1]+x1,T2[n1]+x2)

#include<iostream>
#include<vector>

using namespace std;

int assembly(vector<int>&a1,vector<int>&a2,vector<int>&t1,vector<int>&t2,int e1,int e2,int x1,int x2,int n){
    vector<int>T1(n);
    vector<int>T2(n);
    T1[0]=e1+a1[0];
    T2[0]=e2+a2[0];
    for(int i=1;i<n;i++){
        T1[i]=min(T1[i-1]+a1[i],T2[i-1]+a2[i]+t2[i]);
        T2[i]=min(T2[i-1]+a2[i],T1[i-1]+a1[i]+t1[i]);
    }
    return min(T1[n-1]+x1,T2[n-1]+x2);
}

int main() {
    vector<int> a1 = {4, 5, 3, 2};
    vector<int> a2 = {2, 10, 1, 4};
    vector<int> t1 = {0, 7, 4, 5};
    vector<int> t2 = {0, 9, 2, 8};
    int e1 = 10, e2 = 12, x1 = 18, x2 = 7;
    int n = a1.size();
    
    cout << "Minimum cost: " << assembly(a1, a2, t1, t2, e1, e2, x1, x2, n) << endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/735018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【非常实验】如何在移动设备上运行 Docker?

本章就从在 DevOps 中最基本但也是最强大的工具 Docker 开始。最近,我在尝试更多Termux的可能性,于是就想着试试Docker适不适合arm架构。 我用的是天玑9000芯片,而不是高通,所以显示不出来 Qualcomm。所以我决定从在手机上运行 docker 开始,但这可能吗?让我们一起来看看吧…

高性能并行计算华为云实验三:蒙特卡罗算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建蒙特卡罗算法源码 3.2 Makefile的创建与编译 3.3 主机文件配置与运行监测​​​​​​​ 四、实验结果与分析 4.1 原教程对应的实验结果 4.2 改进后的实验结果 五、实验思考与总结 5.1 实验思考 5.2 实验总结…

从零实现GPT【1】——BPE

文章目录 Embedding 的原理训练特殊 token 处理和保存编码解码完整代码 BPE&#xff0c;字节对编码 Embedding 的原理 简单来说就是查表 # 解释embedding from torch.nn import Embedding import torch# 标准的正态分布初始化 也可以用均匀分布初始化 emb Embedding(10, 32) …

探索Agent AI智能体的未来

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;Agent AI智能体正成为一种改变世界的新力量。这些智能体不仅在当前的技术领域中发挥着重要作用&#xff0c;而且在未来将以更深远的影响改变我们的生活、工作和社会结构。本文将探讨Agent AI智能体的现状、潜…

回顾今年的618大战:除了卷低价,还有别的出路吗?

今年的618刚刚落下帷幕&#xff0c;大促期间&#xff0c;一些电商平台纷纷备足马力、迎接挑战&#xff0c;反倒是一向领跑的淘宝京东公开表示&#xff0c;今年取消了618预售制。 互联网电商20年来&#xff0c;每年618、双11轮流登场&#xff0c;“低价大战”愈演愈烈&#xff0…

【C++】类和对象2.0

俺来写笔记了&#xff0c;哈哈哈&#xff0c;浅浅介绍类和对象的知识点&#xff01; 1.类的6个默认成员函数 俺们定义一个空类&#xff1a; class N {}; 似乎这个类N里面什么都没有&#xff0c;其实不是这样子的。这个空类有6个默认的成员函数 。 默认成员函数&#xff1a…

Android 你应该知道的学习资源 进阶之路贵在坚持

coderzheaven 覆盖各种教程&#xff0c;关于Android基本时案例驱动的方式。 非常推荐 thenewcircle 貌似是个培训机构&#xff0c;多数是收费的&#xff0c;不过仍然有一些free resources值得你去挖掘。 coreservlets 虽然主打不是android&#xff0c;但是android的教程也​ 是…

【前端技术】标签页通讯localStorage、BroadcastChannel、SharedWorker的技术详解

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

MySQL之复制(十二)

复制 复制的问题和解决方案 未定义的服务器ID 如果没有在my.cnf里面定义服务器ID,可以通过CHANGE MASTER TO 来设置备库&#xff0c;但却无法启动复制。 mysql>START SLAVE; ERROR 1200(HY000):The server is not configured as slave;fix in config file or with CHANG…

实验13 简单拓扑BGP配置

实验13 简单拓扑BGP配置 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种用于自治系统间的动态路由协议&#xff0c;用于在自治系统&#xff08;AS&…

汇聚荣做拼多多运营怎么样?

汇聚荣做拼多多运营怎么样?在电商行业竞争日益激烈的今天&#xff0c;拼多多作为一家迅速崛起的电商平台&#xff0c;吸引了众多商家入驻。对于汇聚荣这样的企业而言&#xff0c;选择在拼多多上进行商品销售和品牌推广&#xff0c;无疑需要一套高效的运营策略。那么&#xff0…

技术师增强版,系统级别的工具!【不能用】

数据安全是每位计算机用户都关心的重要问题。在日常使用中&#xff0c;我们经常面临文件丢失、系统崩溃或病毒感染等风险。为了解决这些问题&#xff0c;我们需要可靠且高效的数据备份与恢复工具。本文将介绍一款优秀的备份软件&#xff1a;傲梅轻松备份技术师增强版&#xff0…

【MySQL数据库】:MySQL视图特性

目录 视图的概念 基本使用 准备测试表 创建视图 修改视图影响基表 修改基表影响视图 删除视图 视图规则和限制 视图的概念 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图中的数据…

地下管线管网三维建模系统MagicPipe3D

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

多功能投票系统(ThinkPHP+FastAdmin+Uniapp)

让决策更高效&#xff0c;更民主&#x1f31f; ​基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码…

Android MVP模式 入门

View&#xff1a;对应于布局文件 Model&#xff1a;业务逻辑和实体模型 Controllor&#xff1a;对应于Activity 看起来的确像那么回事&#xff0c;但是细细的想想这个View对应于布局文件&#xff0c;其实能做的事情特别少&#xff0c;实际上关于该布局文件中的数据绑定的操…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

【SSM】医疗健康平台-管理端-检查组管理

技能目标 掌握新增检查组功能的实现 掌握查询检查组功能的实现 掌握编辑检查组功能的实现 掌握删除检查组功能的实现 体检的检查项种类繁多&#xff0c;为了方便管理和快速筛选出类别相同的检查项&#xff0c;医疗健康将类别相同的检查项放到同一个检查组中进行管理&#…

ANR灵魂拷问:四大组件中的onCreate-onReceive方法中Thread-sleep(),会产生几个ANR-

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { sleepTest(); } }); sleepTest方法详情 public void sleepTest(){ new Handler().postDelayed(new Runnable() { Override public void run() { Button but…

<Rust><iced>在iced中显示gif动态图片的一种方法

前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。 环境配置 系统&#xff1a;window 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;iced、image 概述 在iced中&#xff0c;提供了image部件&#xff0c;从理论上说&…