diff --git a/src/main/java/fr/irstea/associatione/model/Individual.java b/src/main/java/fr/irstea/associatione/model/Individual.java index e50417644b0af4e02c47b6f39bb84467e4463d6c..346c245847cbc4c77eaef023d518f9afc102f5f4 100644 --- a/src/main/java/fr/irstea/associatione/model/Individual.java +++ b/src/main/java/fr/irstea/associatione/model/Individual.java @@ -39,12 +39,20 @@ public class Individual { Arrays.fill(influences, 0); } + public Individual(int id, int popSize, double[] individualsOpinions, double[] subjectOpinions) { + this.id = id; + this.individualsOpinions = individualsOpinions; + this.subjectOpinions = subjectOpinions; + influences = new double[popSize]; + Arrays.fill(influences, 0); + } + public double getOpinionOnIndividual(int ind) { return individualsOpinions[ind]; } public double getOpinionOnSubject(int subject) { - return individualsOpinions[subject]; + return subjectOpinions[subject]; } public void computeInfluences(Parameters parameters) { @@ -60,7 +68,7 @@ public class Individual { public void argumentationImpact(Parameters parameters, Individual fromInd) { for (int k = 0; k < parameters.getNbSubject(); k++) { - subjectOpinions[k] += influences[fromInd.id] * parameters.getRho() * (subjectOpinions[fromInd.id] - subjectOpinions[id]); + subjectOpinions[k] += influences[fromInd.id] * parameters.getRho() * (fromInd.subjectOpinions[k] - subjectOpinions[k]); } } diff --git a/src/main/java/fr/irstea/associatione/model/Model.java b/src/main/java/fr/irstea/associatione/model/Model.java index 0588e6d637c9309c6ac5923d2da01d931dee394a..bbb0760b206f8199164af625cbb06c022a5e3f95 100644 --- a/src/main/java/fr/irstea/associatione/model/Model.java +++ b/src/main/java/fr/irstea/associatione/model/Model.java @@ -42,7 +42,17 @@ public class Model { this.random = new Random(); random.resetNextSubstream(parameters.getSeedIndex()); this.individuals = new Individual[parameters.getPopSize()]; - Arrays.setAll(individuals, i -> new Individual(i, parameters.getPopSize(), parameters.getNbSubject())); + for (int i = 0; i < individuals.length; i++) { + double[] individualsOpinions = new double[parameters.getPopSize()]; + for (int j = 0; j < individualsOpinions.length; j++) { + individualsOpinions[j] = random.nextDouble()*10-1; + } + double[] subjectOpinions = new double[parameters.getNbSubject()]; + for (int j = 0; j < subjectOpinions.length; j++) { + subjectOpinions[j] = random.nextDouble()*2-1; + } + individuals[i] = new Individual(i, parameters.getPopSize(), individualsOpinions, subjectOpinions); + } couples = new ArrayList<>(); for (int i = 0; i < individuals.length; i++) { for (int j = 0; j < i; j++) { @@ -107,7 +117,6 @@ public class Model { } public static void main(String[] args) throws ProcessingException, IllegalArgumentException, IllegalAccessException { - Parameters parameters = new Parameters(0, 50, 1, new DistorsionFromOpinions(), 1, 0.3); Model model = new Model(parameters); parameters.init(model); diff --git a/src/main/java/fr/irstea/associatione/model/Random.java b/src/main/java/fr/irstea/associatione/model/Random.java index ad6080a0dde08e8def02f586db4f97938b08ce11..5d71fcd0c81bc6550e9f1cf44e059913eead61de 100644 --- a/src/main/java/fr/irstea/associatione/model/Random.java +++ b/src/main/java/fr/irstea/associatione/model/Random.java @@ -38,6 +38,14 @@ public class Random { return randomStream.nextInt(i, i1); } + /** + * This method returns a double picked out following a Uniform law between 0 + * and 1 with 0 and 1 excluded (can't be picked out) + */ + public double nextDouble() { + return randomStream.nextDouble(); + } + /** * This method return a random order for a sequence of leng numbers. */ diff --git a/src/main/java/fr/irstea/associatione/model/gui/GUI.java b/src/main/java/fr/irstea/associatione/model/gui/GUI.java index aa8554040c122d8a852e1d5956e26f3f4f436d8f..7103ad99fe8c42d4910de2b5d511744340a66886 100644 --- a/src/main/java/fr/irstea/associatione/model/gui/GUI.java +++ b/src/main/java/fr/irstea/associatione/model/gui/GUI.java @@ -21,6 +21,7 @@ import fr.irstea.associatione.model.Parameters; import fr.irstea.associatione.model.ProcessingException; import fr.irstea.associatione.model.distorsion.DistorsionFromOpinions; import java.awt.GridLayout; +import java.util.Arrays; import javax.swing.JFrame; import javax.swing.JPanel; import org.jfree.chart.ChartFactory; @@ -60,9 +61,9 @@ public class GUI { opinionsMeanOnSubjects.addSeries(new XYSeries(i)); } chartsPanel.removeAll(); - credibilityChartPanel = new ChartPanel(createHistogram(model.getCredibility())); + credibilityChartPanel = new ChartPanel(createHistogram("Credibility", model.getCredibility())); chartsPanel.add(credibilityChartPanel); - chartsPanel.add(new ChartPanel(ChartFactory.createXYLineChart("Opinions means on subjects", "timesteps", "opinions", opinionsMeanOnSubjects, PlotOrientation.VERTICAL, true, true, false))); + chartsPanel.add(new ChartPanel(ChartFactory.createXYLineChart("Opinions means on subjects", "timesteps", "opinions", opinionsMeanOnSubjects, PlotOrientation.VERTICAL, false, true, false))); } public void init(Parameters parameters) throws ProcessingException, IllegalArgumentException, IllegalAccessException { @@ -71,7 +72,8 @@ public class GUI { initCharts(); frame.pack(); frame.setVisible(true); - for (int i = 0; i < 500; i++) { + updatePlots(model.getTimestep()); + for (int i = 0; i < 50; i++) { model.iter(); updatePlots(model.getTimestep()); } @@ -81,26 +83,26 @@ public class GUI { double[] data = new double[]{0.3, 0.3, 0.5, 0.6, 0.65}; JFrame f = new JFrame("test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - f.setContentPane(new ChartPanel(createHistogram(data))); + f.setContentPane(new ChartPanel(createHistogram("Credibility", data))); f.pack(); f.setVisible(true); } public void updatePlots(int timestep) { - credibilityChartPanel.setChart(createHistogram(model.getCredibility())); - for (int i = 0; i < model.getParameters().getPopSize(); i++) { - double[] data = model.getOpinionsMeanOnSubjects(); + credibilityChartPanel.setChart(createHistogram("Credibility", model.getCredibility())); + double[] data = model.getOpinionsMeanOnSubjects(); + for (int i = 0; i < data.length; i++) { opinionsMeanOnSubjects.getSeries(i).add(timestep, data[i]); } } - public static JFreeChart createHistogram(double[] data) { + public static JFreeChart createHistogram(String title, double[] data) { HistogramDataset dataset = new HistogramDataset(); dataset.setType(HistogramType.SCALE_AREA_TO_1); - dataset.addSeries("Histogram", data, 30); - String plotTitle = "Histogram"; - String xaxis = "number"; - String yaxis = "value"; + dataset.addSeries(title, data, 30); + String plotTitle = title; + String xaxis = "opinions"; + String yaxis = "amount"; PlotOrientation orientation = PlotOrientation.VERTICAL; boolean show = false; boolean toolTips = false;