OR Society Numéro d'octobre de la revue [Dossier spécial "** Students 'OR **"](http://www.orsj.or.jp/ De e-library / elcorsj.html # 6110), je voudrais aborder le problème d'optimisation de manière appropriée et le résoudre avec Python. En tant que préparation, vous avez besoin de numpy, de pulpe, d'oolpy. Pour la construction de l'environnement, [Utiliser l'optimisation des combinaisons](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88% Veuillez vous référer à E3% 81% AE% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB).
Permettez-moi d'utiliser le problème de l'article "Analyse du problème des desserts alimentaires dans la ville de Nagasaki".
Placez une épicerie fraîche pour tout le monde et minimisez le nombre de places. Le grand public doit se trouver à moins de 5000 m et les personnes âgées à moins de 1500 m.
Problème de placement d'installation sans restrictions de capacité.
Tout d'abord, créez des données aléatoires.
python
import numpy as np
from pulp import *
from ortoolpy import addvar, addvars
nc, n1, n2 = 4, 2, 2 #Nombre de points candidats, nombre de zones publiques générales, nombre de zones pour personnes âgées
np.random.seed(2)
dist1 = np.random.randint(4000, 6000, (nc, n1))
dist1 #Distance entre le point candidat et la zone grand public
>>>
array([[5192, 4527],
[4493, 5608],
[5558, 4299],
[4466, 5099]])
python
dist2 = np.random.randint(1000, 2000, (nc, n1))
dist2 #Distance entre le point candidat et la zone des personnes âgées
>>>
array([[1360, 1263],
[1674, 1433],
[1607, 1587],
[1725, 1047]])
Formulez et résolvez.
python
m = LpProblem()
x = addvars(n, cat=LpBinary) #variable
m += lpSum(x) #Fonction objective
for i in range(n1):
m += lpDot(dist1[i] <= 5000, x) >= 1 #Contrainte
for i in range(n2):
m += lpDot(dist2[i] <= 1500, x) >= 1 #Contrainte
m.solve()
[int(value(v)) for v in x]
>>>
[1, 1, 0, 0]
c'est tout
Recommended Posts