Il peut être considéré comme un problème de sac à dos. Résolvons-le avec Python. Voir le lien de référence pour l'optimisation mathématique avec Python.
python3
import numpy as np
from pulp import *
np.random.seed(1)
Nombre d'étoiles= 1000
Heure de l'enquête= np.random.randint(10,100,Nombre d'étoiles)
Probabilité de découverte= np.random.random(Nombre d'étoiles)/100000
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(Nombre d'étoiles)]
m += lpDot(Probabilité de découverte,x)
m += lpDot(Heure de l'enquête,x) <= 10000
m.solve()
print(value(m.objective)) #Somme des probabilités de découverte
>>>
0.0022822674119170536
En fait, les fusées ont une portée de croisière maximale. Ici, le nombre maximum de sauts + 1 est mx, pas simplement la distance. Voyons ce qui arrive à la fonction objectif lorsque nous changeons mx. L'axe horizontal est mx et l'axe vertical est la fonction objectif.
python3
r = []
for mx in range(4,17):
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(Nombre d'étoiles)]
m += lpDot(Probabilité de découverte,x)
m += lpDot(Heure de l'enquête,x) <= 10000
for i in range(Nombre d'étoiles-mx+1):
m += lpSum(x[i:i+mx]) >= 1 #Rechercher au moins un emplacement dans mx
m.solve()
r.append(value(m.objective))
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16);
Essayez d'agrandir.
python3
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16)
plt.xlim((9,16))
plt.ylim((0.00227,0.0023));
Avec le solveur gratuit par défaut CBC, en raison d'erreurs, plus la solution est restrictive, mieux c'est.
Le solveur commercial a été résolu plus précisément.
Lien de référence
c'est tout
Recommended Posts