流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)
问题描述:有二条流水线,每条流水线都有n个站,流水线1,2站j的处理功能相同,但处理时间可能不同,每个站都有一个处理时间,而且从一条流水线的站j-1到另一条流水线站j有一个消耗时间t1[j-1](从流水线1到2)或t2[j-1](从流水线2到1),同一条流水线站j-1到站j的消耗时间忽略不计,物品上每一条流水线有个时间,下每一条流水线也有一个时间。
--------------------------目标:找出处理物品的最小时间(动态规划问题)-----------------------
// 流水线调度问题.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include<iostream>
#define N 100
using namespace std;
typedef int timeType;
// f1[j],f2[j]分别存储到流水线1,2站j的最少时间
//j>=1
timeType f1[N],f2[N];
//l1[j],l2[j]分别存储到流水线1,2站j是哪一条流水线的站j-1来的
//j>=2
int l1[N],l2[N];
//存储物品处理的最小时间
timeType fx;
//lx存储最后是从哪条流水线流出
int lx;
//存储每一个站点的处理时间 a1[j]表示流水线1的站点j上的处理时间
//j>=1
timeType a1[N],a2[N];
//存储转换流水线需要的时间 t1[j-1]表示从流水线1站j-1转换到流水线2站j需要的时间
//j>=2
timeType t1[N],t2[N];
//存储分别物品上流水线1,2的时间
timeType e1,e2;
//存储分别物品下流水线1,2的时间
timeType x1,x2;
//存储最终的路径
int line[N];
/*
void print_line(int *l1,int * l2,int line,int n)
{
if(n==2)
{
if(line==1)
{
cout<<"line: "<<l1[n]<<"station: "<<n-1<<endl;
line = l1[n];
}
else
{
cout<<"line: "<<l2[n]<<"station: "<<n-1<<endl;
line = l2[n];
}
}
else
{
print_line(l1,l2,line,n-1);
cout<<
}
}
*/
//输出路径,从后往前把路径倒存入到line数组中,然后输出
void print_line(int *l1,int *l2,int *line,int lx,int n)
{
int i = lx;
line[n] = lx;
int j;
for(j=n;j>1;j--)
{
if(i==1)
{
i = l1[j];
line[j-1] = i;
}
else
{
i = l2[j];
line[j-1] = i;
}
}
for(j=1;j<=n;j++)
cout<<"line: "<<line[j]<<",station: "<<j<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例个数:"<<endl;
cin>>cases;
while(cases--)
{
//初始化各变量
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
memset(l1,0,sizeof(l1));
memset(l2,0,sizeof(l2));
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
memset(line,0,sizeof(line));
lx=e1=e2=x1=x2=0;
cout<<"请输入流水线站点个数:"<<endl;
int n;
cin>>n;
int i;
cout<<"请输入上流水线1需要消耗的时间:"<<endl;
cin>>e1;
cout<<"请输入上流水线2需要消耗的时间:"<<endl;
cin>>e2;
cout<<"请输入下流水线1需要消耗的时间:"<<endl;
cin>>x1;
cout<<"请输入下流水线2需要消耗的时间:"<<endl;
cin>>x2;
cout<<"请输入流水线1每个站点的处理时间:"<<endl;
for(i=1;i<=n;i++)
cin>>a1[i];
cout<<"请输入流水线2每个站点的处理时间:"<<endl;
for(i=1;i<=n;i++)
cin>>a2[i];
cout<<"请输入流水线1站点i转换到流水线站2站点i+1消耗时间:"<<endl;
for(i=1;i<n;i++)
cin>>t1[i];
cout<<"请输入流水线2站点i转换到流水线站1站点i+1消耗时间:"<<endl;
for(i=1;i<n;i++)
cin>>t2[i];
f1[1] = a1[1] + e1;
f2[1] = a2[1] + e2;
int j;
for(j=2;j<=n;j++)
{
if(f1[j-1]+a1[j]<=f2[j-1]+t2[j-1]+a1[j])
{
f1[j] = f1[j-1] + a1[j];
l1[j] = 1;
}
else
{
f1[j] = f2[j-1] + t2[j-1] + a1[j];
l1[j] = 2;
}
if(f2[j-1]+a2[j]<=f1[j-1]+t1[j-1]+a2[j])
{
f2[j] = f2[j-1] + a2[j];
l2[j] = 2;
}
else
{
f2[j] = f1[j-1] + t1[j-1] + a2[j];
l2[j] = 1;
}
}
if(f1[n]+x1<=f2[n]+x2)
{
fx = f1[n] + x1;
lx = 1;
}
else
{
fx = f2[n] + x2;
lx = 2;
}
cout<<"输出路径:"<<endl;
print_line(l1,l2,line,lx,n);
cout<<"最少消耗时间为:"<<fx<<endl;
}
system("pause");
return 0;
}
-----------------------------------以下为程序测试:--------------------------------
请输入案例个数:
1
请输入流水线站点个数:
6
请输入上流水线1需要消耗的时间:
2
请输入上流水线2需要消耗的时间:
4
请输入下流水线1需要消耗的时间:
3
请输入下流水线2需要消耗的时间:
2
请输入流水线1每个站点的处理时间:
7 9 3 4 8 4
请输入流水线2每个站点的处理时间:
8 5 6 4 5 7
请输入流水线1站点i转换到流水线站2站点i+1消耗时间:
2 3 1 3 4
请输入流水线2站点i转换到流水线站1站点i+1消耗时间:
2 1 2 2 1
输出路径:
line: 1,station: 1
line: 2,station: 2
line: 1,station: 3
line: 2,station: 4
line: 2,station: 5
line: 1,station: 6
最少消耗时间为:38
请按任意键继续. . .
分享到:
相关推荐
混合流水车间调度问题是一个典型的组合优化问题,它涉及到在有限的资源和时间限制下,合理安排一系列作业在多个机器上的顺序,以达到最小化总加工时间或最大化生产效率的目标。 首先,遗传算法是一种基于生物进化...
总结来说,"单功能非线性流水线的调度 Java实现"涉及了数据结构(如图、队列)、算法(如优先级队列调度、回溯法)、对象建模(Task类)、状态管理和性能评估等多个IT领域的知识点。通过理解和应用这些概念,可以...
在C#编程环境中实现非线性流水线调度算法,开发者可以利用高级语言的抽象性和丰富的库支持来设计和调试算法。C#不仅提供了丰富的数据结构和控制流语句,还有强大的多线程和异步操作支持,这在实现并发和并行计算时...
【车间调度】基于遗传算法求解混合流水车间调度最优问题matlab源码.md
【单功能非线性流水线最佳调度程序】是一种在计算机系统结构中常见的优化问题,它涉及到如何有效地安排流水线中的各个功能段,以达到最高的工作效率。在非线性流水线中,不同功能段的执行时间可能不一致,这使得调度...
【标题】"北邮高级计算机体系结构课程——非线性流水线调度作业可视化作业"涉及到的是计算机体系结构中的一个重要概念,即流水线技术,并且强调了非线性的调度方法。在计算机体系结构中,流水线是一种提高处理器效率...
流水线调度问题是一种常见的...总的来说,动态规划法在解决流水线调度问题时展示了其强大之处,能够找到全局最优解,且适用于多种类似的优化问题。学习并掌握这种算法对提高编程能力和解决实际问题的能力非常有帮助。
总的来说,解决流水作业调度问题的关键在于理解动态规划的思想,利用最优子结构和Johnson法则,通过构建合适的数学模型和算法来找到最节省时间的作业顺序。在实际应用中,这种问题可以广泛应用于生产计划、任务分配...
动态规划实现流水作业调度,运用Johnson法则的算法
流水作业的最优调度问题是一个经典的优化问题,主要目标是在有限的资源条件下,通过合理安排作业的加工顺序,最小化整体的完成时间。这个问题通常出现在生产流程中,涉及到多个任务需要在多台机器上依次进行处理。 ...
在独立任务最优调度问题中,我们可以定义一个状态转移方程,表示在某个时间点,有n个任务需要调度,每个任务都有自己的执行时间和优先级,我们要找到一种调度策略,使得所有任务的完成时间最短。 假设每个任务用(i,...
一种对非线性流水线调度问题的C++解决方案
在处理独立任务最优调度问题时,通常会使用动态规划或贪心策略。动态规划方法通常能保证找到全局最优解,而贪心策略可能在某些情况下接近最优,但不保证总是最优。在王晓东教授的课后习题中,所用的方法可能是这些...
例如,在制造业中,Johnson算法可以用于解决生产流水线的调度问题。在这个问题中,我们需要将多个产品的生产任务安排到多个机器上,以便尽量减少生产时间。Johnson算法可以有效地解决这个问题,并且可以提高生产效率...
4. 动态规划:在某些情况下,装配线调度问题可以用动态规划方法解决。通过建立状态转移方程,可以找到最优的调度策略,避免重复计算。 5. 并行处理:如果系统资源允许,可以利用多核处理器的并行计算能力,通过并发...
流水作业调度C++(贪心算法)流水作业调度C++(贪心算法)流水作业调度C++(贪心算法)
【装配线动态调度】是指在汽车工厂中,利用动态规划算法优化装配线的作业顺序,以达到最小化汽车从进入工厂到出厂总时间的目标。在这个问题中,工厂有两条装配线,每条线由n个装配站组成。每个站Si,j对应一定的装配...
1. **动态规划**:用于解决流水作业最优调度,优化任务顺序以达到最小化总完成时间的目标。 2. **分治策略**:用于解决棋盘覆盖问题,通过递归将问题拆分为更小的部分并逐个解决。 3. **Java编程**:实现这两个算法...
### 动态规划解决装配线调度问题 #### 问题背景及描述 在现代制造业中,装配线调度问题是一项常见的挑战,特别是在汽车制造业中。本文旨在介绍如何应用动态规划方法来解决此类问题,以达到最优化的目标。具体而言...
实现3-1独立任务最优调度问题.cpp