| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1065 人关注过本帖
标题:再次请教学生如何分派
只看楼主 加入收藏
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2224
专家分:3903
注 册:2007-4-27
收藏
得分:0 
以下是引用chychychy在2024-12-5 20:58:25的发言:

感谢wengjl版提供的帮助,解决了我的大难题。为了满足学校对高分段学生均衡的要求,考虑前200名12344321蛇形排列,领导初步同意
剩下的按wengjl版的方式随机来处理。因水平有限,程序写起来很不简洁,请指教。同时请论坛内高手看看还有更好的方法解决吗
***第一步蛇形处理前200名
CLEAR
CLOSE DATABASES
MESSAGEBOX("准备打开需分派的数据表",0+48)
fn1=GETFILE('dbf','打开分派数据库')
USE (fn1) ALIAS bmk IN 0
BLANK FIELDS lqxxdm ALL &&清空录取学校代码字段,测试用

***先取出前200名,12344321蛇形分派
SELECT * FROM bmk ORDER BY zf DESC INTO CURSOR tmp READWRITE &&按总分降序排列


IF TYPE([zfwc])=[U] &&增加总分位次字段
    ALTER TABLE tmp ADD zfwc N(8)
ENDIF
UPDATE tmp SET zfwc=(SELECT COUNT(*)+1 FROM tmp AS b WHERE b.zf>tmp.zf) &&排列总分位次字段

IF TYPE([分派号])=[U]  &&增加分派号字段
    ALTER TABLE tmp ADD 分派号 N(2)
ENDIF
SELECT TOP 200 * FROM tmp ORDER BY zf DESC INTO CURSOR tmp200 READWRITE &&导出前200名临时表
SELECT tmp200

NN=4 &&重要:设定需分派数,此处为4个校区,如需增加减少,替换NN即可,顺序写入分班
REPLACE ALL 分派号 WITH IIF(MOD(RECNO()-1,2*NN)<NN,MOD(RECNO()-1,NN)+1,NN-MOD(RECNO()-1,NN))

SCAN FOR !EMPTY(分派号) &&&&按分派号替换写入录取学校代码lqxxdm
    DO CASE
    CASE 分派号=1
        REPLACE lqxxdm WITH '0100'
    CASE 分派号=2
        REPLACE lqxxdm WITH '0200'
    CASE 分派号=3
        REPLACE lqxxdm WITH '0300'
    CASE 分派号=4
        REPLACE lqxxdm WITH '0400'
    ENDCASE
ENDSCAN
*SELECT zkzh,zf,zfwc,分派号,lqxxdm FROM tmp200 ORDER BY zf DESC
*GO TOP
*BROWSE
*SELECT tmp
SELECT lqxxdm,COUNT(*) rs,AVG(zf) pjf GROUP BY 1 FROM tmp200 &&测试查看用
UPDATE tmp FROM tmp200 SET lqxxdm=tmp200.lqxxdm WHERE tmp.zkzh=tmp200.zkzh
UPDATE bmk from tmp200 SET lqxxdm=tmp200.lqxxdm WHERE bmk.zkzh=tmp200.zkzh &&&将前200名录取结果写回原始报名库

SELECT bmk

SELECT * FROM tmp where EMPTY(lqxxdm) INTO cursor tmp2 READWRITE

***第二步,按wengjl版的方式处理剩余数据
LOCAL zss1,zss2,zss3,zss4,lnCnt1,lnCnt2,lnCnt3,lnCnt4,xhkz

MESSAGEBOX("准备打开招生计划库数据表",0+48)
fn2=GETFILE('dbf','打开计划数据库')
USE (fn2) ALIAS zkjhk IN 0
SELECT *,zsrs-50 as zsrs1 FROM zkjhk INTO CURSOR zkjhk1 READWRITE &&减去上面的200人,4给校区各减去50人


COPY TO ARRAY laArr FIELDS zsrs1
*zss1=thisform.cont1.text1.value
*zss2=thisform.cont1.text2.value
*zss3=thisform.cont1.text3.value
*zss4=thisform.cont1.text4.value
zss1=laArr(1)
zss2=laArr(2)
zss3=laArr(3)
zss4=laArr(4)
?zss1 &&测试查看用
?zss2 &&测试查看用
?zss3 &&测试查看用
?zss4 &&测试查看用

xhkz=.T.    &&&&循(XUN)环(HUAN)控制变量

SELECT tmp2
*IF RECCOUNT()>zss1+zss2+zss3+zss4
*  MESSAGEBOX('待录取的人数大于总招生数,会使程序进入死循环的!!! 请修改招生计划或修改录取程序!',48,'警告:')
*  RETURN
*ENDIF

GO TOP
RAND(SECONDS())     &&&& 根据时间秒数的不一,来产生随机数,保证每次启动都不一样
STORE 0 TO lnCnt1,lnCnt2,lnCnt3,lnCnt4   &&& 给四个变量赋初值为0
DO WHIL xhkz        &&&& 当循环控制变量为真时循环进行下去
    GO TOP
    SCAN FOR EMPTY(lqxxdm)
        lnRound=RAND()
        DO CASE
        CASE lnRound<=zss1/(zss1+zss2+zss3+zss4) AND lnCnt1<zss1
            lcSchool='0100'
            lnCnt1=lnCnt1+1
            REPLACE lqxxdm WITH lcSchool
        CASE lnRound<=(zss1+zss2)/(zss1+zss2+zss3+zss4) AND lnCnt2<zss2
            lcSchool='0200'
            lnCnt2=lnCnt2+1
            REPLACE lqxxdm WITH lcSchool
        CASE lnRound<=(zss1+zss2+zss3)/(zss1+zss2+zss3+zss4) AND lnCnt3<zss3
            lcSchool='0300'
            lnCnt3=lnCnt3+1
            REPLACE lqxxdm WITH lcSchool
        CASE lnRound<=(zss1+zss2+zss3+zss4)/(zss1+zss2+zss3+zss4) AND lnCnt4<zss4
            lcSchool='0400'
            lnCnt4=lnCnt4+1
            REPLACE lqxxdm WITH lcSchool
*!*        OTHERWISE
*!*          lcSchool='0400'
*!*          lnCnt4=lnCnt4+1
        ENDCASE
    ENDSCAN
    *--------------
*每完成一次扫描后,检测是否有学生未被录取,有学生未被录取,必有学校未招满学生
    nn=0
    GO TOP
    SCAN
        IF EMPTY(lqxxdm)
            nn=nn+1
        ENDIF
    ENDSCAN
    IF nn=0     &&&& 如果全部学生都有录取学校了,则改变循环控制变量为假,使循环结束。
        xhkz=.F.
    ENDIF
ENDDO
*SELECT lqxxdm,COUNT(*) FROM tmp2 GROUP BY 1 &&测试查看用
UPDATE bmk from tmp2 SET lqxxdm=tmp2.lqxxdm WHERE bmk.zkzh=tmp2.zkzh &&&将前200名录取结果写回原始报名库


* 对各校的录取情况进行统计
SELECT bmk
*SELECT lqxxdm,COUNT(*) FROM bmk GROUP BY 1 &&测试查看用

SELECT zkjhk
GO TOP
SCAN
    SELECT bmk
    sn=0
    GO TOP
    SCAN
        IF bmk.lqxxdm=zkjhk.xxdm
            sn=sn+bmk.zf
        ENDIF
    ENDSCAN
    GO TOP
    COUNT TO nn FOR bmk.lqxxdm=zkjhk.xxdm
    COUNT TO mm FOR bmk.xbm='2' AND bmk.lqxxdm=zkjhk.xxdm
    SELECT zkjhk
    REPLACE zkjhk.lqrs WITH nn,zkjhk.pjf WITH sn/nn
    REPLACE zkjhk.nsrs WITH mm,zkjhk.nsbl WITH mm/nn*100 &&计算女生比例
ENDSCAN

*SELECT bmk
*GO top
*BROWSE &&查看测试用
SELECT zkjhk
GO TOP
BROWSE &&查看测试用


只求每天有一丁点儿的进步就可以了
6 天前 16:48
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1766
专家分:3335
注 册:2012-2-29
收藏
得分:0 
回复 20楼 chychychy
谢谢分享!
经过 自动 + 手动,目前可以达到的效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


可以使用下面的数据表检验一下
学生分配表.rar (89.91 KB)

确属较高难度的动作哦!

[此贴子已经被作者于2024-12-7 13:34编辑过]

6 天前 18:54
chychychy
Rank: 2
等 级:论坛游民
帖 子:319
专家分:98
注 册:2015-4-18
收藏
得分:0 
回复 22楼 schtg
谢谢,我再试试,相信拿出有你这个数据分析当支撑,校长和领导们会更满意。请指教分享您的这段程序。
程序代码:
SELECT lqxxdm,COUNT(*) zrs ,;
SUM(IIF(sxh<=4,1,0)) AS 前4名, ;
SUM(IIF(sxh<=8,1,0)) AS 前8名, ;
SUM(IIF(sxh<=12,1,0)) AS 前12名, ;
SUM(IIF(sxh<=20,1,0)) AS 前20名, ;
SUM(IIF(sxh<=50,1,0)) AS 前50名, ;
SUM(IIF(sxh<=100,1,0)) AS 前100名, ;
SUM(IIF(sxh<=200,1,0)) AS 前200名 ;
FROM 学生分配表 GROUP BY 1 WHERE !EMPTY(sxh)


[此贴子已经被作者于2024-12-8 06:15编辑过]

5 天前 21:35
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1766
专家分:3335
注 册:2012-2-29
收藏
得分:0 
回复 23楼 chychychy
前面位次录取,在Excel中做的(这次取了前384名作为位次录取),剩余考生按照你提供的代码做的哈,所以才有 自动 + 手动,才有难度
提供 位次考生 录取 规则:
图片附件: 游客没有浏览图片的权限,请 登录注册

按照这个规则,比较好地体现位次均衡,同时方便平衡总分。
结果:
图片附件: 游客没有浏览图片的权限,请 登录注册


检验文件
录取表.rar (96.44 KB)


[此贴子已经被作者于2024-12-8 09:41编辑过]

4 天前 09:33
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2224
专家分:3903
注 册:2007-4-27
收藏
得分:0 
我下周有时间,可以研究一下你的需求。@chychychy,能否把你的真实数据发给我,可以的话加QQ。

只求每天有一丁点儿的进步就可以了
4 天前 11:35
chychychy
Rank: 2
等 级:论坛游民
帖 子:319
专家分:98
注 册:2015-4-18
收藏
得分:0 
回复 25楼 wengjl
感谢,几天在在外有考试任务,回去后发您,我qq313693957,您的?方便我加您
4 天前 12:50
chychychy
Rank: 2
等 级:论坛游民
帖 子:319
专家分:98
注 册:2015-4-18
收藏
得分:0 
回复 24楼 schtg
您这这种规则不仅是单纯的12344321,中间还有变化,请教比如9、10、11、12和13、14、15、16变化的逻辑是什么?用vfp如何实现?
3 天前 10:40
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:263
专家分:640
注 册:2014-3-18
收藏
得分:0 
以下是引用schtg在2024-12-8 09:33:50的发言:

前面位次录取,在Excel中做的(这次取了前384名作为位次录取),剩余考生按照你提供的代码做的哈,所以才有 自动 + 手动,才有难度
提供 位次考生 录取 规则:

按照这个规则,比较好地体现位次均衡,同时方便平衡总分。
结果:


检验文件

每轮8个人,按蛇形排列组成4对,
如果每轮分派随机把一对学生分到一个学校,不知均衡性如何?
3 天前 10:51
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:263
专家分:640
注 册:2014-3-18
收藏
得分:0 
以下是引用wengjl在2024-12-8 11:35:46的发言:

我下周有时间,可以研究一下你的需求。@chychychy,能否把你的真实数据发给我,可以的话加QQ。

如果把姓名家庭住址身份证号码脱敏,真实数据发上来应该没问题
3 天前 10:55
chychychy
Rank: 2
等 级:论坛游民
帖 子:319
专家分:98
注 册:2015-4-18
收藏
得分:0 
回复 29楼 my2318
新建文件夹 (2).rar (1.95 MB)

谢谢,数据都差不多,wengjl的数据也比较有代表性,难在用什么方式解决人数不均等、不成倍数关系下的“均衡”
3 天前 16:50
快速回复:再次请教学生如何分派
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034654 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved