Array aufteilen
Code der Main-Datei:
Code: Alles auswählen
from gurobipy import *
from Einlesen_Prodhon_Funktion import read_textfile
from Fahrtkosten_berechnen_Funktion import errechne_fahrtkosten_ersterStufe
from Fahrtkosten_berechnen_Funktion import errechne_fahrtkosten_zweiterStufe
from optLsg_Funktion import berechne_Crainic_drei_Indizes
#_______________________________________________________________________
##Funktion read_textfile aus der Datei Einlesen_Prodhon_Funktion, die eine Textdatei
##der Standardinstanzen von Prodhon (Link: http://prodhonc.free.fr/) einliest
data = read_textfile('coord20-5-1-2e.txt')
##Inputparametern der Funktion werden die Daten der eingelesenen Datei zugewiesen
#Inputparameter bezüglich der Plattform
plattform = data[0]
koordinaten_plattform = data[1]
kapazitaet_plattform = data[2]
fixkosten_plattform = data[3]
anzahl_plattform = data[4]
#Inputparameter bezüglich den Satelliten
satellit = data[5]
koordinaten_satellit = data[6]
kapazitaet_satellit = data[7]
fixkosten_satellit = data[8]
anzahl_satellit = data[9]
#Inputparameter bezüglich den Kunden
kunde = data[10]
koordinaten_kunde = data[11]
kundennachfrage = data[12]
anzahl_kunde = data[13]
#Inputparameter bezüglich der Menge an Standorten
standorte_ersterStufe = data[14]
koordinaten_standorte_ersterStufe = data[15]
standorte_zweiterStufe = data[16]
koordinaten_standorte_zweiterStufe = data[17]
alleStandorte = data[18]
anzahlStandorte = data[19]
#Inputparameter bezüglich der Primärfahrzeuge
primaerfahrzeug = data[19]
kapazitaet_primaerfahrzeug = data[20]
nutzungskosten_primaerfahrzeug = data[21]
anzahl_primaerfahrzeug = data[22]
#Inputparameter bezüglich der Sekundärfahrzeuge
sekundaerfahrzeug = data[23]
kapazitaet_sekundaerfahrzeug = data[24]
nutzungskosten_sekundaerfahrzeug = data[25]
anzahl_sekundaerfahrzeug = data[26]
#_______________________________________________________________________
##mit der Funktion errechne_fahrtkosten_ersterStufe aus der Datei Fahrtkosten_berechnen_Funktion,
##werden die Fahrtkosten der ersten Stufe berechnet
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
##mit der Funktion errechne_fahrtkosten_zweiterStufe aus der Datei Fahrtkosten_berechnen_Funktion,
##werden die Fahrtkosten der zweiten Stufe berechnet
fahrtkosten_zweiterStufe = [[errechne_fahrtkosten_zweiterStufe(reihe, spalte) for spalte in koordinaten_standorte_zweiterStufe] for reihe in koordinaten_standorte_zweiterStufe]
#_______________________________________________________________________
##mit der Funktion berechne_Crainic_drei_Indizes aus der Datei optLsg_Funktion
##wird die optimale Lösung eines Two-Echelon Location Routing Problems anhand
##des Modells 3i-2E-LRP mit drei Indizes von Crainic et al.(2011) berechnet
optLsg_dreiIndizes = berechne_Crainic_drei_Indizes(plattform, satellit, standorte_ersterStufe, primaerfahrzeug, standorte_zweiterStufe, sekundaerfahrzeug, kunde, alleStandorte,
anzahlStandorte, fixkosten_plattform, fixkosten_satellit, nutzungskosten_primaerfahrzeug)
Fahrtkosten_berechnen_Funktion:
Code: Alles auswählen
import math
#_______________________________________________________________________
##Funktion zur Berechnung der Fahrtkosten der ersten Stufe aus den euklidischen Distanzen
##multipliziert mit 200, Ausgabe als geschachtelte Liste
def errechne_fahrtkosten_ersterStufe(x, y):
return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*200)
##Funktion zur Berechnung der Fahrtkosten der zweiten Stufe aus den euklidischen Distanzen
##multipliziert mit 100, Ausgabe als geschachtelte Liste
def errechne_fahrtkosten_zweiterStufe(x, y):
return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*100)
Traceback:
gerade festgestellt, dass die variablen die ich über data = readtextfile() denselben Fehler bringen
Code: Alles auswählen
Reloaded modules: Einlesen_Prodhon_Funktion, Fahrtkosten_berechnen_Funktion, optLsg_Funktion
Traceback (most recent call last):
File "<ipython-input-21-5d6bef3c9499>", line 1, in <module>
runfile('C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -/Crainic_3i-2E-LRP.py', wdir='C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -')
File "C:\Users\bine\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 710, in runfile
execfile(filename, namespace)
File "C:\Users\bine\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -/Crainic_3i-2E-LRP.py", line 57, in <module>
anzahlStandorte, fixkosten_plattform, fixkosten_satellit, nutzungskosten_primaerfahrzeug)
File "C:\Users\bine\OneDrive\Masterarbeit\Python\3i-2E-LRP\3_Gurobi_Crainic_3i-2E-LRP -\optLsg_Funktion.py", line 53, in berechne_Crainic_drei_Indizes
quicksum(fahrtkosten_ersterStufe[i][j]*r_ersteStufe.sum(i,j,primaerfahrzeug) for i in standorte_ersterStufe for j in standorte_ersterStufe) +
TypeError: 'int' object is not iterable
Einlesen_Prodhon_Funktion:
Code: Alles auswählen
##Definition zum Einlesen aus einer Text-Datei
def read_textfile(filename):
with open(filename, 'r') as g:
lines = [y.rstrip('\n') for y in g]
#_______________________________________________________________________
##erste Zeile einlesen
#Anzahl an Kunden
anzahl_kunde = int(lines[0])
#aus der Anzahl an Kunden wird eine Liste erstellt
kunde = []
[kunde.append(k) for k in range(anzahl_kunde)]
##zweite Zeile einlesen
#Anzahl an Satelliten
anzahl_satellit = int(lines[1])
#aus der Anzahl an Satelliten wird eine Liste erstellt
satellit = []
[satellit.append(s) for s in range(anzahl_satellit)]
##vierte Zeile auslesen
#ein Tupel mit den Koordinaten der Plattform wird erstellt
koordinaten_plattform = []
tupel = lines[3].split('\t')
koordinaten_plattform.append((int(tupel[0]),int(tupel[1])))
##fünfte Zeile auslesen bis zur ersten Leerzeile
#ein Tupel mit den Koordinaten der Satelliten wird erstellt
#je nach Anzahl der Satelliten werden ab der fünften Zeile entsprechend viele Zeilen eingelesen
koordinaten_satellit = []
for line in range(4, anzahl_satellit+4):
tupel = lines[line].split('\t')
koordinaten_satellit.append((int(tupel[0]),int(tupel[1])))
##Einlesen der Koordinaten der Kundenstandorte
#ein Tupel mit den Koordinaten der Kunden wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
koordinaten_kunde = []
for line in range(anzahl_satellit+5, anzahl_kunde+anzahl_satellit+5):
tupel = lines[line].split('\t')
koordinaten_kunde.append((int(tupel[0]),int(tupel[1])))
##Anzahl an Sekundärfahrzeugen zum Erzeugen einer Liste mit der Kapazität der Sekundärfahrzeuge
#Anzahl an benötigter Fahrzeuge zweiter Stufe höchstens gleich der Anzahl an Kunden
anzahl_sekundaerfahrzeug = anzahl_kunde
##Einlesen der Kapazität der Sekundärfahrzeuge
kapazitaet_sekundaerfahrzeug = []
[kapazitaet_sekundaerfahrzeug.append(int(lines[anzahl_kunde+anzahl_satellit+6])) for k in range(anzahl_sekundaerfahrzeug)]
##Anzahl an Primärfahrzeugen zum Erzeugen einer Liste mit der Kapazität der Primärfahrzeuge
#Anzahl an benötigter Fahrzeuge erster Stufe höchstens gleich der Anzahl an Satelliten
anzahl_primaerfahrzeug = anzahl_satellit
##Einlesen der Kapazität der Primärfahrzeuge
kapazitaet_primaerfahrzeug = []
[kapazitaet_primaerfahrzeug.append(int(lines[anzahl_kunde+anzahl_satellit+7])) for k in range(anzahl_primaerfahrzeug)]
##Einlesen der Kapazitäten der Satelliten
#eine Liste mit den Kapazitäten der Satelliten wird erstellt
#je nach Anzahl der Satelliten werden entsprechend viele Zeilen eingelesen
kapazitaet_satellit = []
for line in range(anzahl_kunde+anzahl_satellit+9,anzahl_satellit+anzahl_kunde+anzahl_satellit+9):
teil = lines[line].split('\n')
kapazitaet_satellit.append(int(teil[0]))
##Einlesen der Nachfragen der Kunden
#eine Liste mit den Nachfragen der Kunden wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
kundennachfrage = []
for line in range(anzahl_satellit+anzahl_kunde+anzahl_satellit+10,anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+10):
teil = lines[line].split('\n')
kundennachfrage.append(int(teil[0]))
##Einlesen der Kosten der Satelliten
#eine Liste mit den Kosten der Satelliten wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
fixkosten_satellit = []
for line in range(anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+11,anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+11):
teil = lines[line].split('\n')
fixkosten_satellit.append(int(teil[0]))
##Einlesen der Kosten der Sekundärfahrzeuge
nutzungskosten_sekundaerfahrzeug = []
[nutzungskosten_sekundaerfahrzeug.append(int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+12])) for n in range(anzahl_sekundaerfahrzeug)]
##Einlesen der Kosten der Primärfahrzeuge
wert_nutzungskosten_primaerfahrzeug = int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+13])
nutzungskosten_primaerfahrzeug = []
[nutzungskosten_primaerfahrzeug.append(int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+13])) for n in range(anzahl_primaerfahrzeug)]
##Einlesen der Kosten der Plattform
fixkosten_plattform = [int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+15])]
#_______________________________________________________________________
##weitere Parameter
#alle Instanzen beinhalten nur eine Plattform
plattform = [0]
anzahl_plattform = 1
#Standorte erster Stufe beinhalten die Plattform und alle Satelliten
standorte_ersterStufe = plattform + satellit
#Koordinaten der Standorte der ersten Stufe
koordinaten_standorte_ersterStufe = koordinaten_plattform + koordinaten_satellit
#Standorte zweiter Stufe beinhalten alle Satelliten und alle Kunden
standorte_zweiterStufe = satellit + kunde
#Koordinaten der Standorte der zweiter Stufe
koordinaten_standorte_zweiterStufe = koordinaten_satellit + koordinaten_kunde
#alle Standorte der drei Ebenen
alleStandorte = plattform + satellit + kunde
#Anzahl aller Standorte der drei Ebenen
anzahlStandorte = len(alleStandorte)
#Kapazität der Plattform
#mindestens Summe über alle Kundennachfragen
kapazitaet_plattform = [sum(kundennachfrage)]
#aus der Anzahl an Sekundärfahrzeugen wird eine Liste erstellt
sekundaerfahrzeug = []
[sekundaerfahrzeug.append(k) for k in range(anzahl_sekundaerfahrzeug)]
#aus der Anzahl an Primärfahrzeugen wird eine Liste erstellt
primaerfahrzeug = []
[primaerfahrzeug.append(k) for k in range(anzahl_primaerfahrzeug)]
#_______________________________________________________________________
##Rückgabe der Eingelesenen Parameter
return (plattform, koordinaten_plattform, kapazitaet_plattform, fixkosten_plattform, anzahl_plattform,
satellit, koordinaten_satellit, kapazitaet_satellit, fixkosten_satellit, anzahl_satellit, kunde,
koordinaten_kunde, kundennachfrage, anzahl_kunde, standorte_ersterStufe, koordinaten_standorte_ersterStufe, standorte_zweiterStufe,
koordinaten_standorte_zweiterStufe, alleStandorte, anzahlStandorte, primaerfahrzeug, kapazitaet_primaerfahrzeug, wert_nutzungskosten_primaerfahrzeug,
anzahl_primaerfahrzeug, sekundaerfahrzeug, kapazitaet_sekundaerfahrzeug, nutzungskosten_sekundaerfahrzeug,
anzahl_sekundaerfahrzeug)
Wie ist denn ›berechne_Crainic_drei_Indizes‹ definiert, bzw. wie kommt denn ›fahrtkosten_ersterStufe‹ da rein, da es nicht in der Parameterliste vorkommt?
Nicht dass ich den sonstigen Code verstehen wollte, vor allem bei einer Funktion die 28 Werte zurückliefert. List-Comprehensions sind dazu da, um Listen zu erzeugen, nicht um eine for-Schleife zu ersetzen, also ein Liste mit lauter None-Werten zu erzeugen, die dann weggeschmissen wird.
sollte eigentlich das sein:
oder das:
oder kurz:
Die Kommentare sind größtenteils überflüssig, weil nur das da steht, was sowieso in der nächsten Zeile steht.
Nicht dass ich den sonstigen Code verstehen wollte, vor allem bei einer Funktion die 28 Werte zurückliefert. List-Comprehensions sind dazu da, um Listen zu erzeugen, nicht um eine for-Schleife zu ersetzen, also ein Liste mit lauter None-Werten zu erzeugen, die dann weggeschmissen wird.
Code: Alles auswählen
kunde = []
[kunde.append(k) for k in range(anzahl_kunde)]
Code: Alles auswählen
kunde = []
for k in range(anzahl_kunde):
kunde.append(k)
Code: Alles auswählen
kunde = [k for k in range(anzahl_kunde)]
Code: Alles auswählen
kunde = list(range(anzahl_kunde))
Ich hatte ein wenig rumprobiert, anfangs hatte ich alle drin. Aber ja, auch wenn ich es hinzufüge bleibt der Fehler der gleiche, es ist unabhängig davon.
so wie dein 1. Code hatte ich es anfangs, aber auf Anraten eines Mitarbeiter des Lehrstuhls habe ich die for-Schleife hinten angestellt.
Die Variante mit list ist aber wohl besser, das werde ich ändern, danke =)
Die Kommentare sind für meine Betreuerin der Masterarbeit. Wir müssen alles auf die Weise kommentieren.
so wie dein 1. Code hatte ich es anfangs, aber auf Anraten eines Mitarbeiter des Lehrstuhls habe ich die for-Schleife hinten angestellt.
Die Variante mit list ist aber wohl besser, das werde ich ändern, danke =)
Die Kommentare sind für meine Betreuerin der Masterarbeit. Wir müssen alles auf die Weise kommentieren.