[PYTHON] Food Desert Problem - Extrait du numéro d'octobre du magazine OR

Qu'est-ce que c'est

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).

Problème de dessert alimentaire

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.

Façon de penser

Problème de placement d'installation sans restrictions de capacité.

Résoudre avec Python

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

Food Desert Problem - Extrait du numéro d'octobre du magazine OR
Plan de mesure optimal - Extrait du numéro d'octobre du magazine OR
Problème de placement d'ambulance - Tiré du numéro d'octobre du magazine OR
Optimisation des stratégies d'embarquement pour les avions - du numéro d'octobre du magazine OR