我正在为学生开发一个基于控制台的个人日程安排计划器。我的目标是该应用程序将采取用户想要进行的活动以及当天用户可用的总时间,然后分配时间段并以表格格式显示。
分配的时间取决于主题(更多时间分配给更重要的任务等)。
我正在为我的第4学期英语做这个项目。
我已经开始研究算法,我的问题是,是否有任何此类算法可用?我在网上搜索过,但我发现的规划算法都是针对公交时刻表和其他方法,但不完全是我正在寻找的。 p>
答案 0 :(得分:6)
根据amit的要求,这里有几个资源。
据我所知,背包问题是一个最大化问题。给定一组特别有用和重量的项目,您希望选择最佳子集 - 即给定重量的“最佳”项目组合 - 您可以携带背包/帆布背包的最大容量。
例如,在Zombie入侵中,电锯可能是一个非常有用的项目,但它很大而且体积庞大,所以它的实用性可能超过它的体积。虽然刀也很有用,但重量要少得多。如果您选择了刀具,您也可以选择割炬,撬棍,干燥口粮和睡袋,而如果选择电锯,则只有干燥口粮的空间。
您的特定问题是尝试将一组活动纳入固定时间段。为此,您需要根据某些因素对活动进行加权,例如
然后,您需要为这些不同因素提出加权算法,并使用该加权算法来决定如何选择特定日期的活动;记住不同的人可能有不同的偏好,你需要在你使用的权重中允许某种形式的可配置性。
(请注意,基于我对算法的有限接触,这都是假设 - 正如我所说,我自己从未做过,上面代表了我对如何解决问题的初步想法。)
我通过谷歌找到的一些资源是: http://www.es.ele.tue.nl/education/5MC10/Solutions/knapsack.pdf
http://mathworld.wolfram.com/KnapsackProblem.html
http://academicearth.org/lectures/knapsack-problem-1(麻省理工学院讲座视频)
祝你好运,这听起来像是一个有趣的项目。答案 1 :(得分:0)
最后我参与了我的项目并完成了它
代码是:
package project;
public class TimeTable extends Time {
int i;
String table[] = new String[24];
Activity activity[];
static int currentTime;
boolean flag = false;
public void setTable(Activity[] iActivity){
setNontime();
activity = iActivity;
int temp;
temp = clgStart- wakeTime;
currentTime=wakeTime;
System.out.println("tmep is "+temp);
setTimeTillCollege(temp);
currentTime= clgEnd;
temp = dinner - clgEnd;
System.out.println("temp is"+temp);
setTimeTillDinner(temp);
currentTime = dinner+1;
temp= sleepTime-dinner-1;
setTimeTillSleep(temp);
}
private void setTimeTillSleep(int temp) {
if(temp<=2){
table[currentTime]= getNonAcad();
}
}
private void setTimeTillDinner(int temp) {
if(flag){//if the academic subs are not given in daylight
/* if(temp<1){
table[currentTime] = "timepass";
} else*/
if(temp==1){
table[currentTime] = getNonAcad();
} else if(temp==2){
table[currentTime] = getAcademic(2);
} else {
while(temp!=0){
}
}
} else {
while(temp!=0){
if(temp > 4){
table[currentTime]=getAcademic(2);
flag=true;
temp-=2;
} else if(temp==4){
table[currentTime]=getAcademic(2);
temp-=2;
table[currentTime]=getAcademic(2);
temp-=2;
flag=true;
}
}
}
}
private void setTimeTillCollege(int temp) {
if(temp==1){
table[currentTime] = "Revise";
} else if(temp==maxSlot){
table[currentTime] = getAcademic(2);
} else {
while(temp!=0){
if(temp > 4){
table[currentTime]=getAcademic(2);
flag=true;
temp-=2;
} else if(temp==4){
table[currentTime]=getAcademic(2);
temp-=2;
table[currentTime]=getAcademic(2);
temp-=2;
flag=true;
} else if(temp<4){
} else if(temp==1){
getAcademic(1);
}
}
}
}
private String getNonAcad() {
for (i = 0; i < activity.length; i++) {
if(!activity[i].over && !activity[i].acad){
activity[i].over = true;
currentTime+=activity[i].timeSlot;
return activity[i].name;
}
}
return null;
}
private String getAcademic(int j) {
for (i = 0; i < activity.length; i++) {
if(!activity[i].over && activity[i].credit==j){
activity[i].over = true;
currentTime+=activity[i].timeSlot;
return activity[i].name;
}
}
return null;
}
@SuppressWarnings("unused")
private String getAcademic() {
for (i = 0; i < activity.length; i++) {
if(activity[i].credit==1 && activity[i].acad){
activity[i].over = true;
currentTime+=activity[i].timeSlot;
return activity[i].name;
}
}
return null;
}
public void setNontime(){
for (i = 0; i < table.length; i++) {
table[i]= new String();
}
table[sleepTime]="Sleep";
table[clgStart]="College";
table[clgEnd]="College ends";
table[dinner]= "Dinner";
}
public void display() {
System.out.println("inside display method");
for ( i = wakeTime; i < table.length; i++) {
System.out.println(i+" "+table[i]);
}
}}
这是我的程序中发生实际操作的类
Activity是一个定义名称,timeSlot,活动信用等的类。 time是定义不同时间的类,如wakeTime,sleepTime等
并在时间表类中生成时间表
这是基于控制台的程序,我也创建了它的GUI应用程序