• Tidak ada hasil yang ditemukan

BAB5_KBF_KELOMPOK2_TUGAS.docx

N/A
N/A
Protected

Academic year: 2021

Membagikan "BAB5_KBF_KELOMPOK2_TUGAS.docx"

Copied!
16
0
0

Teks penuh

(1)

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER

UNIVERSITAS BRAWIJAYA

UNIVERSITAS BRAWIJAYA

BAB

BAB

:

: CONSTRAINT

CONSTRAINT SATISFACTION

SATISFACTION PROBLEM

PROBLEM

 NAMA

 NAMA

: -RENDY PUTRA JALIASMA

: -RENDY PUTRA JALIASMAR

R

-ABDUL KHALIK SEMBIRING

-ABDUL KHALIK SEMBIRING

-MUHAMMAD RIFQI

-MUHAMMAD RIFQI

-MUHAMMAD IQBAL ALVIN

-MUHAMMAD IQBAL ALVIN

 NIM

 NIM

: -16515020011

: -165150200111148

1148

-165150200111153

-165150200111153

-165150207111076

-165150207111076

-165150201111186

-165150201111186

TANGGAL

TANGGAL :

: 11/04/2018

11/04/2018

JENIS

JENIS

:

: TUGAS

TUGAS

ASISTEN

ASISTEN

:

: -DINDY

-DINDY FITRIANNORA

FITRIANNORA

-WINDYA HARTASIH

-WINDYA HARTASIH

ACC

ACC

A.

A. DEFINISI MASALAH

DEFINISI MASALAH

1. Modifikasilah program diatas sehingga dapat menyelesaikan permasalahan 1. Modifikasilah program diatas sehingga dapat menyelesaikan permasalahan

coloroing map pada peta pulau Sumatera di bawah ini. coloroing map pada peta pulau Sumatera di bawah ini.

Domain yang digunkana adalah maksimal 3 warna. Daerah yang digunakan adalah Domain yang digunkana adalah maksimal 3 warna. Daerah yang digunakan adalah  provinsi yang telah

 provinsi yang telah diberi nomdiberi nomor. Tentukan terleor. Tentukan terlebih dahulu constrabih dahulu constrain yang dibutuhkin yang dibutuhkan.an. Modofikasi pula metode

Modofikasi pula metode backtrackbacktracking diatas ing diatas dengan menambahkdengan menambahkan MRV an MRV (Most(Most Restricted Variable) Heuristic

(2)

B. JAWAB

Strategy.java 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 package ceespe; import java.util.*;

public abstract class Strategy {

List<CSPStateListener> listeners = new ArrayList<CSPStateListener>();

public void addCSPStateListener(CSPStateListener listener){

listeners.add(listener); }

public void removeCSPStateListener(CSPStateListener listener){

listeners.remove(listener); }

protected void fireStateChanged(CSPProblem csp){ for(CSPStateListener listener : listeners){

listener.stateChanged(csp.copyDomains()); }

}

protected void fireStateChanged(Assignment assignment, CSPProblem csp){

for(CSPStateListener listener : listeners){ listener.stateChanged(assignment.copy(), csp.copyDomains());

} }

public abstract Assignment solve(); } Variable.java 1 2 3 4 5 6 7 8 9 package ceespe;

public class Variable {

private final String name; public Variable(String name){

this.name = name; }

public String getName(){ return name;

(3)

10 11 12 13 14 15 16 17 18 19 20 21 22 23 }

public String toString(){ return name;

}

public boolean equals(Object obj){ if(obj == null){ return false; } if(obj.getClass() == getClass()){ return this.name.equals(((Variable) obj).name); } return false; } } Assignment.java 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 package ceespe; import java.util.*;

public class Assignment { List<Variable> variables;

Hashtable<Variable, Object> variableToValue; public Assignment(){

variables = new ArrayList<Variable>(); variableToValue = new Hashtable<Variable, Object>();

}

public List<Variable> getVariables(){

return Collections.unmodifiableList(variables); }

public Object getValue(Variable var){ return variableToValue.get(var); }

public void assign(Variable var, Object value){ if(!variableToValue.containsKey(var)){

variables.add(var);

}variableToValue.put(var, value); }

public void removeAssignment(Variable var){ if(hasAssignmentFor(var)){

variables.remove(var);

variableToValue.remove(var); }

}

public boolean hasAssignmentFor(Variable var){ return variableToValue.get(var) != null;

(4)

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 56 57 59 60 61 62 63 64 65 66 67 68 }

public boolean isConsistent(List<Constraint> constraints){

for(Constraint cons : constraints){ if(!cons.satisfied(this)){

return false; }

}return true; }

public boolean isComplete(List<Variable> vars){ for(Variable var : vars){

if(!hasAssignmentFor(var)){ return false;

}

}return true; }

public Assignment copy(){

Assignment copy = new Assignment(); for(Variable var : variables){

copy.assign(var, variableToValue.get(var)); }return copy;

}

public String toString(){ boolean comma = false;

StringBuilder result = new StringBuilder(); for(Variable var : variables){

if(comma){ result.append(", "); }result.append(": ").append(variableToValue.get(var)); comma = true; } return result.toString(); }

public void printSolution(){

System.out.println("Solution"); for(Variable var : variables){

System.out.printf("%- 19s : %s\n",var,variableToValue.get(var)); } } } Backtrack.java 1 2 package ceespe;

(5)

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 CSPProblem problem;

public Backtrack(CSPProblem prob){ this.problem = prob;

}

public Assignment solve(){

return recursiveSolve(this.problem, new Assignment());

}

private Assignment recursiveSolve(CSPProblem csp, Assignment assignment){

Assignment result = null;

if(assignment.isComplete(csp.getVariables())){ result = assignment;

}else{

Variable var = unassignedVar(assignment,csp); for(Object value : orderValues(var,assignment,csp)){ assignment.assign(var, value); fireStateChanged(assignment, csp); if(assignment.isConsistent(csp.getConstraints(var))){ DomainInfo info = inference(var,assignment,csp); if(!info.isEmpty()){ fireStateChanged(csp); }if(!info.isEmptyDomainFound()){ result = recursiveSolve(csp, assignment); if (result != null){ break; } } info.restoreDomains(csp); } assignment.removeAssignment(var); } } return result; }

protected Variable unassignedVar(Assignment assignment, CSPProblem csp){

for(Variable var : csp.getVariables()){

if(!(assignment.hasAssignmentFor(var))){ return var;

(6)

46 47 48 49 50 51 52 53 54 55 56 57 } return null; }

protected Iterable<?> orderValues(Variable var, Assignment assignment, CSPProblem csp){

return csp.getDomain(var); }

protected DomainInfo inference(Variable var, Assignment assignment, CSPProblem csp){

return new DomainInfo().compactify(); } } Constraint.java 1 2 3 4 5 6 package ceespe; import java.util.List;

public interface Constraint { List<Variable> getScope();

abstract boolean satisfied (Assignment asgn); } CSPPProblem.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package ceespe; import java.util.*;

public class CSPProblem {

private List<Variable> variables; private List<Domain> domains;

private List<Constraint> constraints;

private Hashtable<Variable, Integer> varIndexHash; private Hashtable<Variable, List<Constraint>> cnet; public CSPProblem(){

variables = new ArrayList<Variable>(); domains = new ArrayList<Domain>();

constraints = new ArrayList<Constraint>(); varIndexHash = new Hashtable<Variable, Integer>();

cnet = new Hashtable<Variable, List<Constraint>>();

}

public CSPProblem(List<Variable> vars){ this();

(7)

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 56 57 58 59 60 61 62 addVariable(v); } }

protected void addVariable(Variable var){ if(!varIndexHash.containsKey(var)){

Domain emptyDomain = new Domain(Collections.emptyList());

variables.add(var);

domains.add(emptyDomain);

varIndexHash.put(var, variables.size()-1); cnet.put(var, new ArrayList<Constraint>()); }else{

throw new IllegalArgumentException("Variable with same name already exists.");

} }

public List<Variable> getVariables(){

return Collections.unmodifiableList(variables); }

public int indexOf(Variable var){ return varIndexHash.get(var); }

public Domain getDomain(Variable var){

return domains.get(varIndexHash.get(var)); }

public void setDomain(Variable var, Domain domain){ domains.set(indexOf(var), domain);

}

public void removeValueFromDomain(Variable var, Object value){

Domain currDomain = getDomain(var); List<Object> values = new

ArrayList<Object>(currDomain.size()); for(Object v : currDomain){

if(!v.equals(value)){ values.add(v);

}setDomain(var, new Domain(values)); }

}

public void addConstraint(Constraint constraint){ constraints.add(constraint);

for(Variable var : constraint.getScope()){ cnet.get(var).add(constraint);

} }

(8)

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 return constraints; }

public List<Constraint> getConstraints(Variable var){ return cnet.get(var);

}

public CSPProblem copyDomains(){

CSPProblem result = new CSPProblem(); result.variables = variables; result.domains = new ArrayList<Domain>(domains.size()); result.domains.addAll(domains); result.constraints = constraints; result.varIndexHash = varIndexHash; result.cnet = cnet; return result; } } CSPStateListener.java 1 2 3 4 5 package ceespe;

public interface CSPStateListener {

void stateChanged(Assignment assignment, CSPProblem csp); void stateChanged(CSPProblem csp); } Domain.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package ceespe; import com.sun.org.apache.xerces.internal.impl.xs. identity.ValueStore; import java.util.*;

public class Domain implements Iterable<Object> { private final Object[] values;

public Domain(List<?> values){

this.values = new Object[values.size()]; for (int i = 0; i < values.size(); i++) {

this.values[i] = values.get(i); }

}

public Domain(Object[] values){

this.values = new Object[values.length]; for (int i = 0; i < values.length; i++) {

this.values[i] = values[i]; }

(9)

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

public int size(){

return values.length; }

public Iterator<Object> iterator(){

return new ArrayIterator<Object>(values); }

class ArrayIterator<T> implements Iterator<T>{ T[] values;

int counter;

public ArrayIterator(T[] values){ this.values = values;

counter = 0; }

public boolean hasNext() {

return counter < values.length; }

public T next() {

return values[counter++]; }

public void remove(){

throw new UnsupportedOperationException(); } } } DomainInfo.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package ceespe; import java.util.*;

public class DomainInfo {

private List<Pair<Variable, Domain>> savedDomains; private HashSet<Variable> affectedVariables;

private boolean emptyDomainObserved; public DomainInfo(){

savedDomains = new ArrayList<Pair<Variable, Domain>>();

affectedVariables = new HashSet<Variable>(); }

public void clear (){ savedDomains.clear();

affectedVariables.clear(); }

(10)

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

public boolean isEmpty(){

return savedDomains.isEmpty(); }

public void storeDomainFor(Variable var, Domain domain){

if(!affectedVariables.contains(var)){

savedDomains.add(new Pair<Variable, Domain>(var, domain));

affectedVariables.add(var); }

}

public void setEmptyDomainFounnd (boolean b){ emptyDomainObserved = b;

}

public DomainInfo compactify(){ affectedVariables = null; return this;

}

public boolean isEmptyDomainFound(){ return emptyDomainObserved;

}

public List<Pair<Variable, Domain>> getSavedDomains(){

return savedDomains; }

public void restoreDomains(CSPProblem csp){ for(Pair<Variable, Domain> pair :

getSavedDomains())

csp.setDomain(pair.getFirst(), pair.getSecond());

}

@Override

public String toString(){

StringBuilder result = new StringBuilder()

savedDomains.stream().forEach((Pair<Variable, Domain> pair) -> {result.append(pair.getFirst()).

append("=").append(pair.getSecond()).append(" "); });

(11)

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 return result.toString(); } class Pair<X,Y> { private final X a; private final Y b; public Pair (X a, Y b){ this.a = a; this.b = b; } public X getFirst(){ return a; } public Y getSecond(){ return b; } } } Main.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package ceespe; public class Main {

public static void main(String[] args) { MapCSP map = new MapCSP();

Backtrack bts = new Backtrack(map);

bts.addCSPStateListener(new CSPStateListener() { @Override

public void stateChanged(Assignment assignment, CSPProblem csp) {

System.out.println("processing..."+assignment); }

@Override

public void stateChanged(CSPProblem csp){ System.out.println(csp);

} });

System.out.println("Map Coloring each city on Sumatra Island\n");

(12)

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 56 57

Assignment sol = bts.solve();

System.out.println("Backtracking completed!\n"); sol.printSolution();

} }

class MapCSP extends CSPProblem {

public static final Variable AC = new Variable("Aceh");

public static final Variable SU = new Variable("Sumatra Utara");

public static final Variable RI = new Variable("Riau");

public static final Variable SB = new Variable("Sumatra Barat");

public static final Variable JB = new Variable("Jambi");

public static final Variable SS = new Variable("Sumatra Selatan");

public static final Variable BK = new Variable("Bengkulu");

public static final Variable LP = new Variable("Lampung");

public static final String R = "Red"; public static final String G = "Green"; public static final String B = "Blue"; public MapCSP(){

collectVariables();

Domain colors = new Domain(new Object[]{R, G, B});

for(Variable var : getVariables()){ setDomain(var, colors);

}

addConstraint(new NotEqualConstraint(AC, SU)); addConstraint(new NotEqualConstraint(SU, RI)); addConstraint(new NotEqualConstraint(SU, SB)); addConstraint(new NotEqualConstraint(RI, JB)); addConstraint(new NotEqualConstraint(SB, JB)); addConstraint(new NotEqualConstraint(SB, RI)); addConstraint(new NotEqualConstraint(JB, BK)); addConstraint(new NotEqualConstraint(JB, SS)); addConstraint(new NotEqualConstraint(SU, RI)); addConstraint(new NotEqualConstraint(BK, SS));

(13)

58 59 60 61 62 63 64 65 66 67 68 69 70 71 addConstraint(new NotEqualConstraint(SS, LP)); }

private void collectVariables(){ addVariable(AC); addVariable(SU); addVariable(RI); addVariable(SB); addVariable(JB); addVariable(BK); addVariable(SS); addVariable(LP); } } NotEqualConstraint.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package ceespe; import java.util.*;

public class NotEqualConstraint implements Constraint { private final Variable var1;

private final Variable var2;

private final List<Variable> scope;

public NotEqualConstraint (Variable var1, Variable var2){

this.var1 = var1; this.var2 = var2;

scope = new ArrayList<Variable>(2); scope.add(var1);

scope.add(var2); }

public List<Variable> getScope() { return scope;

}

public boolean satisfied(Assignment assignment){ Object value1 = assignment.getValue(var1); return value1 == null ||

!value1.equals(assignment.getValue(var2)); }

}

Penjelasan

(14)

Baris 3-4 : Method getScope, template yang akan diimplementasikan ke clas s

 NotEqualConstraint

Baris 4-5 : Method satisfied, template yang akan diimplementasikan ke class

 NotEqualConstraint

Class CSPListener

Baris 3-4: Method stateChanged, method overloading yang digunakan untuk

mengetahui informasi perubahan yang ada pada assignment dan satunya untuk

 perubahan domain pada variable.

Class Strategy

Baris 6-8 : Method AddStateChanged untuk menambahkan listerner pada class

strategy

Baris 9-11: Method remonveCSPStateListener untuk menghapus listener pada class

strategy.

Baris 12-15: Method fireStateChanger untuk memicu perubahan yang ada pada class

strategy.

Baris 22-23: Method solved digunakan untuk menentukan solusi pada CSP.

Class Variable

Class Domain

Baris 18-20: Method size untuk mengetahui panjang domain.

Baris 21-23: Method iterator untuk mendapatkan nilai dari domain dalam bentuk arra y.

Baris 24-30: Method constructor arrayiterator untuk memasukkan nilai yang diubah ke

arry

Class NotEqualConstraint:

Baris 16-18: Method getScope untuk mengetahui scope dari dua vatiable.

Baris 20-23:Method satisfied untuk mengetahui apakah varible yang dimasukkan

terjebak constraint.

Class DomainInfo

Baris 13-16: Method clear digunakan untuk menghapus domain lainnya jika constrain

terlibat

Baris 22-66: Method storeDomainFor untuk menyimpan domain pada sebuah variable.

Baris 33-36: Method compactify untuk menyusutkan sisa memen

Class CSPProblem:

Baris 38-40: Method indexof unttuk mengetahui posisi dari sebuah variable.

Baris 47-55 Method removeValueFromDomain untuk menghapus nilai variable pada

dari sebuah domain.

Class Assignment

Baris 16-19: Method assign untuk mengecek apakah variable CSP berisi variable yang

sudah diassign.

Baris 21-25: Method removeAssignment untuk menghapus variable yang terjebak

constraint

(15)

Baris 24-30: Method constructor arrayiterator untuk memasukkan nilai yang diubah ke

arry

Baris 61-65 : Method printsoultion untuk mencetak solusi akhri dari CSP

Class Backtrack

Baris 8-10: Method solve untuk mencari solusi dari permasalhan CSP.

Baris 11-36: Method recursiveSave untuk mengimplementasikan algoritma backtrack .

Baris 37-44: Method unsignedVar digunakan untuk menyimpulkan solusi dan

mengurangi materi program.

Class Main

Baris 4-11 : Method main untuk membuat objek map CSP yang digunakan untuk

membuat peta dan kondisi dan mengecek setiap langkah dan solusi

Baris 41-46 : Class mapcsp untuk memasukkan kondisi variable domain dan constraint

 pada sebuah kasuk.

Baris 61-70 : Method collectValues untuk menyimpulkan solusi dan mengurangi

materi.

(16)

Referensi

Dokumen terkait

Untuk membuat positif cetakan apabila negatif cetakan sudah benar - benar selesai, dari negatif cetakan tadi pertama kita olesi bahan pemisah kemudian tunggu satu

Menimbang, bahwa berdasarkan pertimbangan di atas, lagi pula ternyata bahwa putusan Pengadilan Tinggi Agama Surabaya dalam perkara ini tidak bertentangan dengan hukum

Telah dilakukan penangkapan tikus dengan perangkap di 22 daerah fokus keong yang tersebar di 6 desa di Dataran Tinggi Napu, Kabupaten Poso, Sulawesi Tengah

Met$de trans-$rtasi meru-aan suatu met$de yang digunaan untu  mengatur distribusi dari sumbersumber yang menyediaan -r$du yang sama, e tem-attem-at

Insidensi neoplasma tulang bila dibandingkan dengan neoplasma jaringan lain adalah jarang, akan tetapi osteosarkoma merupakan tumor ganas primer tulang yang paling sering

yang digunakan dalam menyusun SOP  bisa mengikuti tata persuratan RS atau dengan nomor digit.  Judul &amp; nomor SOP agar dibuatkan indeks  Indeks dibuat sentral  buat

Menimbang : bahwa berdasarkan hasil survey yang telah dilaksanakan oleh Sekretariat DPRD Kota Sukabumi terhadap harga sewa rumah di Kota Sukabumi dan adanya kenaikan

Dapat diambil kesimpulan bahwa pola komunikasi yang dilakukan adalah pola komunikasi ketiga yaitu pola komunikasi massa karena komunikasi yang terjadi bukan