需求未必是變態的,關鍵看怎麼理解需求

 見這個問題
http://topic.csdn.net/u/20070921/22/f09d8bdb-ce93-4e7f-9847-6ec23d344d77.html?seed=1171977409

體能測試時間安排
某校按照教學計劃安排各班學生進行體能測試,以瞭解學生的身體狀況。測試包括身高與體重、立定跳遠、肺活量、握力和臺階試驗共5個項目,均由電子儀器自動測量、記錄並保存信息。該校引進身高與體重測量儀器3臺,立定跳遠、肺活量測量儀器各1臺,握力和臺階試驗測量儀器各2臺。
身高與體重、立定跳遠、肺活量、握力4個項目每臺儀器每個學生的平均測試(包括學生的轉換)時間分別爲10秒、20秒、20秒、15秒,臺階試驗每臺儀器一次測試5個學生,需要3分30秒。
每個學生測試每個項目前要錄入個人信息,即學號,平均需時5秒。儀器在每個學生測量完畢後學號將自動後移一位,於是如果前後測試的學生學號相連,就可以省去錄入時間,而同一班學生的學號是相連的。
學校安排每天的測試時間爲8:00-12:10與13:30-16:45兩個時間段。5項測試都在最多容納150個學生的小型場所進行,測試項目沒有固定的先後順序。參加體能測試的各班人數見附表。
學校要求同一班的所有學生在同一時間段內完成所有項目的測試,並且在整個測試所需時間段數最少的條件下,儘量節省學生的等待時間。
請你用數學符號和語言表述各班測試時間安排問題,給出該數學問題的算法,儘量用清晰、直觀的圖表形式爲學校工作人員及各班學生表示出測試時間的安排計劃,並且說明該計劃怎樣滿足學校的上述要求和條件。
最後,請對學校以後的體能測試就以下方面提出建議,並說明理由:如引進各項測量儀器的數量;測試場所的人員容量;一個班的學生是否需要分成幾個組進行測試等。

附表  參加體能測試的各班人數
                                   
班號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
人數 41 45 44 44 26 44 42 20 20 38 37 25 45 45 45
班號 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
人數 44 20 30 39 35 38 38 28 25 30 36 20 24 32 33
班號 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
人數 41 33 51 39 20 20 44 37 38 39 42 40 37 50 50
班號 46 47 48 49 50 51 52 53 54 55 56
人數 42 43 41 42 45 42 19 39 75 17 17

----------------------------------------------------------------------------------------------------------------------------------
面對上面的這些條件,最後的建模必須做需求的分析:

1,測試時間都大於錄入學號時間.可以同時測試同時錄學號,每個設備多安排一個志願者錄學號就可以,所以那5秒是騙人的,幾乎沒影響.

2,,儀器效率最好是接近1:1:1:1,這樣不會出現瓶頸,減少人流交叉.
體重測量儀器3臺,每次一個人,10秒測完,效率是 3*1/10=3/10  (人/秒)
立定跳遠1臺,每次一個人,20秒測完,效率是 1*1/20=1/20  (人/秒)
肺活量測量儀器1臺,每次一個人,20秒測完,效率是 1*1/20=1/20  (人/秒)
握力2臺,每次一個人,15秒測完,效率是 1*1/15=1/15  (人/秒)
臺階試驗測量儀器2臺,每次5個人,210秒測完,效率是 2*5/210=1/21  (人/秒)

可見除了體重測量儀器和握力能力過剩,
瓶頸因素是立定跳遠,肺活量,臺階試驗測量儀器,應該建議學校補充其他設備,按照效率1:1:1:1配置.

3,按照目前的情況,不考慮在場地等待和錄學號,每個人有效測試時間是260秒

在最慢的2個臺階試驗測量儀器工作一個週期210秒內.流過了10人,如果這時候其他設備都不閒着.
體重測量儀器3臺,可以流過3*210/10=62人
立定跳遠1臺,可以流過1*210/20=10.5人
肺活量測1臺,可以流過1*210/20=10.5人
握力2臺,可以流過2*210/15=28人

可以組織其他人充分利用其餘設備,最快通過速度取決於臺階試驗測量儀器,速度爲一輪10個人,
(人數*210/10)=21*n 按照210取整 再加上5秒錄學號(臺階測試儀器每臺最好5個人錄學號前).
 
就是說最少人數的班級17人獨佔場地的話,需要2輪, 需要最快425秒(7-8分鐘)通過.
最多人數的班級75人,需要8輪,需要最快1680秒(28-30分鐘)通過.

4,從上面分析可以看出,最好策略是一次只通知一個班級,場地幾乎不會造成影響,只要場地多於最大班級人數就足夠了,
按照上面的計算規則,計算出每個班級的最少時間,順次通知各個班級就可以了,上午總共有250分鐘,下午195分鐘.平均每個班估計是10-15分鐘的話,
一天可以搞30-40班,所以預計2天可以搞定.所以只有4個半天可以供決策.
先從班級人數最多的安排在每天上/下午第一個,依次往小了排就可以了.

用C#創建一個WebForm這樣直觀,而且方便通知大家,結果見www.dullwolf.cn/project3.htm 
代碼如下:
C# code
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Text; namespace project3 { public partial class _Default : System.Web.UI.Page { //輸出圖形 protected StringBuilder HTML = new StringBuilder(""); protected void Page_Load(object sender, EventArgs e) { //班級人數數組。 int[] Arr = new int[] { 41, 45, 44, 44, 26, 44, 42, 20, 20, 38, 37, 25, 45, 45, 45, 44, 20, 30, 39, 35, 38, 38, 28, 25, 30, 36, 20, 24, 32, 33, 41, 33, 51, 39, 20, 20, 44, 37, 38, 39, 42, 40, 37, 50, 50, 42, 43, 41, 42, 45, 42, 19, 39, 75, 17, 17 }; //初始時間,兩天的8:00-12:10與13:30-16:45共4個時間段Time slot,假設日期是2007-10-8號 TimeSlot[] TimeSlots = new TimeSlot[] { new TimeSlot(new DateTime(2007, 10, 8, 8, 0, 0),new DateTime(2007, 10, 8, 12, 10, 0)), new TimeSlot(new DateTime(2007, 10, 8, 13, 30, 0),new DateTime(2007, 10, 8, 16, 45, 0)), new TimeSlot(new DateTime(2007, 10, 9, 8, 0, 0),new DateTime(2007, 10,9, 12, 10, 0)), new TimeSlot(new DateTime(2007, 10, 9, 13, 30, 0),new DateTime(2007, 10, 9, 16, 45, 0)) }; List<Class> Classes = new List<Class>(); for (int i = 0; i < Arr.Length; i++) { Classes.Add(new Class((i + 1).ToString(), Arr[i])); } //按照學生數量排序 Classes.Sort(delegate(Class a, Class b) { return (Convert.ToInt32(b.MinPassTime.TotalMinutes - a.MinPassTime.TotalMinutes)); }); //把班級加到計劃裏。 int tempTimeSlot = 0; int tempClass=0; while (tempClass < Classes.Count) { int TimeSlotIndex = tempTimeSlot % TimeSlots.Length; TimeSlot timeSlot = TimeSlots[TimeSlotIndex]; List<Project> projects = timeSlot.Projects; Class currentClass = Classes[tempClass]; // Project p = new Project(currentClass); if (projects.Count == 0) { projects.Add(p); p.ArriveTime = timeSlot.BeginTime; p.LeaveTime = p.ArriveTime.Add(currentClass.MinPassTime); tempClass++; } else { //上一個計劃的結束時間,是本計劃的開始時間 Project lastProject = projects[projects.Count - 1]; //判斷時間是否夠用;不夠用就留到下一個時間段去處理; if (lastProject.LeaveTime.Add(currentClass.MinPassTime) < timeSlot.EndTime) { projects.Add(p); p.ArriveTime = lastProject.LeaveTime; p.LeaveTime = p.ArriveTime.Add(currentClass.MinPassTime); tempClass++; } } tempTimeSlot++; } //關鍵時刻到了,打印結果,甘特圖 long TimeSlotLeft = 180; int top = 0; for (int i = 0; i < TimeSlots.Length; i++) { TimeSlot timeSlot = TimeSlots[i]; List<Project> projects = timeSlot.Projects; long TimeSlotWidth = (timeSlot.EndTime.Ticks - timeSlot.BeginTime.Ticks) / TimeSpan.TicksPerMinute; HTML.Append("<div style='z-index:100;border:1px solid black;width:" + TimeSlotWidth + "px;height:1680px;top:0px;left:" + TimeSlotLeft); HTML.Append("px'>從" + forMatDateTime(timeSlot.BeginTime, timeSlot.EndTime) + "</div>/n"); for (int j = 0; j < projects.Count; j++) { top+=28; Project project = projects[j]; string ProjectBackGround = "white"; if (((top/28) % 2) == 0) { ProjectBackGround = "#CCCCCC"; } Class currentClass = project.TheClass; long width = (project.LeaveTime.Ticks - project.ArriveTime.Ticks) / TimeSpan.TicksPerMinute; long left = TimeSlotLeft + (project.ArriveTime.Ticks - TimeSlots[i].BeginTime.Ticks) / TimeSpan.TicksPerMinute; //時間 HTML.Append("<div class='time' style='width:" + width + "px;top:" + top + "px;left:" + left + "px;'></div>/n"); HTML.Append("<div class='text' style='top:" + top + "px;left:0px;background-color:" + ProjectBackGround + ";width:1070px;'>" + currentClass.ID); HTML.Append("" + currentClass.Num + "" + forMatDateTime(project.ArriveTime, project.LeaveTime)); HTML.Append("</div>/n"); } top += 28; HTML.Append("<div class='text' style='top:" + top + "px;left:0px;background-color:gray;width:1070px;'>"); HTML.Append("</div>/n"); TimeSlotLeft += TimeSlotWidth; } } private string forMatDateTime(DateTime x, DateTime y) { string re = string.Empty; re += x.Day; re += ""; re += x.Hour; re += ""; re += x.Minute; re += "分到"; re += y.Hour; re += ""; re += y.Minute; re += ""; return re; } } //班級類 public class Class { public Class(string id, int num) { ID = id; Num = num; //計算通過時間。 MinPassTime = TimeSpan.FromSeconds(5+210 * Math.Ceiling((double)num / 10)); } //編號,數量,最小通過時間(每輪10個人,4分鐘,按秒計算是不值得的,因爲畢竟是人!)。 public string ID; public int Num; public TimeSpan MinPassTime; } //時間段類 public class TimeSlot { public TimeSlot(DateTime beginTime, DateTime endTime) { BeginTime = beginTime; EndTime = endTime; Projects = new List<Project>(); } //開始時間,結束時間,計劃列表。 public DateTime BeginTime; public DateTime EndTime; public List<Project> Projects; } public class Project { public Project(Class theClass) { TheClass = theClass; } //到達時間,班級列表。 public Class TheClass; public DateTime ArriveTime; public DateTime LeaveTime; } } 前臺Default.aspx文件內容:
HTML code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="project3._Default" %> <html> <head runat="server"> <title>計劃甘特圖</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> div{position:absolute;font-size:12px;} div.time{background-color:Red;z-index:10;height:28;} div.text{z-index:1;height:28;border:1px solid black;} </style> </head> <body> <%=HTML %> </body> </html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章