[PYTHON] Problem bei der Platzierung von Krankenwagen - Aus der Oktoberausgabe des OR-Magazins

Was ist das

OR Society Oktoberausgabe des Magazins ["** Studenten-OR **" - Sonderfunktion](http://www.orsj.or.jp/ Aus e-library / elcorsj.html # 6110) möchte ich das Optimierungsproblem entsprechend aufgreifen und mit Python lösen. Zur Vorbereitung benötigen Sie Pandas, Fruchtfleisch, ortoolpy. Für die Umgebungskonstruktion [Kombinationsoptimierung verwenden](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88% Wir verweisen auf E3% 81% AE% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB).

Problem bei der Platzierung von Krankenwagen

Lassen Sie mich das Problem des Papiers "Entwerfen einer effektiven Methode unter Verwendung genetischer Programmierung für das Problem der Verlagerung von Krankenwagen" verwenden. Lass es uns bekommen. In der Arbeit handelt es sich um ein Problem bei der Verlagerung von Krankenwagen, aber hier konzentrieren wir uns auf das Problem der Platzierung von Krankenwagen.

Platzieren Sie Krankenwagen in mehreren Bereichen. Die Kapazität und der Bedarf, die zugewiesen werden können, werden für jede Region festgelegt. Außerdem muss die Bewegung innerhalb von 10 Minuten erfolgen. Minimieren Sie zu diesem Zeitpunkt die Gesamtfahrzeit.

Denkweise

[p-Median Problem](http://www.orsj.or.jp/~wiki/wiki/index.php/P-%E3%83%A1%E3%83%87%E3%82%A3%E3 % 82% A2% E3% 83% B3% E5% 95% 8F% E9% A1% 8C) Lösen wir es also schnell.

Löse mit Python

Erstellen Sie zunächst zufällige Daten.

python


import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvar, addvars

n = 3 #Anzahl der Regionen
rn = range(n)
np.random.seed(2)
tm = (np.random.rand(n, n) * 20).round(0)
tm[np.diag_indices(n)] = 0
tm #Reisezeit(Protokoll)
>>>
array([[  0.,   1.,  11.],
       [  9.,   0.,   7.],
       [  4.,  12.,   0.]])

python


cap = np.random.randint(2, 5, n)
cap #Kapazität
>>>
array([4, 2, 2])

python


dem = np.random.randint(2, 4, n)
dem #Nachfrage
>>>
array([2, 3, 3])

Erstellen Sie eine Variablentabelle. Erstellen Sie zu diesem Zeitpunkt keine Variablen mit einer Laufzeit von 10 Minuten oder mehr.

python


a = pd.DataFrame(((i,j,dist[i,j]) for i in rn for j in rn
        if dist[i,j]<=10), columns=['From', 'To', 'Tm'])
a['Var'] = addvars(len(a))
a[:3]
From To Tm Var
0 0 0 0.0 v1
1 0 1 1.0 v2
2 1 0 9.0 v3

Formulieren und lösen wir es.

python


m = LpProblem()
m += lpDot(a.Tm, a.Var)
for i, t in a.groupby('From'):
    m += lpSum(t.Var) <= cap[i]
for i, t in a.groupby('To'):
    m += lpSum(t.Var) >= dem[i]
m.solve()
a['Val'] = a.Var.apply(value)
a[a.Val > 0]
From To Tm Var Val
0 0 0 0.0 v1 2.0
1 0 1 1.0 v2 2.0
3 1 1 0.0 v4 1.0
4 1 2 7.0 v5 1.0
6 2 2 0.0 v7 2.0

das ist alles

Recommended Posts

Problem bei der Platzierung von Krankenwagen - Aus der Oktoberausgabe des OR-Magazins
Optimaler Messplan - Ab der Oktoberausgabe des OP-Magazins
Food Desert Problem - Aus der Oktoberausgabe des OP-Magazins
Optimierung der Boarding-Strategien für Flugzeuge - ab der Oktober-Ausgabe des OR-Magazins
Existenz aus Sicht von Python
Illustration der Ergebnisse des Rucksackproblems
Notizen vom Anfang von Python 1 lernen
Lassen Sie die Stückliste am Anfang der Zeichenfolge weg
GoF-Entwurfsmuster aus dem Problem 1. Generation
Notizen vom Anfang von Python 2 lernen
GoF-Entwurfsmuster aus dem Problem 3. Verhalten
Dyxtra-Methode: Ich habe das Problem von AOJ mit Python anhand des Inhalts von Kencho-sans Artikel in der Oktober-Ausgabe von Software Design gestellt.