@Thomas: Vielen vielen Dank, das klappt. Nun habe ich auch verstanden das das oben ja schon genau dasselbe war und ich nur die letzte for-Schleife hätte ersetzen müssen. Sorry =)
Wie gesagt, python ist meine erste Programmiersprache und es ist am Anfang recht viel was da alles Neues auf einen zukommt. Aber ich habe aus dieser Frage sehr viel gelernt, vielen Dank an alle =) =)
Array aufteilen
jetzt hab ich leider doch nochmal ein Problem =(
das Ausgeben hat super geklappt, und nun habe ich die Funktion in den restlichen Code eingebaut. Es kommt nun jedoch die Fehlermeldung "int" is not iterable. Das heißt ja python sieht die fahrtkostenmatrix als ein int-Wert und nicht als Liste oder? und wie kann ich sie iterabel machen?
Bisher habe ich bei Listen immer mit .append gearbeitet, da habe ich jedoch aus einer .txt eingelesen und die Werte nicht erst in Python berechnet
das Ausgeben hat super geklappt, und nun habe ich die Funktion in den restlichen Code eingebaut. Es kommt nun jedoch die Fehlermeldung "int" is not iterable. Das heißt ja python sieht die fahrtkostenmatrix als ein int-Wert und nicht als Liste oder? und wie kann ich sie iterabel machen?
Bisher habe ich bei Listen immer mit .append gearbeitet, da habe ich jedoch aus einer .txt eingelesen und die Werte nicht erst in Python berechnet
Nabend Bine,
int ist ja auch nicht iterable, die fahrtkostenmatrix die im letzten Code erzeugt wurde aber doch.
Also muss bei deinem "Einbau" was nicht richtig sein.
Zeig uns den Code, nur dann haben wir was mit dem wir arbeiten und helfen können.
int ist ja auch nicht iterable, die fahrtkostenmatrix die im letzten Code erzeugt wurde aber doch.
Also muss bei deinem "Einbau" was nicht richtig sein.
Zeig uns den Code, nur dann haben wir was mit dem wir arbeiten und helfen können.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
@Sirius: nein habe ich nicht.
Das scheint damit zu tun zu haben ob ich die Funktion in eine andere Datei schreibe und und sie dann in meiner main-Datei aufrufe oder ob ich alles in einer Datei habe.
So ist alles in einer Datei und es funktioniert:
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)
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
So ist es in zwei Dateien. Das Übertragen klappt, also ich kann zb. fahrtkosten_ersterStufe printen, aber eben nicht damit weiterrechnen (mit Gurobi)
MAIN-DATEI:
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
DATEI MIT FUNKTION:
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)
Das scheint damit zu tun zu haben ob ich die Funktion in eine andere Datei schreibe und und sie dann in meiner main-Datei aufrufe oder ob ich alles in einer Datei habe.
So ist alles in einer Datei und es funktioniert:
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)
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
So ist es in zwei Dateien. Das Übertragen klappt, also ich kann zb. fahrtkosten_ersterStufe printen, aber eben nicht damit weiterrechnen (mit Gurobi)
MAIN-DATEI:
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
DATEI MIT FUNKTION:
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)
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.