装配线调度

2024-01-20 05:10
文章标签 调度 装配线

本文主要是介绍装配线调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

汽车生产工厂共有两条装配线,每条有n个装配站;装配线i 的第j 个装配站表示为Si,j,在该站的装配时间为ai,j。一个汽车底盘进入工厂,然后进入装配线ii 12),花费时间为ei。在通过一条线的第j 个装配站后,这个底盘来到任一条线的第(j+1)个装配站。如果它留在相同的装配线,则没有移动开销;如果它移动到另一条线上,则花费时间为ti,j。在离开一条线的第n个装配站后,完成的汽车花费时间xi 离开工厂。确定应该在装配线1内选择哪些站,在装配线2内选择哪些站,才能使汽车通过工厂的总时间最小。

问题分析:

初看该问题,最简单的解决方案就是遍历法,在遍历的过程中得出最小时间。但应当看到,当站点数n较大时,需要遍历2n次方条路线,效率是较低的。那么,有没有效率更高的解决方案呢?

为了方便分析问题,我们为该问题建立一个简单的数学模型。假设通过装配站j的最短总时间为f(j),通过装配站j的最短路线选择的装配线是r(j)r(j)的值为12),则汽车通过工厂的总时间为f=f(n)+x(r(n))。那么,现在关键的问题就是要计算出f(n)r(n)。汽车通过装配站n的路线中也必然通过了装配站n-1,我们可以来看看通过装配站n的最短总时间f(n)和选择的装配线r(n)与通过装配站n-1的最短总时间f(n-1)和选择的装配线r(n-1)之间有没有什么关联。通过分析应当不难得出,如果计算出了f(n-1)r(n-1),则f(n)就是f(n-1)加上从第n-1个装配站到第n个装配站的最短时间。而知道了r(n-1),计算从第n-1个装配站到第n个装配站的最短时间是非常容易的,记!r(j)为另一条装配线,则只需要找出a(r(n-1),n)a(!r(n-1),n)+t(r(n-1), n-1)中的较小值即可

由此得出下列规划方程:

 

#include <iostream>
using namespace std;
int n;                 // 一个装配线上有n个装配站
int e1, e2;            // 进入装配线1,2需要的时间
int x1, x2;            // 离开装配线1,2需要的时间
int t[3][100];         // t[1][j]表示底盘从S[1][j]移动到S[2][j+1]所需时间,同理t[2][j]
int a[3][100];         // a[1][j]表示在装配站S[1][j]所需时间
int f1[100], f2[100];  // f1[j], f2[j]分别表示在第一/第二条装配线上第j个装配站的最优解
int ln1[100], ln2[100];// ln1[j]记录第一条装配线上,最优解时第j个装配站的前一个装配站是第一条线还是第二条线上
int f, ln;             // 最优解是,f代表最小花费时间,ln表示最后出来时是从装配线1还是装配线2
void DP()
{
f1[1] = e1 + a[1][1];
f2[1] = e2 + a[2][1];
for(int j=2; j<=n; ++j)
{
// 处理第一条装配线的最优子结构
if(f1[j-1] + a[1][j] <= f2[j-1] + t[2][j-1] + a[1][j])
{
f1[j] = f1[j-1] + a[1][j];
ln1[j] = 1;
}
else
{
f1[j] = f2[j-1] + t[2][j-1] + a[1][j];
ln1[j] = 2;
}
// 处理第二条装配线的最优子结构
if(f2[j-1] + a[2][j] <= f1[j-1] + t[1][j-1] + a[2][j])
{
f2[j] = f2[j-1] + a[2][j];
ln2[j] = 2;
}
else
{
f2[j] = f1[j-1] + t[1][j-1] + a[2][j];
ln2[j] = 1;
}
}
if(f1[n] + x1 <= f2[n] + x2)
{
f = f1[n] + x1;
ln = 1;
}
else
{
f = f2[n] + x2;
ln = 2;
}
}
void PrintStation()
{
int i= ln;
cout << "line " << i << ", station " << n << endl;
for(int j=n; j>=2; --j)
{
if(i == 1)
i = ln1[j];
else
i = ln2[j];
cout << "line " << i << ", station " << j-1 << endl;
}
}
int main()
{
//freopen("input.txt", "r", stdin);
cout << "输入装配站的个数: ";
cin >> n;
cout << "输入进入装配线1,2所需的时间e1, e2 :";
cin >> e1 >> e2;
cout << "输入离开装配线1, 2所需的时间x1, x2: ";
cin >> x1 >> x2;
cout << "输入装配线1上各站加工所需时间a[1][j]: ";
for(int i=1; i<=n; ++i)
cin >> a[1][i];
cout << "输入装配线2上各站加工所需时间a[2][j]: ";
for(int i=1; i<=n; ++i)
cin >> a[2][i];
cout << "输入装配线1上的站到装配线2上的站所需时间t[1][j]: ";
//注意这里是i<n,不是i<=n
for(int i=1; i<n; ++i)
cin >> t[1][i];
cout << "输入装配线2上的站到装配线1上的站所需时间t[2][j]: ";
for(int i=1; i<n; ++i)
cin >> t[2][i];
DP();
cout << "最快需要时间: " << f << endl;
cout << "路线是: " << endl;
PrintStation();
cout << endl;
} 
/*
9
2 3
3 5
1 2 4 1 5 2 3 5 4
2 5 6 3 4 8 1 5 4
3 2 5 4 2 6 8 1
1 2 3 6 5 2 3 4
9
3 5
2 3
2 5 6 3 4 8 1 5 4
1 2 4 1 5 2 3 5 4
1 2 3 6 5 2 3 4
3 2 5 4 2 6 8 1
*/ 


 

这篇关于装配线调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624882

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

目录 进程优先级: 是什么? 为什么存在进程优先级的概念呢? Linux为什么调整优先级是要受限制的? PRI vs NICE Linux的调度与切换 概念准备: 那我们到底怎样完成进程的调度和切换呢? 区分:寄存器VS寄存器的内容 Linux实现进程调度的算法,需要考虑优先级,考虑进程饥饿问题,考虑效率问题。 解决优先级问题: 解决进程饥饿问题: 解决效率的问题:

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1kind: Podmetadata:name: testpod01labels:app: myapp01env: test1spec:containers:- name: testpod01image: nginx:1.23.2---apiVersio

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所

RMS调度详解

1.RMS调度简介 任务按单调速率优先级分配(RMPA)的调度算法,称为单调速率调度(RMS)。RMPA是指任务的优先级按任务周期T来分配。它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级,周期长的任务优先级低。 2.RMS调度实现介绍 SylixOS目前关于RMS调度分为创建、删除、调度三个部分组成。创建和删除就不予介绍。重点关注下调度算法的实现。调度

Kubernetes Scheduler:Pod调度的双步骤—预选(Predicates)和优选(Priorities)

Kubernetes Scheduler:Pod调度的双步骤—预选(Predicates)和优选(Priorities) 1、预选(Predicates)2、优选(Priorities) 💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,Pod的调度是由Scheduler负责的。Scheduler通过两个关键步骤——预选(Predicat