[JAVA] Algorithme de détection de génération de méduses

introduction

Lorsque j'ai fait de la plongée en apnée dans la mer l'année dernière, l'ingénieur que j'ai emmené avec moi avait extrêmement peur des méduses. De temps en temps, des méduses venimeuses sortaient et quand je passais devant moi, j'étais terrifiée.

Pour moi, qui aime la mer, cela ressemble à une situation terrible. J'ai pensé à un processus qui me dit quand les méduses sont susceptibles de se produire.

Tout d'abord, organisez personnellement la nature des méduses (voir wiki)

La nature des méduses

J'ai d'abord vérifié

・ Si vous ne créez pas de jet d'eau, il coulera progressivement au fond de l'eau. → Affaiblit progressivement et conduit à la mort ・ Fréquemment attaqué par les pingouins ・ L'action du poison des méduses sur le corps humain varie considérablement selon le type de méduse. ・ Katsuonoeboshi, les méduses Habu et les méduses australiennes Umbachi sont dangereuses ・ Au Japon, si vous allez nager à la plage après Obon, vous serez mordu par une méduse. → Moment où la méduse devient adulte ・ La température de l'eau lors de la reproduction des méduses est d'environ 25 ℃. → Mourir à 30 degrés ・ Parce que la température de l'eau est élevée jusque vers octobre, des méduses sont susceptibles de se produire. ・ Il est difficile de se produire lors de vents forts (vents forts, typhons, etc.) ・ Il est difficile de se produire dans des endroits où la marée est forte. ・ La période d'activité va de mi-août à octobre → Lorsque la température de la mer est élevée ・ Si la température de l'eau est basse, il est peu probable que des méduses se produisent. ・ Même lorsque la température de l'eau de mer est la plus élevée, les méduses seront présentes jusqu'à environ 7 heures du matin Il n'a pas atteint la température à laquelle il est facile de travailler. ・ Quand j'entends le son de la vis du navire, il y a beaucoup de sons aigus. On pense qu'il arrête le mouvement des méduses ・ Lorsque 95% ou plus du corps d'une méduse contient de l'eau → eau douce Couler au fond de la mer

J'ai essayé de trier les propriétés de manière quantitative

・ Les méduses sont vulnérables aux températures élevées → Le taux d'apparition est faible lorsque la température de l'eau est de 27 ° C à 30 ° C.

· Pourcentage pluvieux → Plus il est proche de 100%, moins il est probable qu'il apparaisse → Hypothèse selon laquelle il est peu probable qu'il apparaisse pendant la saison des pluies

・ Le taux d'apparition est élevé du 8/11 au 10/1 → Moment où les méduses deviennent adultes

・ Plus le courant de mer est lent, plus la fréquence des méduses est faible → 1 nœud ≒ 0,5 m / s → 1 ri maritime (1852m) par heure → S'il n'y a pas de débit d'eau, elle coulera au fond

・ Si la concentration de sel de l'eau de mer est faible, elle coulera au fond de la mer. → Parce que la concentration en sel de 34-35ppt convient à la croissance Pas plus de 36ppt

Organiser sur une base de mise en œuvre

conditions

・ Température: 27 ≤ température actuelle ≤ 30

・ Probabilité de précipitation: 50% ≤ température actuelle ≤ 100%

・ Période de danger: 8/11 ≤ date actuelle ≤ 10/1

・ Courant marin: 1,5 1.5 Courant marin actuel

・ Concentration en sel: 36ppt ≤ concentration actuelle

・ La qualité de chaque jugement est un jugement booléen

Méthode de jugement

Bien qu'il s'agisse d'une norme originale, le résultat du jugement est affiché ci-dessous

conditions ① Allons à la mer avec une sensation claire sans se soucier des méduses!  (true,false,false,true,true) ・ Température: 27 ≤ température actuelle ≤ 30 ・ Probabilité de précipitation: 0% -40% ・ Période de danger: 8/11 ≤ date actuelle ≤ autre que 10/1 ・ Courant marin: 1,5 1.5 Courant marin actuel ・ Concentration en sel: 36ppt ≤ concentration actuelle

② Il pleuvra, mais aucune méduse n'apparaîtra! (true,true,false,true,true) ・ Température: 27 ≤ température actuelle ≤ 30 ・ Probabilité de précipitation: 50% -100% ・ Période de danger: 8/11 ≤ date actuelle ≤ autre que 10/1 ・ Courant marin: 1,5 1.5 Courant marin actuel ・ Concentration en sel: 36ppt ≤ concentration actuelle

③ Presque toutes les méduses sortent. Décidons à la maison. (false,false,true,false,false) ・ 27 ≧ Température actuelle ・ Probabilité de précipitation: 0-40% ・ Période de danger: 8/11 ≤ date actuelle ≤ 10/1 ・ Courant marin: 1,5 <courant marin actuel ・ Concentration en sel <36ppt

③ Les bases vont sortir! Cependant, cela peut ne pas apparaître.

★ Condition 1 (vrai, faux, vrai, vrai, vrai) ・ Température: 27 ≤ température actuelle ≤ 30 ・ Probabilité de précipitation: 0% -40% ・ Courant marin: 1,5 1.5 Courant marin actuel ・ Concentration en sel: 36ppt ≤ concentration actuelle     or ★ Condition 2 (vrai, faux, vrai, vrai, vrai) ・ Température: 27 ≧ Température actuelle ・ Probabilité de précipitation: 0% -40% ・ Courant marin: 1,5 1.5 Courant marin actuel ・ Concentration en sel: 36ppt ≤ concentration actuelle     or ★ Condition 3 (vrai, faux, vrai, vrai, vrai) ・ Température: 27 ≤ température actuelle ≤ 30 ・ Probabilité de précipitation: 0% -40% ・ Courant marin: courant marin actuel 1,5 ・ Concentration en sel: 36ppt ≤ concentration actuelle    or ★ Condition 4 (vrai, faux, vrai, vrai, vrai) ・ Température: 27 ≤ température actuelle ≤ 30 ・ Probabilité de précipitation: 0% -40% ・ Courant marin: 1,5 1.5 Courant marin actuel ・ Concentration en sel: concentration actuelle <36ppt

Programme mis en œuvre (enfin ...)

JellyFishAlert.java


import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Calendar;
import java.util.function.Function;

public class JellyFishAlert {

	public static void main(String[] args) {
		
		//Arguments de ligne de commande(Température,pour cent pluvieux,Jugement du courant de mer,Jugement de concentration de sel)
		if(args.length == 4) {
			System.out.println("La valeur requise pour le calcul est OK!");
		}else {
			System.out.println("Spécifiez correctement l'argument de ligne de commande");
			System.exit(0);
		}

		//Générer une carte de jugement(La notation de a à g est oui. .. )
		boolean a[] = {true,false,false,true,true};
		boolean b[] = {true,true,false,true,true};
		boolean c[] = {false,false,true,false,false};
		boolean d[] = {true,false,true,true,true};
		boolean e[] = {true,false,true,true,true};
		boolean f[] = {true,false,true,true,true};
		boolean g[] = {true,false,true,true,true};

		//Jugement de température
		Function<Integer, Boolean> is_temperature = (tmperature) -> {
  			return tmperature >= 27 && tmperature <= 30 ? true : false;
		};
		
		//Jugement de probabilité de précipitation
		Function<Integer, Boolean> is_rainy_percent = (rainy_percent) -> {
  			return rainy_percent >= 50 && rainy_percent <= 100 ? true : false;
		};
		
		//Jugement de la période de danger
		Function<LocalDateTime, Boolean> is_jellyfish_danger_date = (now) -> {
			Calendar cTime = Calendar.getInstance();
  			return now.isBefore(LocalDateTime.of(cTime.get(Calendar.YEAR), 8, 11, 0, 0)) 
  					&& now.isAfter(LocalDateTime.of(cTime.get(Calendar.YEAR), 10, 1, 23, 59)) ? true : false;
		};
		
		//Jugement du courant de mer
		Function<Integer, Boolean> is_ocean_current = (current_knot) -> {
  			return  current_knot <= 1.5 ? true : false;
		};

		//Jugement de concentration de sel
		Function<Integer, Boolean> is_salinity = (current_salinity) -> {
  			return  current_salinity >= 36 ? true : false;
		};
		
		//Conditions actuelles de la mer (température)/pour cent pluvieux/jour dangereux/Courant marin/Concentration en sel)
		boolean state_of_sea[] = {is_temperature.apply(Integer.valueOf(args[0])),
				is_rainy_percent.apply(Integer.valueOf(args[1])),
				is_jellyfish_danger_date.apply(LocalDateTime.now()),
				is_ocean_current.apply(Integer.valueOf(args[2])),
				is_salinity.apply(Integer.valueOf(args[3]))
		};		
		
		//Jugement de correspondance avec des méduses
		if(Arrays.equals(a,state_of_sea)) {
			System.out.println(JellyFishDangerStatus.NODANGER.status);
		}else if (Arrays.equals(b,state_of_sea)){
			System.out.println(JellyFishDangerStatus.LOWDANGER.status);
		}else if (Arrays.equals(c,state_of_sea)) {
			System.out.println(JellyFishDangerStatus.HIGHTDANGER.status);
		}else if(Arrays.equals(d,state_of_sea) 
				|| Arrays.equals(e,state_of_sea) 
				|| Arrays.equals(f,state_of_sea)
				|| Arrays.equals(g,state_of_sea)) {
			System.out.println(JellyFishDangerStatus.MIDDLEDANGER.status);
		}else {
			System.out.println(JellyFishDangerStatus.UNKNOWNDANGER.status);
		}
	}
	
	public enum JellyFishDangerStatus {
        NODANGER("Allons à la mer avec une sensation claire sans se soucier des méduses!"),
        LOWDANGER("Il pleuvra nuageux, mais aucune méduse n'apparaîtra définitivement!"),
        HIGHTDANGER("La plupart des méduses sortent. Décidons à la maison."),
        MIDDLEDANGER("Les bases vont sortir! Cependant, cela peut ne pas apparaître."),
		UNKNOWNDANGER("Imprévisible. Éloignez-vous rapidement de la mer.");

        private final String status;

        private JellyFishDangerStatus(String status) {
        this.status = status;
        }

        public String getStatus() {
            return this.status;
        }
    }
}

À la fin

J'ai passé la plupart de mon temps à rechercher des informations sur les méduses. ..

Il n'est pas possible de vaincre les méduses avec une telle chose, mais j'espère que cela peut aider à créer une situation où le grand public n'a pas peur des méduses. J'aimerais faire d'autres recherches à l'avenir. Ce serait génial s'il pouvait être incorporé dans un drone sous-marin.

Recommended Posts

Algorithme de détection de génération de méduses
Algorithme de détection de pas de pas de Poisson
Automatisation de la génération d'algorithmes à l'aide d'algorithmes génétiques