import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LetturaMatrici {
public static String[][] matriceImportata;
public static int[][] matriceCreataD;
public static int[][] matriceCreataT;
public static File ts;
public static int[][] matriceCreataP;
public static boolean[][] matriceBooleana;
public static int[][] predecessori;
public static void main(String[] args){
matriceBooleana = new boolean[109][109];
matriceCreataD = new int[109][109];
matriceCreataT = new int[109][109];
matriceCreataP = new int[109][109];
predecessori = new int[109][109];
String nomefile = new String("C:\\Users\\Leo\\Desktop\\Lab OC\\GrafoFinaleI - SPD - MONTE MADONNA.tab");
ts =new File(nomefile);
importaMatrice(); //imports from file
creaMatriceBooleana(); //initializes the Boolean to true on diagonal
creaMatrice(); // creates the matrix we work on
predecessori(); //tells you if a two nodes are actually connected
int[][]D=matriceCreataD;
int[][]P=matriceCreataP;
int[][]T=matriceCreataT;
boolean[][]B=matriceBooleana;
int[][]pred=predecessori;
FloydWarshall(D,B,pred);
for(int i=0;i<109;i++){
System.out.println("il guadagno G"+i+" è "+matriceCreataD[0][i]);}
}
public static void FloydWarshall(int[][] matrice,boolean[][] confronto,int[][] pred){//IMPORTANT
int i,j,k;
boolean ciclo=false;
while(ciclo==false){
read_data:
for(k=0;k<109;k++){
for(i=0;i<109;i++){
for(j=0;j<109;j++){
if(confronto[i][k]==true&&confronto[k][j]==true){
if(i==j&&matrice[i][j]>matrice[i][k]+matrice[k][j]){ //crucial part!!!!
int [] eliminare=new int[2];
eliminare=sostituzione(i,k,j,pred,matrice,matriceCreataP,matriceCreataT);
//finds the arch(value) to substitute or in case eliminate altogether..
int arco0=getValueArch0(eliminare);
int arco1=getValueArch1(eliminare);
int cx=getValueCost(arco0,arco1,matriceCreataD);
if(verificaArcoUnico(arco0,arco1,cx)==true){
matriceBooleana[arco0][arco1]=false;
confronto=matriceBooleana;
predecessori();
pred=predecessori;
}
else {
creaMatriceAggiornata(arco0,arco1,cx,matrice,confronto);
confronto=matriceBooleana;
matrice=matriceCreataD;
predecessori();
pred=predecessori;}
break read_data;
}
else {
if(confronto[i][j]==false){
matrice[i][j]=matrice[i][k]+matrice[k][j];
confronto[i][j]=true;
pred[i][j]=pred[k][j];
}
else{
if(matrice[i][j]>(matrice[i][k]+matrice[k][j])){
matrice[i][j]=matrice[i][k]+matrice[k][j];
confronto[i][j]=true;
pred[i][j]=pred[k][j];
}
}
}
}
if(i==109&&k==109&&j==109)
ciclo=true; }
} }}
}
}
public static void creaMatriceAggiornata(int r,int c, int costo,int[][]matrice,boolean[][]b){
int righe=getNumRighe();
int valore0,valore3,valore6,valore7,valore8;
boolean popolazioneZero;
b[r][c]=false;
for (int riga=0;riga<righe;riga++){
popolazioneZero=false;
valore0=getMatrixValue(matriceImportata,riga,0);
valore3=getMatrixValue(matriceImportata,riga,3);
valore6=getMatrixValue(matriceImportata,riga,6);
valore7=getMatrixValue(matriceImportata,riga,7);
valore8=getMatrixValue(matriceImportata,riga,8);
if (valore7==0 && valore8 != 0)
popolazioneZero=true;
if(valore0==r&&valore3==c)
{
if ((conditionsValidatorAggiornata(valore0,valore3,valore6,costo,matrice,b)==true)&& popolazioneZero==false) {
setMatrixValue(matriceCreataD,valore0,valore3,valore6);
setMatrixValue(matrice,valore0,valore3,valore6);
matriceBooleana[valore0][valore3]=true;
b[valore0][valore3]=true;
setMatrixValue(matriceCreataP,valore0,valore3,valore7);
setMatrixValue(matriceCreataT,valore0,valore3,valore8);
}}
}
}
public static boolean conditionsValidatorAggiornata(int riga,int colonna,int nuovoValoreD,int costo,int[][]matrice,boolean[][]b){
if(nuovoValoreD>costo){
if (b[riga][colonna]==false){
System.out.println("aggiorna boolean");
return true;
}
else if(matrice[riga][colonna] > nuovoValoreD){
System.out.println("nuovo valore è"+nuovoValoreD);
return true;}
else return false ; }
else return false;}
public static boolean conditionsValidator(int riga,int colonna,int nuovoValoreD,int nuovoValoreP){
if (matriceBooleana[riga][colonna]==false) return true;
else if(matriceCreataD[riga][colonna] > nuovoValoreD)return true;
else {
return(matriceCreataD[riga][colonna]==nuovoValoreD&&nuovoValoreP>matriceCreataP[riga][colonna]);}
}
public static int getMatrixValue(String[][] matrice,int riga,int colonna){
return Integer.parseInt(matrice[riga][colonna]);
}
public static int setMatrixValue(int[][] matrice,int riga,int colonna,int valore){
return matrice[riga][colonna] = valore;
}
public static void predecessori(){
int i,j;
for(i =0;i<109;i++){
for(j=0;j<109;j++){
if(matriceBooleana[i][j]==true)
predecessori[i][j]=i;
}}
}
public static int getValueArch0(int[]arco){
int value=arco[0];
return value;
}
public static int getValueArch1(int[]arco){
int value=arco[1];
return value;
}
public static int getValueCost(int i,int j,int[][]matrice){
int value=matrice[i][j];
return value;
}
public static int[] sostituzione(int i, int k,int j, int[][] pred,int[][]D,int[][]P,int[][]T){
//System.out.println("manco arriva?");
int[][]archiCicloIK=qualiArchi(i,k,pred);
int[][]archiCicloKJ=qualiArchi(k,j,pred);
if(contaRighe(archiCicloIK)==1&&contaZeri(i,k,archiCicloIK)==0){
int[][]KJmenoZeri=eliminaZeri(k,j,archiCicloKJ,pred);
int[][]KJ=eliminaTestpointZero(KJmenoZeri,T);
int[][]IK=new int[0][2];
int[]eliminalo=arcoEliminato(IK,KJ,D,P);
// System.out.println("eliminalo:");
// System.out.println(eliminalo[0]);
//System.out.println(eliminalo[1]);
return eliminalo;
}
else if(contaRighe(archiCicloKJ)==1&&contaZeri(k,j,archiCicloKJ)==0){
//System.out.println("qua si kj"+k+""+j);
int[][]IKmenoZeri=eliminaZeri(i,k,archiCicloIK,pred);
int[][]IK=eliminaTestpointZero(IKmenoZeri,T);
int[][]KJ=new int[0][2];
int[]eliminalo=arcoEliminato(IK,KJ,D,P);
return eliminalo;
}else{
int[][]IKmenoZeri=eliminaZeri(i,k,archiCicloIK,pred);
int[][]KJmenoZeri=eliminaZeri(k,j,archiCicloKJ,pred);
if(contaRighe(IKmenoZeri)==1&&contaTestpointZero(IKmenoZeri,T)==0){
int[][]KJ=eliminaTestpointZero(KJmenoZeri,T);
int[][]IK=new int[0][2];
int[]eliminalo=arcoEliminato(IK,KJ,D,P);
return eliminalo;
}
else if(contaRighe(KJmenoZeri)==1&&contaTestpointZero(KJmenoZeri,T)==0){
int[][]IK=eliminaTestpointZero(IKmenoZeri,T);
int[][]KJ=new int[0][2];
int[]eliminalo=arcoEliminato(IK,KJ,D,P);
return eliminalo;
}else{
//System.out.println("fin qui bene2");
//System.out.println("fin qui bene3");
//System.out.println("fin qui bene4");
int[][]IK=eliminaTestpointZero(IKmenoZeri,T);
int[][]KJ=eliminaTestpointZero(KJmenoZeri,T);
//System.out.println("fin qui bene5");
int[]eliminalo=arcoEliminato(IK,KJ,D,P);
return eliminalo;
}} }
public static boolean verificaArcoUnico(int i, int j,int costo){
int righe=getNumRighe();
int valore0, valore3, valore6,valore7,valore8;
boolean vero=true;
boolean popolazioneZero;
int contatore=0;
for(int riga=0;riga<righe;riga++){
popolazioneZero=false;
valore0=getMatrixValue(matriceImportata,riga,0);
valore3=getMatrixValue(matriceImportata,riga,3);
valore6=getMatrixValue(matriceImportata,riga,6);
valore7=getMatrixValue(matriceImportata,riga,7);
valore8=getMatrixValue(matriceImportata,riga,8);
if (valore7==0 && valore8 != 0) popolazioneZero=true;
if(i==valore0&&j==valore3&&popolazioneZero==false&&valore6>costo)
contatore++;
}
if (contatore>0)
vero=false;
return vero;
}
public static int[] arcoEliminato(int[][]matrice1, int[][]matrice2,int[][]matriceD,int[][]matriceP){
int z1=contaRighe(matrice1);
int z2=contaRighe(matrice2);
if(z2==0){
float costoPesato1=0;
float p;
long pt1;
pt1=totalePopolazione(matrice1,matriceP);
float ct1;
ct1=totaleCosto(matrice1,matriceD);
int c;
int i,j;
int []arco1=new int[2];
for(int u=0;u<z1;u++){
i=matrice1[u][0];
j=matrice1[u][1];
p=matriceP[i][j];
c=matriceD[i][j];
if(u==0){
arco1[0]=i;
arco1[1]=j;
costoPesato1=costoPesato(p,pt1,c,ct1);}
else{if(costoPesato(p,pt1,c,ct1)<costoPesato1){
arco1[0]=i;
arco1[1]=j;
costoPesato1=costoPesato(p,pt1,c,ct1);}}}
return arco1;
}else if(z1==0){
float costoPesato2=0;
float p;
long pt2;
pt2=totalePopolazione(matrice2,matriceP);
float ct2;
ct2=totaleCosto(matrice2,matriceD);
int c;
int i,j;
int []arco2=new int[2];
//boolean b=false;
for(int u=0;u<z2;u++){
i=matrice2[u][0];
j=matrice2[u][1];
p=matriceP[i][j];
c=matriceD[i][j];
if(u==0){
arco2[0]=i;
arco2[1]=j;
costoPesato2=costoPesato(p,pt2,c,ct2);}
else{
if(costoPesato(p,pt2,c,ct2)<costoPesato2){
arco2[0]=i;
arco2[1]=j;
costoPesato2=costoPesato(p,pt2,c,ct2);}}}
return arco2;}
else{
float costoPesato1=0;
float costoPesato2=0;
float p;
long pt1,pt2;
pt1=totalePopolazione(matrice1,matriceP);
pt2=totalePopolazione(matrice2,matriceP);
long pt=pt1+pt2;
int c;
float ct;
float ct1,ct2;
ct1=totaleCosto(matrice1,matriceD);
ct2=totaleCosto(matrice2,matriceD);
ct=ct1+ct2;
int i,j;
int []arco1=new int[2];
int []arco2=new int[2];
for(int u=0;u<z1;u++){
i=matrice1[u][0];
j=matrice1[u][1];
p=matriceP[i][j];
c=matriceD[i][j];
if(u==0){
arco1[0]=i;
arco1[1]=j;
costoPesato1=costoPesato(p,pt,c,ct);}
else{
if(costoPesato(p,pt,c,ct)<costoPesato1){
arco1[0]=i;
arco1[1]=j;
costoPesato1=costoPesato(p,pt,c,ct);}}}
for(int u=0;u<z2;u++){
i=matrice2[u][0];
j=matrice2[u][1];
p=matriceP[i][j];
c=matriceD[i][j];
if(u==0){
arco2[0]=i;
arco2[1]=j;
costoPesato2=costoPesato(p,pt,c,ct);}
else{
if(costoPesato(p,pt,c,ct)<costoPesato2){
arco2[0]=i;
arco2[1]=j;
costoPesato2=costoPesato(p,pt,c,ct);}}}
if(costoPesato1<costoPesato2)
return arco1;
else return arco2;
}}
public static int[] confrontaArchi(float ciclo1,float ciclo2,int[] arco1,int[]arco2){
if(ciclo1<ciclo2)
return arco1;
else
return arco2;
}
public static float costoPesato(float p,long pt,float c, float ct){
float d=p/pt;
float costoPesato=(p/pt)*3+(c/ct);
return costoPesato;
}
public static long totalePopolazione(int[][]matrice1,int[][]popolazione){
int z1=contaRighe(matrice1);
int i,j;
long p1=0;
for(int x=0;x<z1;x++){
i=matrice1[x][0];
j=matrice1[x][1];
p1=p1 +popolazione[i][j];
}
return p1;}
public static float totaleCosto(int[][]matrice1,int[][]costi){
int z1=contaRighe(matrice1);
int c1=0;
int c1opposto=0;
for(int x=0;x<z1;x++){
int i=matrice1[x][0];
int j=matrice1[x][1];
if(costi[i][j]<0){
// System.out.println("arco negativo1");
c1opposto=modulo(costi[i][j]);
c1=c1+c1opposto;}
else c1=c1 +costi[i][j];
//System.out.println("il costo 1 in"+i+""+j+"è"+c1);
}
return c1;}
public static int modulo(int cn){
int c;
c=-cn;
return c;
}
public static int[][] eliminaTestpointZero(int[][] eliminaZeri,int[][]tp){
int i,j;
int contatore=0;
int t=contaTestpointZero(eliminaZeri,tp);
int [][] eliminaTestpointZero=new int[t][2];
int z=contaRighe(eliminaZeri);
for(int x=0;x<z;x++){
i=eliminaZeri[x][0];
j=eliminaZeri[x][1];
if(tp[i][j]!=0){
eliminaTestpointZero[contatore][0]=eliminaZeri[x][0];
eliminaTestpointZero[contatore][1]=eliminaZeri[x][1];
contatore++;}
}
return eliminaTestpointZero;}
public static int contaTestpointZero(int[][]eliminaZeri,int[][] matrice){
int i, j;
int contatore=0;
int z=contaRighe(eliminaZeri);
for(int x=0;x<z;x++){
i=eliminaZeri[x][0];
j=eliminaZeri[x][1];
if(matrice[i][j]!=0)
contatore++;
}
//System.out.println("qua c'arriva");
return contatore;}
public static int[][] qualiArchi(int i, int j,int[][] pred){
int n_archi=1+contaPredecessori(i,j,pred);
// System.out.println("il numero di archi è"+n_archi);
int arco=0;
int[][]qp=new int[n_archi][2];
for(int c=0;c<n_archi;c++){
if(c==0){arco=getPredecessore(i,j,pred);
qp[c][0]=arco;
qp[c][1]=j;
}
else{qp[c][1]=arco;
qp[c][0]=getPredecessore(i,arco,pred);
arco=getPredecessore(i,arco,pred);
}
}
//System.out.println("quali archi è");
// int x=contaRighe(qp);
// int r,c;
//for(r=0;r<x;r++){
//for(c=0;c<2;c++){
//System.out.print(qp[r][c]+"");}
//System.out.println("");}
return qp;
}
public static int getPredecessore(int i, int j,int[][] pred){
int k=pred[i][j];
return k;
}
public static int contaPredecessori(int i, int j,int[][] pred ){
int d=0;
int c=pred[i][j];
//System.out.println("predecessore è"+c);
if(c!=i){
d++;
return(d+contaPredecessori(i,c,pred));
}else
{//System.out.println("d è"+d);
return d;}
}
public static int[][] eliminaZeri(int i, int k, int[][]cammino, int[][] pred){
int righe=contaZeri(i,k,cammino);
int contatore=0;
int[][]zeriEliminati=new int[righe][2];
int iterazioni=contaRighe(cammino);
//System.out.println("l'iterazioni è :"+iterazioni);
for(int z=0;z<iterazioni;z++){
if (cammino[z][0]!=0){
// System.out.println("cammino0:"+cammino[z][0]);
//System.out.println("cammino1:"+cammino[z][1]);
zeriEliminati[contatore][0]=cammino[z][0];
zeriEliminati[contatore][1]=cammino[z][1];
contatore++;
}
}
//for(int z=0;z<contaRighe(zeriEliminati);z++){
//System.out.println("zeriEliminati:"+zeriEliminati[z][0]);
// System.out.println("zeriEliminati:"+cammino[z][1]);}
return zeriEliminati;
}
public static int contaZeri(int i, int k, int[][]cammino){
int righe=0;
int iterazioni=contaRighe(cammino);
for(int z=0;z<iterazioni;z++){
if (cammino[z][0]!=0)
righe++;
}
return righe;
}
public static int contaRighe(int[][]matrice){
int righe=matrice.length;
return righe;
}
public static int getNumRighe(){
return 10900;
}
public static void importaMatrice(){
try {
int righe = getNumRighe();
String[][] matrice = new String[righe][9];
int riga = 0;
int colonna = 0;
String valore;
int count = -1;
Scanner scanner = new Scanner(ts);
while (scanner.hasNext()) {
count++;
riga = count / 9;
colonna = count - riga * 9;
valore = scanner.next();
matrice[riga][colonna] = valore;
}
matriceImportata=matrice;
} catch (FileNotFoundException ex) {
Logger.getLogger(LetturaMatrici.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void creaMatriceBooleana(){
for(int i=0;i<109;i++){
for(int j=0;j<109;j++){
if(i==j)
matriceBooleana[i][j]=true;
}
}
}
public static boolean[][] creaMatriceBooleanaAggiornata(boolean[][]confronto){
for(int i=0;i<109;i++){
for(int j=0;j<109;j++){
if(i==j)
confronto[i][j]=true;
else confronto[i][j]=false;}
}
return confronto;
}
public static void creaMatrice()
{
int righe=getNumRighe();
int valore0,valore3,valore6,valore7,valore8;
boolean popolazioneZero;
for (int riga=0;riga<righe;riga++){
popolazioneZero=false;
valore0=getMatrixValue(matriceImportata,riga,0);
valore3=getMatrixValue(matriceImportata,riga,3);
valore6=getMatrixValue(matriceImportata,riga,6);
valore7=getMatrixValue(matriceImportata,riga,7);
valore8=getMatrixValue(matriceImportata,riga,8);
if (valore7==0 && valore8 != 0) popolazioneZero=true;
if (conditionsValidator(valore0,valore3,valore6,valore7) && !popolazioneZero) {
setMatrixValue(matriceCreataD,valore0,valore3,valore6);
matriceBooleana[valore0][valore3]=true;
setMatrixValue(matriceCreataP,valore0,valore3,valore7);
setMatrixValue(matriceCreataT,valore0,valore3,valore8);
}
}
} |