排班问题请教各位大神

fw347969680 2013-05-10 11:20:11
最近要做一个排班系统,排版系统的一些具体要求如下:(1)人员信息是存在数据库中的,现假定有5个;(2)班次分为白班和夜班,每天两个人值白班,两个人值夜班,另外一个人休息;(3)周末和节假日暂时不考虑放假;(4)排班一个月排一次。大概就是上面说的这样。求好点的具体思路、方法、算法。
...全文
160 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fw347969680 2013-05-15
  • 打赏
  • 举报
回复
引用 6 楼 a312983516 的回复:
[quote=引用 4 楼 fw347969680 的回复:] [quote=引用 3 楼 a312983516 的回复:]

//当前人数
		String [] personnels = new String[]{"老大","老二","老三","老四","老五"};
		
		//N个人一组
		int rules = 2;

		//一天N个轮班
		int shift = 2;
		
		//游标
		int num = 0;
		
		for(int i=1;i<=12;i++){
			String personnel = "";
			for(int k=1;k<=shift;k++){
				String value = "第"+k+"班 由";
				for(int j=0;j<rules;j++){
					value += personnels[num]+"和";
					num++;
					
					if(num>=personnels.length)
						num=0;
				}
				personnel += value.subSequence(0, value.length()-1)+"执勤    ";
			} 
			System.out.println(i+"月份:"+personnel);
		}


1月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
2月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
3月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
4月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
5月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
6月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
7月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
8月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
9月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
10月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
11月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
12月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
应该不是月份吧?而是几号吧。而且这样的话从6月份开始就重复了。[/quote] 把月份换成天不就行了? 排表还不能重复? 就那么几个人,怎么可能不重复,而且不明白不重复有什么意义。[/quote] 好吧,是我太执着于不重复了。
a312983516 2013-05-13
  • 打赏
  • 举报
回复
引用 4 楼 fw347969680 的回复:
[quote=引用 3 楼 a312983516 的回复:]

//当前人数
		String [] personnels = new String[]{"老大","老二","老三","老四","老五"};
		
		//N个人一组
		int rules = 2;

		//一天N个轮班
		int shift = 2;
		
		//游标
		int num = 0;
		
		for(int i=1;i<=12;i++){
			String personnel = "";
			for(int k=1;k<=shift;k++){
				String value = "第"+k+"班 由";
				for(int j=0;j<rules;j++){
					value += personnels[num]+"和";
					num++;
					
					if(num>=personnels.length)
						num=0;
				}
				personnel += value.subSequence(0, value.length()-1)+"执勤    ";
			} 
			System.out.println(i+"月份:"+personnel);
		}


1月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
2月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
3月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
4月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
5月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
6月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
7月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
8月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
9月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
10月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
11月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
12月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
应该不是月份吧?而是几号吧。而且这样的话从6月份开始就重复了。[/quote] 把月份换成天不就行了? 排表还不能重复? 就那么几个人,怎么可能不重复,而且不明白不重复有什么意义。
fw347969680 2013-05-12
  • 打赏
  • 举报
回复
还有人有好的方法吗?
fw347969680 2013-05-11
  • 打赏
  • 举报
回复
引用 3 楼 a312983516 的回复:

//当前人数
		String [] personnels = new String[]{"老大","老二","老三","老四","老五"};
		
		//N个人一组
		int rules = 2;

		//一天N个轮班
		int shift = 2;
		
		//游标
		int num = 0;
		
		for(int i=1;i<=12;i++){
			String personnel = "";
			for(int k=1;k<=shift;k++){
				String value = "第"+k+"班 由";
				for(int j=0;j<rules;j++){
					value += personnels[num]+"和";
					num++;
					
					if(num>=personnels.length)
						num=0;
				}
				personnel += value.subSequence(0, value.length()-1)+"执勤    ";
			} 
			System.out.println(i+"月份:"+personnel);
		}


1月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
2月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
3月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
4月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
5月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
6月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
7月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
8月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
9月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
10月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
11月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
12月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
应该不是月份吧?而是几号吧。而且这样的话从6月份开始就重复了。
ylovep 2013-05-10
  • 打赏
  • 举报
回复
本人思路 排列组合 12345 可能的组合有 5*4*3*2*1 =120 种 若有重复过滤掉 及 12, 34 , 5 和 21, 34 , 5 其实本质在排班上一样 得到过滤后的数据 第二 选择一个月的数据 (保证数据在排班上公平性,及每人白班夜班休息概率一样) 第三循环得出数据
a312983516 2013-05-10
  • 打赏
  • 举报
回复

//当前人数
		String [] personnels = new String[]{"老大","老二","老三","老四","老五"};
		
		//N个人一组
		int rules = 2;

		//一天N个轮班
		int shift = 2;
		
		//游标
		int num = 0;
		
		for(int i=1;i<=12;i++){
			String personnel = "";
			for(int k=1;k<=shift;k++){
				String value = "第"+k+"班 由";
				for(int j=0;j<rules;j++){
					value += personnels[num]+"和";
					num++;
					
					if(num>=personnels.length)
						num=0;
				}
				personnel += value.subSequence(0, value.length()-1)+"执勤    ";
			} 
			System.out.println(i+"月份:"+personnel);
		}


1月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
2月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
3月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
4月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
5月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
6月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
7月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
8月份:第1班 由老四和老五执勤    第2班 由老大和老二执勤    
9月份:第1班 由老三和老四执勤    第2班 由老五和老大执勤    
10月份:第1班 由老二和老三执勤    第2班 由老四和老五执勤    
11月份:第1班 由老大和老二执勤    第2班 由老三和老四执勤    
12月份:第1班 由老五和老大执勤    第2班 由老二和老三执勤    
fw347969680 2013-05-10
  • 打赏
  • 举报
回复
引用 1 楼 ylovep 的回复:
本人思路 排列组合 12345 可能的组合有 5*4*3*2*1 =120 种 若有重复过滤掉 及 12, 34 , 5 和 21, 34 , 5 其实本质在排班上一样 得到过滤后的数据 第二 选择一个月的数据 (保证数据在排班上公平性,及每人白班夜班休息概率一样) 第三循环得出数据
如果总人数变成7或者更大的数字,那样你的方法的第一步得到的数据就有点大了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧