私は、遺伝的アルゴリズムを使用して最終年度のプロジェクトを行い、大学の一連の九九を設計しています。
私は前進するのを妨げている1つのエラーに遭遇しています。次のエラーが発生します。
Exception in thread "main" java.lang.NullPointerException
at LunchTimeFree.calculateViolations(LunchTimeFree.java:36)
at FitnessFunction.calculateFitnesScore(FitnessFunction.java:34)
at Main.main(Main.java:19)
しかし、これは私には意味がありません。その行には、次のコード行があります。
int time = c.genes[i].time;
可変時間を染色体内の特定の遺伝子の時間値に設定します。時間変数とc.genes[i].time変数を出力した後、デバッグしてprintlnステートメントを挿入しました。これらは両方とも変数に初期化されます。つまり、time=1または2などです。
何が問題なのかわかりません。誰か助けてくれませんか?
public class LunchTimeFree extends constraintInterface {
Chromosome c;
public LunchTimeFree(Chromosome chromo){
c = chromo;
}
@Override
public double calculateViolations() {
double violations=0;
int i = 0;
int y = c.getLength();
while(i <= y-1 )
{
int time = c.genes[i].time;
if (time >= 16 && time <= 25) {
violations = violations + 1;
}
i++;
}
return violations*this.weight;
}
}
public class ChromosomeFactory
{
Chromosome c;
public ChromosomeFactory(int l)
{
c = new Chromosome(l);
DummyDatabase da = new DummyDatabase();
int numOfLectures = da.GetNumLectures();
int i=0;
while(i<=numOfLectures-1)
{
int lecture = da.getLecture(i);
int r = da.Rooms[(int)(Math.random() * da.Rooms.length)];
int t = da.TimeSlots[(int)(Math.random() * da.TimeSlots.length)];
Gene g = new Gene(lecture,lecture,r,t);
c.genes[i] = g;
System.out.println(""+this.c.genes[i].teacher+","+this.c.genes[i].lecture+","+this.c.genes[i].room+","+this.c.genes[i].time+"");
i++;
}
}
}
public class FitnessFunction
{
Chromosome c;
public FitnessFunction(Chromosome newChromo) {
c = newChromo;
}
public double calculateFitnesScore() {
LunchTimeFree ltf = new LunchTimeFree(c);
ltf.setWeight(0.01);
double violationScore =ltf.calculateViolations();
double score = (1/(1 + violationScore));
return score;
}
public class Chromosome
{
Gene[] genes;
public Chromosome(int l)
{
genes = new Gene[l];
}
public int getLength()
{
return genes.length;
}
}
public class Gene
{
public int teacher;
public int lecture;
public int room;
public int time;
public Gene(int t,int l, int r, int time)
{
this.teacher=t;
this.lecture=l;
this.room=r;
this.time=time;
}
}
public class DummyDatabase implements DatabaseAccessor
{
int[] Lecturers = { 1,2,3,4,5,6,7,8,9 };
int[] Lectures = { 1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19} ;
int[] TimeSlots = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55};
int[] Rooms = {1,2,3,4,5,6,7,8,9,10};
@Override
public int GetRoom(int entry) {
return this.Rooms[entry];
}
@Override
public int GetNumLectures() {
return this.Lectures.length;
}
@Override
public int getTeacher(int entry) {
return this.Lecturers[entry];
}
@Override
public int getLecture(int entry) {
return this.Lectures[entry];
}
@Override
public int getNumRooms() {
return this.Rooms.length;
}
}