Analisis Metode Seleksi Rank-Based Fitness Assigment Dan One Point Crossover Pada Penjadwalan Matakuliah
DAFTAR PUBLIKASI PENULIS
Publikasi
No
Judul Artikel
Penulis
(Seminar/Jurnal,
Dll)
1.
Waktu
Publikasi
Tempat
Pengolahan Data FitriRizani
LENTERA Jurnal
Januari
Universit
Periklanan
Ilmiah Sains dan
2012
Menggunakan
Teknologi (ISSN
Muslim,
Corel Draw Dan
1829 – 9598)
Matangg
as
Al-
Adobe
lumpang
Photoshop Di Al-
dua
Muslim Business
Kabupat
Center
en
Bireuen
Aplikasi
LENTERA Jurnal
September
Download Video
Ilmiah Sains dan
2012
Di
Teknologi (ISSN
Muslim,
1829 – 9598)
Matangg
You
FitriRizani
Tube
Dengan
2.
Universit
as
Al-
Menggunakan
lumpang
Program
dua
Basic 6.0
Visual
Kabupat
en
Bireuen
Universitas Sumatera Utara
Lampiran Skript Program
FrmBuildJadwal
#define SAVE_AS_XL
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
using csPenjadwalanGenetika;
using IniParser;
using Excel = Microsoft.Office.Interop.Excel;
namespace csPenjadwalanGenetika
{
publicpartialclassFrmBuildJadwal : Form
{
privateint maxIterasi;
privateint populasi;
ClassGenetik genetik;
privatereadonlyint kode_jumat;
privatereadonlyint kode_dhuhur;
privatereadonlyint[] range_jumat;
readonlyClassDbConnect _dbConnect = newClassDbConnect();
staticreadonlyFileIniDataParser parser = newFileIniDataParser();
readonlyIniData data = parser.LoadFile("config.ini");
//solution
privateint[,] jadwal_kuliah;
public FrmBuildJadwal()
{
Universitas Sumatera Utara
InitializeComponent();
//load config
txtJumlahPopulasi.Text = data["genetik"]["populasi"];
numCrossover.Text = data["genetik"]["crossover"];
numMutasi.Text = data["genetik"]["mutasi"];
txtIterasi.Text = data["genetik"]["max_iterasi"];
kode_jumat = int.Parse(data["genetik"]["kode_jumat"]);
kode_dhuhur = int.Parse(data["genetik"]["kode_dhuhur"]);
range_jumat = data["genetik"]["range_jumat"].Split('').ToIntArray();
}
privatevoid FrmBuildJadwal_Load(object sender, EventArgs e)
{
}
privatevoid btnTutup_Click(object sender, EventArgs e)
{
Close();
}
privatevoid btnProses_Click(object sender, EventArgs e)
{
constint GANJIL = 1;
constint GENAP = 0;
int jenis_semester = cmbSemester.Text == "GANJIL" ? GANJIL : GENAP;
string tahun_akademik = cmbTahunAkademik.Text;
populasi = int.Parse(txtJumlahPopulasi.Text);
if (populasi % 2 != 0)
{
MessageBox.Show("Populasi harus kelipatan 2");
return;
}
Universitas Sumatera Utara
float crossOver = float.Parse(numCrossover.Text); //(float)0.7;
float mutasi = float.Parse(numMutasi.Text); //(float)0.4;
maxIterasi = int.Parse(txtIterasi.Text);
genetik = newClassGenetik(
jenis_semester, tahun_akademik,
populasi, crossOver, mutasi,
kode_jumat, range_jumat, kode_dhuhur);
genetik.AmbilData();
genetik.Inisialisasi();
if (!worker.IsBusy)
{
worker.RunWorkerAsync();
btnProses.Enabled = false;
DisableAllParamComponent(true);
btnStop.Enabled = true;
}
}
privatevoid label9_Click(object sender, EventArgs e)
{
//MessageBox.Show(
//
"Kenapa? \n" +
//
"Karena prinsip yang digunakan adalah pernikahan Monogami\n" );
}
privatevoid DisableAllParamComponent(bool disabled)
{
cmbSemester.Enabled = cmbTahunAkademik.Enabled =
txtJumlahPopulasi.Enabled =
numCrossover.Enabled = numMutasi.Enabled =
txtIterasi.Enabled = !disabled;
}
privatevoid Export2Excel()
Universitas Sumatera Utara
{
object misValue = System.Reflection.Missing.Value;
var xlApp = new Excel.ApplicationClass();
var xlWorkBook = xlApp.Workbooks.Add(misValue);
var xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
int i = 0;
int j = 0;
//export header
for (i = 1; i ruang reguler
//TODO: jika kuliah praktikum => ruang lab
//individu[i, j, 3] = random.Next(ruang.Length); // Penentuan ruang secara
acak
if (jenis_mk[j] == TEORI)
{
individu[i, j, 3] =
ruangReguler[random.Next(ruangReguler.Length)];
}
else
{
individu[i, j, 3] =
ruangLaboratorium[random.Next(ruangLaboratorium.Length)];
}
#if(SHOW_LOG)
String
kr;
Universitas Sumatera Utara
if (j + 1 < 10)
{
kr = "0" + (j + 1);
}
else {
kr = Convert.ToString(j + 1);
}
//logInisialisasi += "\r\nKromosom " + kr + " = " +
logInisialisasi += "\r\n" +
mata_kuliah[individu[i, j, 0]] + "," +
jam[individu[i, j, 1]] + "," +
hari[individu[i, j, 2]] + "," +
individu[i, j, 3];
#endif
}
}
}
#endregion
privatefloat CekFitness(int indv)
{
//float[,] penalty = new float[populasi, 6];
float penalty1 = 0, penalty2 = 0, penalty3 = 0, penalty4 = 0, penalty5 = 0;
for (var i = 0; i < mata_kuliah.Length; i++)
{
for (var j = 0; j < mata_kuliah.Length; j++)//1.Konflik ruang dan waktu dan
3.Konflik dosen
{
//ketika pemasaran matakuliah sama, maka langsung ke perulangan berikutnya
if (i == j) continue;
#region Konflik Ruang dan Waktu
//Ketika jam,hari dan ruangnya sama, maka penalty + satu
if (
(individu[indv, i, 1] == individu[indv, j, 1]) &&
(individu[indv, i, 2] == individu[indv, j, 2]) &&
Universitas Sumatera Utara
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#A] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}] == Kromosom {5} [{6},{7},{8},{9}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j, 3]
);
#endif
penalty1 += 1;
}
//Ketika sks lebih dari 1,
//hari dan ruang sama, dan
//jam kedua sama dengan jam pertama matakuliah yang lain, maka penalty + 1
if (sks[i] >= 2)
{
if (
(individu[indv, i, 1] + 1 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#B] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
Universitas Sumatera Utara
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
#endif
penalty1 += 1;
}
}
//Ketika sks lebih dari 2,
//hari dan ruang sama dan
//jam ketiga sama dengan jam pertama matakuliah yang lain, maka penalty + 1
if (sks[i] >= 3)
{
if (
(individu[indv, i, 1] + 2 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#C] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
Universitas Sumatera Utara
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
#endif
penalty1 += 1;
}
}
//Ketika sks lebih dari 3,
//hari dan ruang sama dan
//jam keempat sama dengan jam pertama matakuliah yang lain, maka penalty +
1
if (sks[i] >= 4)
{
if (
(individu[indv, i, 1] + 3 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#D] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
Universitas Sumatera Utara
#endif
penalty1 += 1;
}
}
#endregion
//______________________Konflik DOSEN
#region Konflik Dosen
if (
//ketika jam sama
individu[indv, i, 1] == individu[indv, j, 1] &&
//dan hari sama
individu[indv, i, 2] == individu[indv, j, 2] &&
//dan dosennya sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#A] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
Universitas Sumatera Utara
if (
//jika lebih dari 1 SKS
sks[i] >= 2
)
{
if (
//jam ke-2 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 1) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#B] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
if (
//jika lebih dari 2 SKS
Universitas Sumatera Utara
sks[i] >= 3
)
{
if (
//jam ke-3 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 2) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#C] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
if (
//jika lebih dari 3 SKS
sks[i] >= 4
)
Universitas Sumatera Utara
{
if (
//jam ke-4 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 3) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#D] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
#endregion
}//end 1.Konflik ruang dan waktu dan 3.Konflik dosen
#region Konflik sholat Jumat
if (individu[indv, i, 2] + 1 == (kode_jumat)) //2.Konflik sholat jumat
{
//int x = individu[indv, i, 2];
Universitas Sumatera Utara
if (sks[i] == (1))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
1] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (2))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
2] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
Universitas Sumatera Utara
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (3))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 3) ||
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
3] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (4))
{
if (
Universitas Sumatera Utara
individu[indv, i, 1] == (range_jumat[0] - 4) ||
individu[indv, i, 1] == (range_jumat[0] - 3) ||
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
4] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
}
#endregion
#region Konflik dengan Waktu Keinginan Dosen
//Boolean penaltyForKeinginanDosen = false;
for (int j = 0; j < iDosen.Length; j++)
{
if (dosen[i] == iDosen[j])
{
string[] hari_jam = waktu_dosen[j, 1].Split(':');
if (
jam[individu[indv, i,
1]].ToString(CultureInfo.InvariantCulture) == hari_jam[1] &&
Universitas Sumatera Utara
hari[individu[indv, i,
2]].ToString(CultureInfo.InvariantCulture) == hari_jam[0]
)
{
//penaltyForKeinginanDosen = true;
#if(SHOW_LOG)
log += string.Format(
"\nHardConstraint[4] => Individu ke {0} Kromosom {1}[{2},{3},{4},{5}][Dosen
= {6}]",
(indv + 1), (i + 1),
mata_kuliah[individu[indv, i, 0]], jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3], iDosen[j]);
#endif
penalty4 += 1;
}
}
}
#endregion
#region Konflik waktu dhuhur
if (individu[indv, i, 1] == (kode_dhuhur - 1))
{
#if(SHOW_LOG)
log += string.Format(
"\nHardConstraint[5] => Individu ke {0} Kromosom {1}[{2},{3},{4},{5}][Dosen
= {6}]",
(indv + 1), (i + 1),
mata_kuliah[individu[indv, i, 0]], jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3], dosen[i]);
#endif
penalty5 += 1;
}
Universitas Sumatera Utara
#endregion
}
#if(SHOW_LOG)
log += string.Format("\nPenalty Individu ke-{0} : {1} \n",
(indv + 1), penalty1 + penalty2 + penalty3 + penalty4 + penalty5);
#endif
float fitness = 1 / (1 + (penalty1 + penalty2 + penalty3 + penalty4 +
penalty5));
return fitness;
}
#region Hitung Fitness
publicfloat[] HitungFitness()
{
//hard constraint
//1.Konflik ruang dan waktu
//2.Konflik sholat jumat
//3.Konflik dosen
//4.Konflik keinginan waktu dosen
//5.Konflik waktu dhuhur
//=>6.praktikum harus pada ruang lab {telah ditetapkan dari awal perandoman
//
bahwa jika praktikum harus ada pada LAB dan mata kuliah reguler harus
//
pada kelas reguler
//soft constraint //TODO
log = null;
float[] fitness = newfloat[populasi];
#if(SHOW_LOG)
log += "\n\n=========================== HITUNG FITNESS";
Universitas Sumatera Utara
log += "\nRule:\n" +
"Hard Constraint:\n" +
"[1] => Konflik ruang dan Waktu\n" +
"[1#A] => jam,hari dan ruangnya sama\n" +
"[1#B] => sks lebih dari 1 + hari dan ruang sama + jam kedua sama dengan
jam pertama matakuliah yang lain\n" +
"[1#C] => sks lebih dari 2 + hari dan ruang sama + jam ketiga sama dengan
jam pertama matakuliah yang lain\n" +
"[1#D] => sks lebih dari 3 + hari dan ruang sama + jam keempat sama dengan
jam pertama matakuliah yang lain\n" +
"[2] => Konflik sholat jumat\n" +
"[2#SKS = 1] => sks = 1\n" +
"[2#SKS = 2] => sks = 2\n" +
"[2#SKS = 3] => sks = 3\n" +
"[2#SKS = 4] => sks = 4\n" +
"[3] => Konflik Dosen\n" +
"[3#SKS = 1] => sks = 1\n" +
"[3#SKS = 2] => sks = 2\n" +
"[3#SKS = 3] => sks = 3\n" +
"[3#SKS = 4] => sks = 4\n" +
"[4] => Konflik keinginan waktu dosen\n";
#endif
for (var indv = 0; indv < populasi; indv++)
{
//Cek Fitness
fitness[indv] = CekFitness(indv);
#if(SHOW_LOG)
log += string.Format(
"Fitness Individu ke-{0} : {1} \n", (indv + 1), fitness[indv]);
#endif
}
//~~~~~buble sort~~~~~~
string[] sort = newstring[populasi];
//fill the data
//
Universitas Sumatera Utara
#if(SHOW_LOG)
log += "\nReview Penalty dan Fitness: (Best Fitness => Worst
Fitness)";
#endif
for (int i = 0; i < populasi; i++)
{
sort[i] = string.Format("\nIndividu {0} :Fitness {1}",
(i + 1), fitness[i]);
}
try
{
bool swapped = true;
while (swapped)
{
swapped = false;
for (int i = 0; i < populasi - 1; i++)
{
string[] strI = sort[i].Split(',');
float fitI = float.Parse(string.Format("0,{0}", strI[1]));
string[] strJ = sort[i + 1].Split(',');
float fitJ = float.Parse(string.Format("0,{0}", strJ[1]));
if (fitI < fitJ)
{
string sTmp = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = sTmp;
swapped = true;
}
}
}
}
catch (Exception)
{
Universitas Sumatera Utara
MessageBox.Show("Kemungkinan data tidak ada untuk Tahun Akademik dan
Semester yang terpilih!", "ERROR", MessageBoxButtons.OK,
MessageBoxIcon.Error);
throw;
}
#if(SHOW_LOG)
for (var i = 0; i < populasi; i++)
{
log += sort[i];
}
#endif
return fitness;
}
#endregion
#region Seleksi
publicvoid Seleksi(float[] fitness)
{
var jumlah = 0;
int[] rank = newint[populasi];
induk = newint[populasi];
#if(SHOW_LOG)
log += "\n\n";
#endif
for (var i = 0; i < populasi; i++)
{
//proses ranking berdasarkan nilai fitness
rank[i] = 1;
for (var j = 0; j < populasi; j++)
{
//ketika nilai fitness jadwal sekarang lebih dari nilai
fitness jadwal yang lain,
//ranking + 1;
//if (i == j) continue;
if (fitness[i] > fitness[j])
Universitas Sumatera Utara
{
rank[i] += 1;
}
}
#if(SHOW_LOG)
log += string.Format("Ranking individu {0} = {1}\n", (i +
1), rank[i]);
#endif
jumlah += rank[i];
}
#if(SHOW_LOG)
log += string.Format("[jumlah:{0}] ", jumlah);
#endif
var random = newRandom();
#if(SHOW_LOG)
log += "\r\n\nProses Seleksi:\r\n" +
"Induk terpilih: ";
#endif
for (var i = 0; i < induk.Length; i++)
{
//proses seleksi berdasarkan ranking yang telah dibuat
//int nexRandom = random.Next(1, jumlah);
//random = new Random(nexRandom);
var target = random.Next(jumlah);
var cek = 0;
for (var j = 0; j < rank.Length; j++)
{
cek += rank[j];
if (cek >= target)
{
induk[i] = j;
#if(SHOW_LOG)
log += string.Format("Individu {0} , ", (j + 1));
#endif
break;
}
Universitas Sumatera Utara
}
}
}
#endregion
//Crossover-----------------------------------------publicvoid StartCrossOver()
{
#if(SHOW_LOG)
log += string.Format("\r\n\r\n===========================PROSES
CROSSOVER / PINDAH SILANG (CrossOver values = {0})", crossOver);
#endif
int[, ,] individu_baru = newint[populasi, mata_kuliah.Length, 4];
var random = newRandom();
for (int i = 0; i < populasi; i += 2) //perulangan untuk jadwal yang
terpilih
{
int b = 0;
int nexRandom = random.Next(1, 1000);
random = newRandom(nexRandom);
double cr = random.NextDouble();
if (cr < crossOver)
{
//ketika nilai random kurang dari nilai probabilitas pertukaran
//maka jadwal mengalami prtukaran
int a = random.Next(mata_kuliah.Length - 1);
while (b
Publikasi
No
Judul Artikel
Penulis
(Seminar/Jurnal,
Dll)
1.
Waktu
Publikasi
Tempat
Pengolahan Data FitriRizani
LENTERA Jurnal
Januari
Universit
Periklanan
Ilmiah Sains dan
2012
Menggunakan
Teknologi (ISSN
Muslim,
Corel Draw Dan
1829 – 9598)
Matangg
as
Al-
Adobe
lumpang
Photoshop Di Al-
dua
Muslim Business
Kabupat
Center
en
Bireuen
Aplikasi
LENTERA Jurnal
September
Download Video
Ilmiah Sains dan
2012
Di
Teknologi (ISSN
Muslim,
1829 – 9598)
Matangg
You
FitriRizani
Tube
Dengan
2.
Universit
as
Al-
Menggunakan
lumpang
Program
dua
Basic 6.0
Visual
Kabupat
en
Bireuen
Universitas Sumatera Utara
Lampiran Skript Program
FrmBuildJadwal
#define SAVE_AS_XL
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
using csPenjadwalanGenetika;
using IniParser;
using Excel = Microsoft.Office.Interop.Excel;
namespace csPenjadwalanGenetika
{
publicpartialclassFrmBuildJadwal : Form
{
privateint maxIterasi;
privateint populasi;
ClassGenetik genetik;
privatereadonlyint kode_jumat;
privatereadonlyint kode_dhuhur;
privatereadonlyint[] range_jumat;
readonlyClassDbConnect _dbConnect = newClassDbConnect();
staticreadonlyFileIniDataParser parser = newFileIniDataParser();
readonlyIniData data = parser.LoadFile("config.ini");
//solution
privateint[,] jadwal_kuliah;
public FrmBuildJadwal()
{
Universitas Sumatera Utara
InitializeComponent();
//load config
txtJumlahPopulasi.Text = data["genetik"]["populasi"];
numCrossover.Text = data["genetik"]["crossover"];
numMutasi.Text = data["genetik"]["mutasi"];
txtIterasi.Text = data["genetik"]["max_iterasi"];
kode_jumat = int.Parse(data["genetik"]["kode_jumat"]);
kode_dhuhur = int.Parse(data["genetik"]["kode_dhuhur"]);
range_jumat = data["genetik"]["range_jumat"].Split('').ToIntArray();
}
privatevoid FrmBuildJadwal_Load(object sender, EventArgs e)
{
}
privatevoid btnTutup_Click(object sender, EventArgs e)
{
Close();
}
privatevoid btnProses_Click(object sender, EventArgs e)
{
constint GANJIL = 1;
constint GENAP = 0;
int jenis_semester = cmbSemester.Text == "GANJIL" ? GANJIL : GENAP;
string tahun_akademik = cmbTahunAkademik.Text;
populasi = int.Parse(txtJumlahPopulasi.Text);
if (populasi % 2 != 0)
{
MessageBox.Show("Populasi harus kelipatan 2");
return;
}
Universitas Sumatera Utara
float crossOver = float.Parse(numCrossover.Text); //(float)0.7;
float mutasi = float.Parse(numMutasi.Text); //(float)0.4;
maxIterasi = int.Parse(txtIterasi.Text);
genetik = newClassGenetik(
jenis_semester, tahun_akademik,
populasi, crossOver, mutasi,
kode_jumat, range_jumat, kode_dhuhur);
genetik.AmbilData();
genetik.Inisialisasi();
if (!worker.IsBusy)
{
worker.RunWorkerAsync();
btnProses.Enabled = false;
DisableAllParamComponent(true);
btnStop.Enabled = true;
}
}
privatevoid label9_Click(object sender, EventArgs e)
{
//MessageBox.Show(
//
"Kenapa? \n" +
//
"Karena prinsip yang digunakan adalah pernikahan Monogami\n" );
}
privatevoid DisableAllParamComponent(bool disabled)
{
cmbSemester.Enabled = cmbTahunAkademik.Enabled =
txtJumlahPopulasi.Enabled =
numCrossover.Enabled = numMutasi.Enabled =
txtIterasi.Enabled = !disabled;
}
privatevoid Export2Excel()
Universitas Sumatera Utara
{
object misValue = System.Reflection.Missing.Value;
var xlApp = new Excel.ApplicationClass();
var xlWorkBook = xlApp.Workbooks.Add(misValue);
var xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
int i = 0;
int j = 0;
//export header
for (i = 1; i ruang reguler
//TODO: jika kuliah praktikum => ruang lab
//individu[i, j, 3] = random.Next(ruang.Length); // Penentuan ruang secara
acak
if (jenis_mk[j] == TEORI)
{
individu[i, j, 3] =
ruangReguler[random.Next(ruangReguler.Length)];
}
else
{
individu[i, j, 3] =
ruangLaboratorium[random.Next(ruangLaboratorium.Length)];
}
#if(SHOW_LOG)
String
kr;
Universitas Sumatera Utara
if (j + 1 < 10)
{
kr = "0" + (j + 1);
}
else {
kr = Convert.ToString(j + 1);
}
//logInisialisasi += "\r\nKromosom " + kr + " = " +
logInisialisasi += "\r\n" +
mata_kuliah[individu[i, j, 0]] + "," +
jam[individu[i, j, 1]] + "," +
hari[individu[i, j, 2]] + "," +
individu[i, j, 3];
#endif
}
}
}
#endregion
privatefloat CekFitness(int indv)
{
//float[,] penalty = new float[populasi, 6];
float penalty1 = 0, penalty2 = 0, penalty3 = 0, penalty4 = 0, penalty5 = 0;
for (var i = 0; i < mata_kuliah.Length; i++)
{
for (var j = 0; j < mata_kuliah.Length; j++)//1.Konflik ruang dan waktu dan
3.Konflik dosen
{
//ketika pemasaran matakuliah sama, maka langsung ke perulangan berikutnya
if (i == j) continue;
#region Konflik Ruang dan Waktu
//Ketika jam,hari dan ruangnya sama, maka penalty + satu
if (
(individu[indv, i, 1] == individu[indv, j, 1]) &&
(individu[indv, i, 2] == individu[indv, j, 2]) &&
Universitas Sumatera Utara
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#A] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}] == Kromosom {5} [{6},{7},{8},{9}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j, 3]
);
#endif
penalty1 += 1;
}
//Ketika sks lebih dari 1,
//hari dan ruang sama, dan
//jam kedua sama dengan jam pertama matakuliah yang lain, maka penalty + 1
if (sks[i] >= 2)
{
if (
(individu[indv, i, 1] + 1 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#B] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
Universitas Sumatera Utara
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
#endif
penalty1 += 1;
}
}
//Ketika sks lebih dari 2,
//hari dan ruang sama dan
//jam ketiga sama dengan jam pertama matakuliah yang lain, maka penalty + 1
if (sks[i] >= 3)
{
if (
(individu[indv, i, 1] + 2 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#C] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
Universitas Sumatera Utara
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
#endif
penalty1 += 1;
}
}
//Ketika sks lebih dari 3,
//hari dan ruang sama dan
//jam keempat sama dengan jam pertama matakuliah yang lain, maka penalty +
1
if (sks[i] >= 4)
{
if (
(individu[indv, i, 1] + 3 == individu[indv, j,
1]) &&
(individu[indv, i, 2] == individu[indv, j, 2])
&&
(individu[indv, i, 3] == individu[indv, j, 3])
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[1#D] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j]
);
Universitas Sumatera Utara
#endif
penalty1 += 1;
}
}
#endregion
//______________________Konflik DOSEN
#region Konflik Dosen
if (
//ketika jam sama
individu[indv, i, 1] == individu[indv, j, 1] &&
//dan hari sama
individu[indv, i, 2] == individu[indv, j, 2] &&
//dan dosennya sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#A] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv, i,
3],
(j + 1), mata_kuliah[individu[indv, j, 0]],
jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv, j,
3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
Universitas Sumatera Utara
if (
//jika lebih dari 1 SKS
sks[i] >= 2
)
{
if (
//jam ke-2 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 1) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#B] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
if (
//jika lebih dari 2 SKS
Universitas Sumatera Utara
sks[i] >= 3
)
{
if (
//jam ke-3 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 2) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#C] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
if (
//jika lebih dari 3 SKS
sks[i] >= 4
)
Universitas Sumatera Utara
{
if (
//jam ke-4 == dengan jam ke-1 mk yang lain
(individu[indv, i, 1] + 3) == (individu[indv,
j, 1]) &&
//dan hari sama
(individu[indv, i, 2]) == (individu[indv, j,
2]) &&
//dan dosen sama
dosen[i] == dosen[j]
)
{
//maka...
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[3#D] =>
Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}][SKS={10}][DOSEN={12}] == Kromosom {5}
[{6},{7},{8},{9}][SKS={11}][DOSEN={13}]",
(i + 1), mata_kuliah[individu[indv, i,
0]], jam[individu[indv, i, 1]], hari[individu[indv, i, 2]], individu[indv,
i, 3],
(j + 1), mata_kuliah[individu[indv, j,
0]], jam[individu[indv, j, 1]], hari[individu[indv, j, 2]], individu[indv,
j, 3],
sks[1], sks[j], dosen[i], dosen[j]
);
#endif
penalty3 += 1;
}
}
#endregion
}//end 1.Konflik ruang dan waktu dan 3.Konflik dosen
#region Konflik sholat Jumat
if (individu[indv, i, 2] + 1 == (kode_jumat)) //2.Konflik sholat jumat
{
//int x = individu[indv, i, 2];
Universitas Sumatera Utara
if (sks[i] == (1))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
1] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (2))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
2] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
Universitas Sumatera Utara
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (3))
{
if (
individu[indv, i, 1] == (range_jumat[0] - 3) ||
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
3] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
if (sks[i] == (4))
{
if (
Universitas Sumatera Utara
individu[indv, i, 1] == (range_jumat[0] - 4) ||
individu[indv, i, 1] == (range_jumat[0] - 3) ||
individu[indv, i, 1] == (range_jumat[0] - 2) ||
individu[indv, i, 1] == (range_jumat[0] - 1) ||
individu[indv, i, 1] == (range_jumat[1] - 1) ||
individu[indv, i, 1] == (range_jumat[2] - 1)
)
{
#if(SHOW_LOG)
log += string.Format("\nHardConstraint[2#SKS =
4] => Individu ke-{0} ", (indv + 1));
log += string.Format(
"Kromosom {0} [{1},{2},{3},{4}]",
(i + 1), mata_kuliah[individu[indv, i, 0]],
jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3]
);
#endif
penalty2 += 1;
}
}
}
#endregion
#region Konflik dengan Waktu Keinginan Dosen
//Boolean penaltyForKeinginanDosen = false;
for (int j = 0; j < iDosen.Length; j++)
{
if (dosen[i] == iDosen[j])
{
string[] hari_jam = waktu_dosen[j, 1].Split(':');
if (
jam[individu[indv, i,
1]].ToString(CultureInfo.InvariantCulture) == hari_jam[1] &&
Universitas Sumatera Utara
hari[individu[indv, i,
2]].ToString(CultureInfo.InvariantCulture) == hari_jam[0]
)
{
//penaltyForKeinginanDosen = true;
#if(SHOW_LOG)
log += string.Format(
"\nHardConstraint[4] => Individu ke {0} Kromosom {1}[{2},{3},{4},{5}][Dosen
= {6}]",
(indv + 1), (i + 1),
mata_kuliah[individu[indv, i, 0]], jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3], iDosen[j]);
#endif
penalty4 += 1;
}
}
}
#endregion
#region Konflik waktu dhuhur
if (individu[indv, i, 1] == (kode_dhuhur - 1))
{
#if(SHOW_LOG)
log += string.Format(
"\nHardConstraint[5] => Individu ke {0} Kromosom {1}[{2},{3},{4},{5}][Dosen
= {6}]",
(indv + 1), (i + 1),
mata_kuliah[individu[indv, i, 0]], jam[individu[indv, i, 1]],
hari[individu[indv, i, 2]], individu[indv,
i, 3], dosen[i]);
#endif
penalty5 += 1;
}
Universitas Sumatera Utara
#endregion
}
#if(SHOW_LOG)
log += string.Format("\nPenalty Individu ke-{0} : {1} \n",
(indv + 1), penalty1 + penalty2 + penalty3 + penalty4 + penalty5);
#endif
float fitness = 1 / (1 + (penalty1 + penalty2 + penalty3 + penalty4 +
penalty5));
return fitness;
}
#region Hitung Fitness
publicfloat[] HitungFitness()
{
//hard constraint
//1.Konflik ruang dan waktu
//2.Konflik sholat jumat
//3.Konflik dosen
//4.Konflik keinginan waktu dosen
//5.Konflik waktu dhuhur
//=>6.praktikum harus pada ruang lab {telah ditetapkan dari awal perandoman
//
bahwa jika praktikum harus ada pada LAB dan mata kuliah reguler harus
//
pada kelas reguler
//soft constraint //TODO
log = null;
float[] fitness = newfloat[populasi];
#if(SHOW_LOG)
log += "\n\n=========================== HITUNG FITNESS";
Universitas Sumatera Utara
log += "\nRule:\n" +
"Hard Constraint:\n" +
"[1] => Konflik ruang dan Waktu\n" +
"[1#A] => jam,hari dan ruangnya sama\n" +
"[1#B] => sks lebih dari 1 + hari dan ruang sama + jam kedua sama dengan
jam pertama matakuliah yang lain\n" +
"[1#C] => sks lebih dari 2 + hari dan ruang sama + jam ketiga sama dengan
jam pertama matakuliah yang lain\n" +
"[1#D] => sks lebih dari 3 + hari dan ruang sama + jam keempat sama dengan
jam pertama matakuliah yang lain\n" +
"[2] => Konflik sholat jumat\n" +
"[2#SKS = 1] => sks = 1\n" +
"[2#SKS = 2] => sks = 2\n" +
"[2#SKS = 3] => sks = 3\n" +
"[2#SKS = 4] => sks = 4\n" +
"[3] => Konflik Dosen\n" +
"[3#SKS = 1] => sks = 1\n" +
"[3#SKS = 2] => sks = 2\n" +
"[3#SKS = 3] => sks = 3\n" +
"[3#SKS = 4] => sks = 4\n" +
"[4] => Konflik keinginan waktu dosen\n";
#endif
for (var indv = 0; indv < populasi; indv++)
{
//Cek Fitness
fitness[indv] = CekFitness(indv);
#if(SHOW_LOG)
log += string.Format(
"Fitness Individu ke-{0} : {1} \n", (indv + 1), fitness[indv]);
#endif
}
//~~~~~buble sort~~~~~~
string[] sort = newstring[populasi];
//fill the data
//
Universitas Sumatera Utara
#if(SHOW_LOG)
log += "\nReview Penalty dan Fitness: (Best Fitness => Worst
Fitness)";
#endif
for (int i = 0; i < populasi; i++)
{
sort[i] = string.Format("\nIndividu {0} :Fitness {1}",
(i + 1), fitness[i]);
}
try
{
bool swapped = true;
while (swapped)
{
swapped = false;
for (int i = 0; i < populasi - 1; i++)
{
string[] strI = sort[i].Split(',');
float fitI = float.Parse(string.Format("0,{0}", strI[1]));
string[] strJ = sort[i + 1].Split(',');
float fitJ = float.Parse(string.Format("0,{0}", strJ[1]));
if (fitI < fitJ)
{
string sTmp = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = sTmp;
swapped = true;
}
}
}
}
catch (Exception)
{
Universitas Sumatera Utara
MessageBox.Show("Kemungkinan data tidak ada untuk Tahun Akademik dan
Semester yang terpilih!", "ERROR", MessageBoxButtons.OK,
MessageBoxIcon.Error);
throw;
}
#if(SHOW_LOG)
for (var i = 0; i < populasi; i++)
{
log += sort[i];
}
#endif
return fitness;
}
#endregion
#region Seleksi
publicvoid Seleksi(float[] fitness)
{
var jumlah = 0;
int[] rank = newint[populasi];
induk = newint[populasi];
#if(SHOW_LOG)
log += "\n\n";
#endif
for (var i = 0; i < populasi; i++)
{
//proses ranking berdasarkan nilai fitness
rank[i] = 1;
for (var j = 0; j < populasi; j++)
{
//ketika nilai fitness jadwal sekarang lebih dari nilai
fitness jadwal yang lain,
//ranking + 1;
//if (i == j) continue;
if (fitness[i] > fitness[j])
Universitas Sumatera Utara
{
rank[i] += 1;
}
}
#if(SHOW_LOG)
log += string.Format("Ranking individu {0} = {1}\n", (i +
1), rank[i]);
#endif
jumlah += rank[i];
}
#if(SHOW_LOG)
log += string.Format("[jumlah:{0}] ", jumlah);
#endif
var random = newRandom();
#if(SHOW_LOG)
log += "\r\n\nProses Seleksi:\r\n" +
"Induk terpilih: ";
#endif
for (var i = 0; i < induk.Length; i++)
{
//proses seleksi berdasarkan ranking yang telah dibuat
//int nexRandom = random.Next(1, jumlah);
//random = new Random(nexRandom);
var target = random.Next(jumlah);
var cek = 0;
for (var j = 0; j < rank.Length; j++)
{
cek += rank[j];
if (cek >= target)
{
induk[i] = j;
#if(SHOW_LOG)
log += string.Format("Individu {0} , ", (j + 1));
#endif
break;
}
Universitas Sumatera Utara
}
}
}
#endregion
//Crossover-----------------------------------------publicvoid StartCrossOver()
{
#if(SHOW_LOG)
log += string.Format("\r\n\r\n===========================PROSES
CROSSOVER / PINDAH SILANG (CrossOver values = {0})", crossOver);
#endif
int[, ,] individu_baru = newint[populasi, mata_kuliah.Length, 4];
var random = newRandom();
for (int i = 0; i < populasi; i += 2) //perulangan untuk jadwal yang
terpilih
{
int b = 0;
int nexRandom = random.Next(1, 1000);
random = newRandom(nexRandom);
double cr = random.NextDouble();
if (cr < crossOver)
{
//ketika nilai random kurang dari nilai probabilitas pertukaran
//maka jadwal mengalami prtukaran
int a = random.Next(mata_kuliah.Length - 1);
while (b