$$\rightleftharpoonup{xx}$$
$$\longleftharp{xx}$$,
$$\longrightharp{xx}$$,
1. Mise en place de Dwave Ocean Environment
- Téléchargez et installez les outils océaniques à partir du lien : https://docs.ocean.dwavesys.com/en/stable/overview/install.html
- Au terminal, tapez python -m venv ocean.
- Sur le terminal, tapez . ocean/bin/activate, comme illustré à la Figure 1.
- Dans le terminal, tapez git clone https://github.com/dwavesystems/dwave-ocean-sdk.git
Ensuite, tapez cd dwave-ocean-sdk, comme illustré à la figure 2.
Ensuite, tapez python setup.py installer

Figure 1 : Activation de l’environnement virtuel de l’océan. Le package Ocean, en tant qu’API D-wave intégrée, offre une expérience utilisateur nuageuse sur l’ordinateur de l’utilisateur jusqu’au site de la machine D-wave. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 2 : Installation du SDK Ocean. Le forfait Ocean fournit les kits d’outils nécessaires pour les développeurs, y compris une installation pratique de Cplex. Veuillez cliquer ici pour voir une version agrandie de cette figure.
2. Installation de l’interface de l’API Python de Cplex
- Téléchargez et installez Cplex : https://pypi.org/project/cplex/
- Sur le terminal, tapez pip install cplex.
3. Paramètres de configuration de l’expérience
- Configurez les paramètres de configuration de l’expérience mentionnés dans le tableau 1 à l’aide de la notation de programmation Python dans le script, comme illustré dans la figure supplémentaire 1. Une fois le script exécuté et exécuté, le langage sous-jacent stocke les variables dans la RAM. Vous trouverez ci-joint une capture d’écran des codes Python auxquels les paramètres sont respectivement affectés (Figure 1 supplémentaire).
| d0 | 87,7085 m d’altitude |
| E | 50 * 1 x 10-09 joules |
| epson_fs | 1 * 10-12 * 10 joules |
| epson_mp | 0,0013 * 1 * 10-12 joules |
| Taille du paquet | 4000 bits |
Tableau 1 : Paramètres du modèle énergétique et paramètres de taille des paquets.
Figure supplémentaire 1 : Script1. Script pour configurer les paramètres de l’expérience. Veuillez cliquer ici pour télécharger ce fichier.
4. Scripts Python
- Préparez les scripts Python pour générer 198 positions 2D de nœud de capteur qui sont également dispersées en six secteurs qui divisent la zone circulaire avec un rayon de 50 m.
REMARQUE : Le graphique circulaire est segmenté en 6 secteurs. Dans chaque secteur, la position de chaque nœud est traitée avec deux variables correspondantes. L’un est l’angle et l’autre est le rayon. Attribuez des valeurs à l’angle et au rayon à l’aide d’un générateur de distribution aléatoire uniforme. La procédure détaillée est illustrée à la figure supplémentaire 2 et à la figure supplémentaire 3.
- À l’intérieur de chaque secteur, assurez-vous que les 33 nœuds de capteurs sont dispersés de manière aléatoire selon une distribution normale. Enregistrez les positions 2D dans des fichiers texte pour chaque secteur sous la règle d’orthographe du nom sous la forme 'posdata'+sector_no+'.txt' (Figure 3 et Figure 4).
- Segmentez la zone circulaire d’un rayon de 50 m en six secteurs. Les valeurs angulaires de départ pour ces six secteurs donnent le vecteur A= [60,120,180,240,300,360].
- Supposons que l’index sectoriel soit i, définissez la longueur du pôle pour le jème nœud du capteur comme l_{i,j}=50*random.random()
- Supposons que l’indice sectoriel soit i, définissez la valeur angulaire pour jème nœud de capteur comme ang_{i,j}=(60*random.random() + A_i - 60) * 2 * pi / 360
- Définissez les coordonnées cartésiennes du jème noeud du capteur dans ième secteur comme suit :
x_{i,j}=l_{i,j}*cos(ang_{i,j})
y_{i,j}=l_{i,j}*sin(ang_{i,j})
Figure supplémentaire 2 : Script2. Script permettant de configurer les deux emplacements de position de cote pour chaque noeud par secteur. Veuillez cliquer ici pour télécharger ce fichier.
Figure supplémentaire 3 : Script3. Script permettant de configurer les valeurs de position de chaque nœud dans 1 secteur. Veuillez cliquer ici pour télécharger ce fichier.

Figure 3 : Positions de noeuds générées et stockées séparées en 6 fichiers, chacun correspondant à un secteur. Les positions en deux dimensions sont enregistrées dans 6 fichiers posdata+'idx'. Chacune présente un secteur. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 4 : Positions des noeuds stockées dans le secteur 0. Les positions sont en deux dimensions et générées à l’aide d’un générateur aléatoire uniforme. La première colonne représente les emplacements horizontaux et la deuxième colonne les emplacements verticaux. Veuillez cliquer ici pour voir une version agrandie de cette figure.
5. Préparer les niveaux d’énergie initiaux
- Préparez les niveaux d’énergie initiaux pour les 198 nœuds de capteurs. Attribuez à la moitié d’entre eux une énergie initiale de 0,5 J et à l’autre moitié une énergie initiale de 1 J. Créez un tableau pour stocker le niveau d’énergie de chaque nœud et utilisez une boucle pour attribuer aux cellules séquencées en nombres pairs la valeur 1 et à celles séquencées en nombres impairs la valeur 0,5. La figure 4 supplémentaire montre les codes Python, et le résultat est illustré à la figure 5.
Figure supplémentaire 4 : Script4. Script pour assigner la moitié de l’énergie du nœud de 1 joule et l’autre 0,5 joule. Veuillez cliquer ici pour télécharger ce fichier.

Figure 5 : Energy_buffer affectation initiale. La moitié des nœuds sont affectés avec une énergie de 1 joule, tandis que les autres moitiés sont affectées avec 0,5 joule. Veuillez cliquer ici pour voir une version agrandie de cette figure.
6. Préparation Advanced_Leach script d’algorithme (Figure 6 et Figure 7)
- Préparez un script fonctionnel dans lequel la tête de cluster est sélectionnée et le cluster est formé.
REMARQUE : Le cluster est sélectionné à l’aide d’une boucle à condition que le nombre de têtes de cluster sélectionnées soit inférieur au nombre total de nœuds divisé par 6. La condition consiste à s’assurer qu’au sein de chaque cluster, la quantité de nœuds source est égale ou inférieure à 6. Dans la boucle, chaque nœud se voit attribuer un nombre aléatoire compris entre [0,1]. Ceux qui sont plus petits qu’un nombre de critères donné deviennent la tête du cluster, tandis que d’autres deviennent les nœuds source. La procédure détaillée est illustrée à la figure supplémentaire 5. Ensuite, étant donné un pool fixe de têtes de cluster, le reste des nœuds sources sélectionne leurs têtes de cluster sur la distance la plus courte, étant donné que la tête de cluster n’a pas encore hébergé plus de 6 nœuds source. La procédure détaillée est illustrée à la figure supplémentaire 6.- Définissez T_n=P/(1-P*(count%(1/P)))), où P = 0,2 (le taux proportionnel du nombre de têtes de cluster à la taille globale du réseau) et le nombre est la quantité d’arrondi de transmission à ce jour.
- Pour chaque noeud de capteur, atteindre un nombre aléatoire entre [0,1] threshold_rm = random.random()
- Si threshold_rm est inférieur à T_n, sélectionnez ce nœud de capteur comme tête de cluster.
- Pour chacun des noeuds non cluster_head, sélectionnez le noeud de capteur de tête de cluster le plus proche de celui-ci en tant que tête de cluster. Étant donné un pool fixe de têtes de cluster, le reste des nœuds source sélectionne leurs têtes de cluster à la distance la plus courte, étant donné que la tête de cluster n’a pas encore hébergé plus de 6 nœuds source. La procédure détaillée est illustrée à la figure supplémentaire 6.
- Préparez les lignes de commande pour calculer le processus d’épuisement de l’énergie sur l’ensemble du réseau pour ce tour. Pour chaque exécution de l’algorithme qui effectue un lot de livraisons de paquets des nœuds sources vers le récepteur, la baie de stockage d’énergie telle qu’elle a été préparée sera mise à jour pour avoir des valeurs réduites cellule par cellule. La consommation d’énergie le long du chemin sera la somme de la consommation d’énergie par route nœud à nœud, qui est calculée selon un modèle énergétique1. La procédure détaillée est illustrée à la figure supplémentaire 7.
- Calculez les métriques de cycle de transmission requises.
REMARQUE : À chaque exécution de l’algorithme pour effectuer un lot de livraison de paquets, le réseau d’énergie est mis à jour, la quantité d’exécution et le nombre de nœuds vidés sont comptés. Si la valeur est supérieure ou égale à 1, FND (premier nœud dé) est égal à la quantité d’exécution actuelle. Si la valeur est supérieure ou égale à la moitié de la valeur du nœud, la valeur HND (demi-matrice de nœud) est égale à la valeur d’exécution actuelle. Si la valeur est égale à la quantité totale de noeud, alors ET(matrice de tous les noeuds) est égale à la quantité d’exécution actuelle. La procédure détaillée est illustrée à la figure supplémentaire 8.

Figure 6 : Réseau de têtes de cluster. Numéros de séquence des noeuds qui ont été sélectionnés pour être les têtes de cluster. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 7 : Tableau d’index de tête de cluster. Étant donné qu’il y a six secteurs, chacun avec 33 noeuds de capteur, dans le tableau d’index de tête de cluster, le nombre indique le numéro de séquence de la tête de cluster à laquelle appartient le noeud de capteur correspondant. L’indice de position du réseau correspond au numéro de séquence de chaque nœud de capteur. Pour le noeud de capteur sélectionné comme tête de cluster, le numéro attribué à son emplacement dans la matrice est le numéro de séquence de lui-même. Veuillez cliquer ici pour voir une version agrandie de cette figure.
Figure supplémentaire 5 : Script5. Script pour sélectionner la tête de cluster. Veuillez cliquer ici pour télécharger ce fichier.
Figure supplémentaire 6 : Script6. Script permettant d’affecter des noeuds sources à des clusters. Veuillez cliquer ici pour télécharger ce fichier.
Figure supplémentaire 7 : Script7. Script permettant de mettre à jour le tampon d’énergie pour tous les nœuds source via la réduction de la quantité d’énergie consommée par la transmission. Veuillez cliquer ici pour télécharger ce fichier.
Figure supplémentaire 8 : Script8. Script pour calculer le nombre d’arrondis jusqu’à laquelle le premier noeud meurt et la moitié des noeuds meurent. Veuillez cliquer ici pour télécharger ce fichier.
7. Préparation d’un script d’algorithme quantique hybride
- Préparez un script fonctionnel dans lequel la tête de cluster est sélectionnée et la tête de cluster est formée.
- Comme la taille maximale de la grappe est de 6 dans cette expérience1, assurez-vous que le nombre de têtes de grappe n’est pas inférieur à current_valid_node_amount/6, la procédure de sélection sera exécutée en boucle jusqu’à ce que ce critère soit rempli.
REMARQUE : Si current_valid_node_amount n’est pas supérieur à 6, ces nœuds valides forment eux-mêmes un seul et unique cluster.
- Pour chacun des noeuds non cluster_head_valid, calculez la distance de celui-ci par rapport à chacune des têtes de cluster sélectionnées et affectez-lui la tête de cluster dont la taille de cluster n’a pas dépassé 6 où la valeur de distance est la plus petite.
REMARQUE : Dans la Figure 8, les distances de tous les noeuds non cluster_head_valid par rapport à la tête de cluster sélectionnée 24 sont calculées, et toutes les têtes de cluster sélectionnées sont affichées dans la Figure 9. La figure 10 montre que tous les noeuds sont affectés à leur tête de cluster correspondante, et la figure 11 montre le regroupement des noeuds membres de chaque cluster dans un réseau vectoriel.
- Préparez le script de sous-fonction, où le problème d’optimisation du routage par cluster est formé et soumis à l’API D-wave (Figure 12). Les chemins de routage sont calculés cluster par cluster.
- À l’aide d’un script Python, calculez le processus d’épuisement de l’énergie sur l’ensemble du réseau pour évaluer quantitativement l’algorithme en fonction de la durée de vie du réseau en termes de nombre de cycles de transmission.
REMARQUE : Pour chaque exécution de l’algorithme qui effectue un lot de livraisons des paquets des nœuds sources vers le récepteur, la baie de stockage d’énergie telle qu’elle a été préparée sera mise à jour pour avoir des valeurs réduites cellule par cellule. La consommation d’énergie le long du chemin sera la somme de la consommation d’énergie par route nœud à nœud, calculée selon un modèle énergétique1. La procédure détaillée est illustrée à la figure supplémentaire 7.
- À l’aide d’un script Python, enregistrez le moment où le premier nœud est vidé et où la moitié des nœuds sont vidangés. La procédure détaillée est illustrée à la figure supplémentaire 8.

Figure 8 : toClusterHeadDistance Array pour un nœud non cluster_head avec l’index 24. La première colonne est la distance et la deuxième colonne est le numéro d’index de la tête de grappe Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 9 : CHID_buff tableau. Numéros de séquence des noeuds de capteur sélectionnés en tant que têtes de cluster. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 10 CHIdx_buff tableau. Attribuez le numéro de séquence des noeuds de capteur de tête de cluster à chaque noeud de capteur correspondant. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 11 : tableau CH_BUFF. Groupe de clusters par noeuds de capteur de tête de cluster correspondant à la CHID_buff de la matrice. Chaque groupe de clusters se compose de 0 ou de 0 nœud de capteur. Chaque tableau de groupe de clusters affiche les numéros de séquence des nœuds de capteurs qui s’y trouvent. Veuillez cliquer ici pour voir une version agrandie de cette figure.

Figure 12 : Calcul du chemin de routage par secteur. Pour chaque secteur, les chemins de routage de tous les noeuds sources sont calculés. Veuillez cliquer ici pour voir une version agrandie de cette figure.