Gestion du tampon dans ONE simulator

Résolu/Fermé
pudya - Modifié le 30 juil. 2017 à 01:53
 pudya - 19 août 2017 à 20:58
Bonjour,
Afin de simuler mon modèle que je dois écrire en java, je souhaiterais une aide en java pour résoudre le problème de comparaison de deux messages selon leur nombre de transmission.



import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import core.Message;
import core.Settings;
import routing.ActiveRouter;

/**
* Drop the messages with the maximum number of transmissions first, i.e., the most forwarded 
* messages.
*/
public class MOFODropPolicy extends DropPolicy {

 /**
* Used to configure the initial value of forward count. When configured to 0, a message
* that hasn't be sent yet will never be dropped. When configured to a positive number
* the algorithm will always drop a message.
*/
  
 public MOFODropPolicy(Settings s) {
  super(s);
  // It doesn't need specific settings.
 }

 @Override
 public boolean makeRoomForMessage(ActiveRouter router, Message incomingMessage) {
  
  int size = incomingMessage == null ? 0 : incomingMessage.getSize();
  
  if (size > router.getBufferSize()) {
   return false; // message too big for the buffer
  }
  
  int  freeBuffer = router.getFreeBufferSize();
  
  // Check if there is enough space to receive the message before sorting the buffer
  if (freeBuffer >= size) {
   return true;
  }
  
  // Sort the messages by forward count
  ArrayList<Message> messages = new ArrayList<Message>(router.getMessageCollection());
  Collections.sort(messages, new MOFOComparator());
  
  /* Delete messages from the buffer until there is enough space */
  while (freeBuffer < size) {
   
   if (messages.size() == 0) {
    return false; // couldn't remove more messages
   }
   
   // Get the message that was most forwarded
   Message msg = messages.remove(messages.size()-1);
   
   // Check if the router is sending this message
   if (this.dropMsgBeingSent || !router.isSending(msg.getId())) {
    // Delete the message and send signal "drop"
    router.deleteMessage(msg.getId(), true);
    freeBuffer += msg.getSize();
   }
  }
  
  return true;
  
 }
 
 private class MOFOComparator implements Comparator<Message> {
  
  
  @Override
  public int compare(Message msg1, Message msg2) {
   
   int m1= msg1.getForwardCount();
   int m2= msg2.getForwardCount();
   if (msg1 == msg2){
    return 0;
   }
   if (m1 < m2){
    return -1;
   }else if (m1 > m2){
    return 1;
   }
   return ((Integer)msg1.getForwardCount()).compareTo(msg2.getForwardCount()); 
   
  }
  
 }

}

quand j'exécute ce programme, il me donne le même résultat comme si la partie de ci-dessous n'existe pas.
public int compare(Message msg1, Message msg2) {
   
   int m1= msg1.getForwardCount();
   int m2= msg2.getForwardCount();
   if (msg1 == msg2){
    return 0;
   }
   if (m1 < m2){
    return -1;
   }else if (m1 > m2){
    return 1;
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
30 juil. 2017 à 02:11
Bonjour,

La classe de comparaison MOFOComparator ne sert à rien, tu peux la remplacer par un comparateur standard :
Collections.sort(messages,Comparator.comparingInt(Message::getForwardCount));

Il faudrait que tu affiches la liste avant et après mais il n'y a pas de raison pour que ce ne soit pas trié...
0
bonjour,
quand j'introduit le code proposé,
Collections.sort(messages,Comparator.comparingInt(Message::getForwardCount));
, dans mon programme ainsi libellé:
/*


* Copyright 2016 Aalto University, ComNet

* Released under GPLv3. See LICENSE.txt for details.

*/

package bufdrop;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import core.Message;
import core.Settings;
import routing.ActiveRouter;

/**


* Drop the messages with the maximum number of transmissions first, i.e., the most forwarded 

* messages.

*/
public class MOFODropPolicy extends DropPolicy {

  
 public MOFODropPolicy(Settings s) {
  super(s);
  // It doesn't need specific settings.
 }

 @Override
 public boolean makeRoomForMessage(ActiveRouter router, Message incomingMessage) {
  
  int size = incomingMessage == null ? 0 : incomingMessage.getSize();
  
  if (size > router.getBufferSize()) {
   return false; // message too big for the buffer
  }
  
  int  freeBuffer = router.getFreeBufferSize();
  
  // Check if there is enough space to receive the message before sorting the buffer
  if (freeBuffer >= size) {
   return true;
  }
  
  // Sort the messages by forward count
  ArrayList<Message> messages = new ArrayList<Message>(router.getMessageCollection());
  Collections.sort(messages,Comparator.comparingInt(Message::getForwardCount));
  
  /* Delete messages from the buffer until there is enough space */
  while (freeBuffer < size) {
   
   if (messages.size() == 0) {
    return false; // couldn't remove more messages
   }
   
   // Get the message that was most forwarded
   Message msg = messages.remove(messages.size()-1);
   
   // Check if the router is sending this message
   if (this.dropMsgBeingSent || !router.isSending(msg.getId())) {
    // Delete the message and send signal "drop"
    router.deleteMessage(msg.getId(), true);
    freeBuffer += msg.getSize();
   }
  }
  
  return true;
  
 }
 
 }

je reçoit l'erreur suivante: Syntax error on tokens, delete these tokens
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 août 2017 à 17:43
Tu codes avec quelle version de Java ?

Par défaut je suppose que tu as la dernière version, mais ton erreur laisse à penser que tu en utilises une plus ancienne...
0
pudya > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
9 août 2017 à 01:55
la version 1.6 de java étant donné que ONE Simulator fonctionne avec cette version
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > pudya
9 août 2017 à 12:39
Si on se réfère à la documentation, c'est compatible avec "Java 6 JDK or later"
Donc il n'y a pas de raison de te limiter à Java 6 pour coder, tu peux utiliser les dernières versions.

Mais s'il fallait le faire en Java 6 tu pourrais écrire :

Collections.sort(messages, new Comparator<Message>() {
    @Override
    public int compare(Message m1, Message m2) {
        return m1.getForwardCount() - m2.getForwardCount();
    }
});

Remarque : Java 6 est sorti en 2006 ! Donc sachant que Java 9 sort en septembre, en continuant à coder en Java 6 tu auras bientôt 3 versions majeures de retard !
0
pudya > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
19 août 2017 à 20:58
merci.
j;ai suivi vos conseils. je me suis mis à java 8
0