护士排班算法,急急

yihuicao 2008-10-02 11:24:09
//排夜班
int y ;//年轻护士人数
Random ran=new Random();
for(int x=1;x<8;x++)
for(int m=0;m<i5;m++)
{
//i5:用户所选拍夜班人数
table.setValueAt("夜班",row-i5+m,0);
//row-i5+m:在表格的后i5行显示
table.setValueAt(youngname[ran.nextInt(y)],row-i5+m,x);
//youngname[ran.nextInt(y)]:在年轻护士中产生随机护士名单
}

??问题:
现在的算法,有可能将某一护士连排俩夜班,这种问题该怎么解决?能不能帮忙写一下算法?
...全文
2099 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pangtaitao 2008-10-07
  • 打赏
  • 举报
回复
public class Test {

public Test(){
List listHs = new ArrayList();//定义护士list集合
//添加几个护士
listHs.add("护士1");
listHs.add("护士2");
listHs.add("护士3");
listHs.add("护士4");
listHs.add("护士5");
listHs.add("护士6");
listHs.add("护士7");
this.start(listHs);
}
/**
* 给护士排班
* @param listHs
* */
public void start(List listHs){
int iHsNum = listHs.size();
int iDelHs = 0;
if(iHsNum == 0 ){
return;
}
Random random = new Random();
iDelHs = random.nextInt(iHsNum);
//如果先中此护士,那么就把此护士从队列中移除
//当然你可以把移除的护士保存在一个相对全局的变量中(List),这样就得到护士的值班次序了
System.out.println(listHs.remove(iDelHs).toString());
this.start(listHs);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
new Test();
}

}
zhuyx808 2008-10-06
  • 打赏
  • 举报
回复
根据具体人数排吧,建立一个排班规则,别随机抽,随机抽取当然会有不公平问题存在
e_snow 2008-10-06
  • 打赏
  • 举报
回复
设立起始点,每次顺次加一不就得了,这是最简单的方法
ycnanevol 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hepeng19861212 的回复:]
看了半天也灭看懂你要说什么。
建议你详细描述一下该题目,然后再发出来。

想要避免某一护士连排俩夜班?那就用一个变量存储前一个随机产生的护士,然后接下来每产生一个,就和前一个的作比较:如果相同,则此次不算;如果不同,则算。
[/Quote]

我也这样觉得
yihuicao 2008-10-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hepeng19861212 的回复:]
看了半天也灭看懂你要说什么。
建议你详细描述一下该题目,然后再发出来。

想要避免某一护士连排俩夜班?那就用一个变量存储前一个随机产生的护士,然后接下来每产生一个,就和前一个的作比较:如果相同,则此次不算;如果不同,则算。
[/Quote]
要求就是将数据库中保存的护士,从周一到周日按早、中、晚、夜四班排班。排班人数由用户所定:i2,i3,i4、i5。且考虑夜半年龄上限i1,并将结果显示在表格中。代码如下

//将数据库中保存的护士读到id[],name[],age[]
try{
sql="SELECT * FROM nurse";
rs=db.getResult(sql);
ResultSetMetaData rsmd=rs.getMetaData();
rs.last();
int rNum=rs.getRow();
rs.first();
id=new String[rNum];
name=new String[rNum];
age=new int[rNum];

while(rs.next())
{
//rs.next();
id[i]=(String)rs.getObject("ID");
name[i]=(String)rs.getObject("name");
age[i]=Integer.parseInt(rs.getObject("age").toString());
this.i++;
}

}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"读取信息错误!");
}

//排班人数由用户所定:i2,i3,i4、i5
int i1 = Integer.parseInt((String)comb1.getSelectedItem());
int i2 = Integer.parseInt((String)comb2.getSelectedItem());
int i3 = Integer.parseInt((String)comb3.getSelectedItem());
int i4 = Integer.parseInt((String)comb4.getSelectedItem());
int i5 = Integer.parseInt((String)comb5.getSelectedItem());
row=i2+i3+i4+i5;

//区分夜班年龄
youngid=new String[i];
youngname=new String[i];
oldid=new String[i];
oldname=new String[i];
for(int j=0;j<i;j++){
if(age[j]<i1){
youngid[y]=id[j];
youngname[y]=name[j];
y++;
}
else{
oldid[d]=id[j];
oldname[d]=name[j];
d++;
}
}
//定义表格
model = new DefaultTableModel(columnNames, row);
table = new JTable(model);
JScrollPane tablePane = new JScrollPane(table);
con.add(tablePane, BorderLayout.CENTER);

//先排夜班
Random ran=new Random();
for(int x=1;x<8;x++)
for(int m=0;m<i5;m++)
{
//表格第一列为班种
table.setValueAt("夜班",row-i5+m,0);
???table.setValueAt(youngname[ran.nextInt(y)],row-i5+m,x);

}
???怎么写排班才合理,才能做到一周上班数公平,班次又不冲突。
horizonlyhw 2008-10-02
  • 打赏
  • 举报
回复
也不知道你这是按照什么选护士? 时间? 科室?
hfl832 2008-10-02
  • 打赏
  • 举报
回复
做Swing应用?顶下
daimojingdeyu 2008-10-02
  • 打赏
  • 举报
回复
做值日大家要轮流来,怎么能用随机数呢~~~要是一个护士运气不好一个周被随机个两三次那还了得.排个固定的值日不行吗?
爱摸鱼de老邪 2008-10-02
  • 打赏
  • 举报
回复
跟gui没有关系吧。楼上的方法不错,简单易行。
hepeng19861212 2008-10-02
  • 打赏
  • 举报
回复
看了半天也灭看懂你要说什么。
建议你详细描述一下该题目,然后再发出来。

想要避免某一护士连排俩夜班?那就用一个变量存储前一个随机产生的护士,然后接下来每产生一个,就和前一个的作比较:如果相同,则此次不算;如果不同,则算。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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