Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions src/Other/Scheduler/Ring-based/Version 1/AuxClass.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package ring.based.v1;

/**
*
* @author SebAs
* Version 1
*/
public class AuxClass{
private int it,turn,nsat;
private boolean[] changed;
public boolean breakThread;

public AuxClass(int nsat){
this.nsat = nsat;
it = 1;
turn = 1;
changed = new boolean[nsat];
for(int i=0; i<nsat; i++){
changed[i] = true;
}
breakThread = false;
}

public synchronized void incIt(){
it++;
}

public void resetIt(){
it = 1;
}

public int getIt(){
return it;
}

public synchronized void incTurn(){
turn++;
}

public int getTurn(){
return turn;
}

public void resetTurn(){
turn = 1;
}

public void setChangeTo(boolean c, int id){
changed[id-1] = c;
}

public boolean votesChanged(){
int i=0;
while(!changed[i]){
i++;
if(i == nsat) break;
}
if(i == nsat){
return changed[nsat-1];
} else {
return changed[i];
}
}

public synchronized void waitSat() throws InterruptedException{
wait();
}

public synchronized void notifySat(){
notifyAll();
}
}
210 changes: 210 additions & 0 deletions src/Other/Scheduler/Ring-based/Version 1/Satellite.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package ring.based.v1;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author SebAs
* Version 1
*/
public class Satellite extends Thread{
private int id, ntask, nsat, enMax, sMax, nTasksAssig;
private long Tstart, Tend;
private double idTable[], auxTable[],comTable[][];
private AuxClass aux;
private Task task;
private Satellite nextSat;
private ArrayList<Integer> tasksAssigned;
private boolean finalVotes;

public Satellite(int id, int ntask, int nsat, AuxClass aux, Task task){
this.id = id;
this.ntask = ntask;
this.nsat = nsat;
idTable = new double[ntask];
auxTable = new double[ntask];
comTable = new double[ntask][2];
this.task = task;
this.aux = aux;
finalVotes = false;
tasksAssigned = new ArrayList();
}

public void setNeighbour(Satellite nextSat){
this.nextSat = nextSat;
}

public void getVotes(){
idTable = task.getVotes(enMax,sMax,id);
}

public void checkVotes(){
if(!aux.votesChanged()){
finalVotes = true;
}
}

public void vote(){
int index = 0;
int tmp = 0;
//get the maximum
double max = 0;
for (int k=0; k<ntask; k++){
if(auxTable[k] > max){
max = auxTable[k];
index = k;
}
}
while(tmp < ntask){
if(comTable[index][0] < max){
comTable[index][0] = max;
comTable[index][1] = id;
aux.setChangeTo(true,id);
break;
} else if ((comTable[index][0] == max) && (comTable[index][1] == id)){
aux.setChangeTo(false,id);
break;
} else {
auxTable[index] = 0;
max=0;
for (int j=0; j<ntask; j++){
if((auxTable[j] > max)){
max = auxTable[j];
index = j;
}
}
if(max == 0){
aux.setChangeTo(false,id);
break;
}
}
tmp++;
}
}

public void giveTable(double[][] t) {
comTable = t.clone();
}

@Override
public synchronized void run(){
Tstart = System.currentTimeMillis();
try {
while(true){
while(aux.getTurn()!= id){
aux.waitSat();
}
if(aux.getIt() == 1){
enMax = task.getEnergyCapacity();
sMax = task.getStorageCapacity();
getVotes();
auxTable = idTable.clone();
} else {
idTable = task.getVotesAgain(id);//per alguna raó després de la primera iteració
//els vots dels satelits es barrejen, aleshores torno
//a copiar-los.
}
if(aux.breakThread){
aux.incTurn();
aux.notifySat();
break;
}
if(id == 1){
checkVotes();
if(finalVotes){
aux.breakThread = true;
aux.incTurn();
aux.notifySat();
break;
}
System.out.println("ITERATION "+(aux.getIt()));
}
//vote and give table to the next satellite
vote();
nextSat.giveTable(comTable);
//change turn
if(id != nsat){
aux.incTurn();
aux.notifySat();
} else {
nTasksAssig = 0;
for(int i=0; i<ntask; i++){
if(comTable[i][0] != 0){
nTasksAssig++;
}
}
tasksAssigned.add(nTasksAssig);
aux.resetTurn();
aux.incIt();
aux.notifySat();
}
}
if(id == nsat){
File archivo = new File("output/resultadosV1_"+nsat+"_"+ntask+".txt");
try (FileWriter w = new FileWriter(archivo,true)) {
Tend = System.currentTimeMillis();
nTasksAssig = 0;
for(int i=0; i<ntask; i++){
if(comTable[i][0] != 0){
nTasksAssig++;
}
}
System.out.println("NUMBER OF TASKS ASSIGNED: "+nTasksAssig);
System.out.println("NUMBER OF ITERATIONS: "+(aux.getIt()-1));
System.out.println("TOTAL TIME: "+(Tend-Tstart)+" ms");
w.write("*************************\r\n");
w.write("Tasks assigned\r\n");
w.write(Integer.toString(nTasksAssig)+"\r\n\r\n");
w.write("Iterations\r\n");
w.write(Integer.toString(aux.getIt()-1)+"\r\n\r\n");
w.write("Time\r\n");
w.write(Long.toString(Tend-Tstart)+"\r\n\r\n");
w.write("Tasks assigned at each iteration\r\n");
for(int i=0; i<aux.getIt()-1; i++){
w.write(Integer.toString(tasksAssigned.get(i))+"\r\n");
}
w.write("\r\n");
w.close();
}
}
}catch(InterruptedException | IOException ex) {
Logger.getLogger(Satellite.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/*
//Recibir tabla
* Si es primera vuelta:
1)pujar en tu propia tabla
2)si eres el primer satelite inicializar: votoDefinitivo[0<id<nsat] = false;
3)pujar por tu mejor tarea en la tabla comuna
si tu voto > otro voto, modificar tabla
sino, pasar a votar por tu siguiente mejor tarea
si no puedes votar por ninguna tarea, indicar que tu voto es definitivo: votoDefinitivo[id] = true;
DUDA: quién comprueba si todos los votos son definitivos (el primer satelite o el actual?)
si no son definitivos: pasar la tabla al siguiente
si son definitivos: break
4)pasar la tabla al siguiente

* Si no es primera vuelta:
1)comprobar si tu voto ha sido cambiado
si no hay cambio: votoDefinitivo[id] = true;
si hay cambio: votar por tu siguiente mejor tarea
si no puedes votar, votoDefinitivo[id] = true
DUDA: quién comprueba si todos los votos son definitivos (el primer satelite o el actual?)
si no son definitivos: pasar la tabla al siguiente
si son definitivos: break
2)pasar la tabla al siguiente

*/
91 changes: 91 additions & 0 deletions src/Other/Scheduler/Ring-based/Version 1/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package ring.based.v1;

import java.util.Random;

/**
*
* @author SebAs
* Version 1
*/
public final class Task {
private int[] taskStorage, taskEnergy;
private int ntask;
private double votes[], satVotes[][];

public Task(int ntask, int nsat){
this.ntask = ntask;
taskStorage = new int[ntask];
taskEnergy = new int[ntask];
votes = new double[ntask];
satVotes = new double[nsat][ntask];
}

public void createTaskInfo(){
for(int i=0; i<ntask; i++){
taskStorage[i] = getStorage();
taskEnergy[i] = getEnergy();
}
}

public int getEnergyCapacity(){
int enMax;
enMax = randomInteger(10,14,new Random());
return enMax;
}

public int getStorageCapacity(){
int sMax;
sMax = randomInteger(8,12,new Random());
return sMax;
}

public int getEnergy(){
//generate random number from 1-12
int en;
en = randomInteger(1,12,new Random());
return en;
}

public int getStorage(){
//generate random number from 1-10
int s;
s = randomInteger(1,10,new Random());
return s;
}

public double[] getVotesAgain(int id){
return satVotes[id-1];
}

public double[] getVotes(double enMax, double sMax, int id){
int i;
for(i=0; i<ntask; i++){
if(taskStorage[i] > sMax || taskEnergy[i] > enMax){
votes[i] = 0.0;
}
else{
votes[i] = (taskStorage[i]/sMax + taskEnergy[i]/enMax)/2;
}
}
for(i=0;i<ntask;i++){
satVotes[id-1][i] = votes[i];
}
return votes;
}

public int randomInteger(int aStart, int aEnd, Random aRandom){
if (aStart > aEnd) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
long range = (long)aEnd - (long)aStart + 1;
long fraction = (long)(range * aRandom.nextDouble());
int randomNumber = (int)(fraction + aStart);
return randomNumber;
}
}
Loading