Bellman-ford algorithm with capacity constraint - Python





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I am implementing a Bellman-ford shortest path algorithm. Based on the source and destination node, it outputs the shortest distance, and the path through a network.



Now, I need to add a capacity component to the algorithm. So if the demand is 2 but the capacity is 1, that path is no longer usable.



My initial idea was to add a dictionary for the capacity and a variable for the demand. Then if the demand exceeded the capacity of a node, the lenght of the path would be arbritrarily large. I was thinking something like:



           if capacity[neighbour] < demand:
distance[neighbour], predecessor[neighbour] = 999


This gives me the following error message:



TypeError: '<' not supported between instances of 'dict' and 'int'


Is there a workaround for this issue, or could I potentially add the demand-constraint in a smarter way?



Full code:



source = 'e'
destination = 'd'
demand = 2

def bellman_ford(graph, source, capacity):
# Step 1: Prepare the distance and predecessor for each node
distance, predecessor = dict(), dict()

for node in capacity:
for node in graph:
distance[node], predecessor[node] = float('inf'), None
distance[source] = 0

# Step 2: Relax the edges
for _ in range(len(graph) - 1):
for node in graph:
for neighbour in graph[node]:
# If the distance between the node and the neighbour is lower than the current, store it
if distance[neighbour] > distance[node] + graph[node][neighbour]:
distance[neighbour], predecessor[neighbour] = distance[node] + graph[node][neighbour], node
if capacity[node] < demand:
distance[neighbour], predecessor[neighbour] = 100


# Step 3: Check for negative weight cycles
for node in graph:
for neighbour in graph[node]:
assert distance[neighbour] <= distance[node] + graph[node][neighbour], "Negative weight cycle."

return distance, predecessor

#Initial graph

graph = {
'a': {'b': 1, 'd': 1},
'b': {'c': 1, 'd': 2},
'c': {},
'd': {'b': 1, 'c': 8, 'e': 1},
'e': {'a': 2, 'd': 7}
}


capacity = {
'a': {'b': 4, 'd': 1},
'b': {'c': 5, 'd': 4},
'c': {},
'd': {'b': 1, 'c': 3, 'e': 3},
'e': {'a': 5, 'd': 3}
}


distance, predecessor = bellman_ford(graph, source, capacity)

print("The cost of shipping from from", source, "to", destination, "is", distance[destination])

for i in graph:
print("node",i,"is reached through node", predecessor[i])









share|improve this question




















  • 1





    There is no if capacity[neighbour] < demand: in full code

    – Corentin Limier
    Nov 16 '18 at 14:25








  • 1





    + it may be if capacity[node][neighbour] < demand

    – Corentin Limier
    Nov 16 '18 at 14:25











  • Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

    – Daugaard
    Nov 16 '18 at 14:48











  • You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

    – Corentin Limier
    Nov 16 '18 at 14:55











  • It still gives me the dict vs. int error

    – Daugaard
    Nov 16 '18 at 15:05


















0















I am implementing a Bellman-ford shortest path algorithm. Based on the source and destination node, it outputs the shortest distance, and the path through a network.



Now, I need to add a capacity component to the algorithm. So if the demand is 2 but the capacity is 1, that path is no longer usable.



My initial idea was to add a dictionary for the capacity and a variable for the demand. Then if the demand exceeded the capacity of a node, the lenght of the path would be arbritrarily large. I was thinking something like:



           if capacity[neighbour] < demand:
distance[neighbour], predecessor[neighbour] = 999


This gives me the following error message:



TypeError: '<' not supported between instances of 'dict' and 'int'


Is there a workaround for this issue, or could I potentially add the demand-constraint in a smarter way?



Full code:



source = 'e'
destination = 'd'
demand = 2

def bellman_ford(graph, source, capacity):
# Step 1: Prepare the distance and predecessor for each node
distance, predecessor = dict(), dict()

for node in capacity:
for node in graph:
distance[node], predecessor[node] = float('inf'), None
distance[source] = 0

# Step 2: Relax the edges
for _ in range(len(graph) - 1):
for node in graph:
for neighbour in graph[node]:
# If the distance between the node and the neighbour is lower than the current, store it
if distance[neighbour] > distance[node] + graph[node][neighbour]:
distance[neighbour], predecessor[neighbour] = distance[node] + graph[node][neighbour], node
if capacity[node] < demand:
distance[neighbour], predecessor[neighbour] = 100


# Step 3: Check for negative weight cycles
for node in graph:
for neighbour in graph[node]:
assert distance[neighbour] <= distance[node] + graph[node][neighbour], "Negative weight cycle."

return distance, predecessor

#Initial graph

graph = {
'a': {'b': 1, 'd': 1},
'b': {'c': 1, 'd': 2},
'c': {},
'd': {'b': 1, 'c': 8, 'e': 1},
'e': {'a': 2, 'd': 7}
}


capacity = {
'a': {'b': 4, 'd': 1},
'b': {'c': 5, 'd': 4},
'c': {},
'd': {'b': 1, 'c': 3, 'e': 3},
'e': {'a': 5, 'd': 3}
}


distance, predecessor = bellman_ford(graph, source, capacity)

print("The cost of shipping from from", source, "to", destination, "is", distance[destination])

for i in graph:
print("node",i,"is reached through node", predecessor[i])









share|improve this question




















  • 1





    There is no if capacity[neighbour] < demand: in full code

    – Corentin Limier
    Nov 16 '18 at 14:25








  • 1





    + it may be if capacity[node][neighbour] < demand

    – Corentin Limier
    Nov 16 '18 at 14:25











  • Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

    – Daugaard
    Nov 16 '18 at 14:48











  • You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

    – Corentin Limier
    Nov 16 '18 at 14:55











  • It still gives me the dict vs. int error

    – Daugaard
    Nov 16 '18 at 15:05














0












0








0








I am implementing a Bellman-ford shortest path algorithm. Based on the source and destination node, it outputs the shortest distance, and the path through a network.



Now, I need to add a capacity component to the algorithm. So if the demand is 2 but the capacity is 1, that path is no longer usable.



My initial idea was to add a dictionary for the capacity and a variable for the demand. Then if the demand exceeded the capacity of a node, the lenght of the path would be arbritrarily large. I was thinking something like:



           if capacity[neighbour] < demand:
distance[neighbour], predecessor[neighbour] = 999


This gives me the following error message:



TypeError: '<' not supported between instances of 'dict' and 'int'


Is there a workaround for this issue, or could I potentially add the demand-constraint in a smarter way?



Full code:



source = 'e'
destination = 'd'
demand = 2

def bellman_ford(graph, source, capacity):
# Step 1: Prepare the distance and predecessor for each node
distance, predecessor = dict(), dict()

for node in capacity:
for node in graph:
distance[node], predecessor[node] = float('inf'), None
distance[source] = 0

# Step 2: Relax the edges
for _ in range(len(graph) - 1):
for node in graph:
for neighbour in graph[node]:
# If the distance between the node and the neighbour is lower than the current, store it
if distance[neighbour] > distance[node] + graph[node][neighbour]:
distance[neighbour], predecessor[neighbour] = distance[node] + graph[node][neighbour], node
if capacity[node] < demand:
distance[neighbour], predecessor[neighbour] = 100


# Step 3: Check for negative weight cycles
for node in graph:
for neighbour in graph[node]:
assert distance[neighbour] <= distance[node] + graph[node][neighbour], "Negative weight cycle."

return distance, predecessor

#Initial graph

graph = {
'a': {'b': 1, 'd': 1},
'b': {'c': 1, 'd': 2},
'c': {},
'd': {'b': 1, 'c': 8, 'e': 1},
'e': {'a': 2, 'd': 7}
}


capacity = {
'a': {'b': 4, 'd': 1},
'b': {'c': 5, 'd': 4},
'c': {},
'd': {'b': 1, 'c': 3, 'e': 3},
'e': {'a': 5, 'd': 3}
}


distance, predecessor = bellman_ford(graph, source, capacity)

print("The cost of shipping from from", source, "to", destination, "is", distance[destination])

for i in graph:
print("node",i,"is reached through node", predecessor[i])









share|improve this question
















I am implementing a Bellman-ford shortest path algorithm. Based on the source and destination node, it outputs the shortest distance, and the path through a network.



Now, I need to add a capacity component to the algorithm. So if the demand is 2 but the capacity is 1, that path is no longer usable.



My initial idea was to add a dictionary for the capacity and a variable for the demand. Then if the demand exceeded the capacity of a node, the lenght of the path would be arbritrarily large. I was thinking something like:



           if capacity[neighbour] < demand:
distance[neighbour], predecessor[neighbour] = 999


This gives me the following error message:



TypeError: '<' not supported between instances of 'dict' and 'int'


Is there a workaround for this issue, or could I potentially add the demand-constraint in a smarter way?



Full code:



source = 'e'
destination = 'd'
demand = 2

def bellman_ford(graph, source, capacity):
# Step 1: Prepare the distance and predecessor for each node
distance, predecessor = dict(), dict()

for node in capacity:
for node in graph:
distance[node], predecessor[node] = float('inf'), None
distance[source] = 0

# Step 2: Relax the edges
for _ in range(len(graph) - 1):
for node in graph:
for neighbour in graph[node]:
# If the distance between the node and the neighbour is lower than the current, store it
if distance[neighbour] > distance[node] + graph[node][neighbour]:
distance[neighbour], predecessor[neighbour] = distance[node] + graph[node][neighbour], node
if capacity[node] < demand:
distance[neighbour], predecessor[neighbour] = 100


# Step 3: Check for negative weight cycles
for node in graph:
for neighbour in graph[node]:
assert distance[neighbour] <= distance[node] + graph[node][neighbour], "Negative weight cycle."

return distance, predecessor

#Initial graph

graph = {
'a': {'b': 1, 'd': 1},
'b': {'c': 1, 'd': 2},
'c': {},
'd': {'b': 1, 'c': 8, 'e': 1},
'e': {'a': 2, 'd': 7}
}


capacity = {
'a': {'b': 4, 'd': 1},
'b': {'c': 5, 'd': 4},
'c': {},
'd': {'b': 1, 'c': 3, 'e': 3},
'e': {'a': 5, 'd': 3}
}


distance, predecessor = bellman_ford(graph, source, capacity)

print("The cost of shipping from from", source, "to", destination, "is", distance[destination])

for i in graph:
print("node",i,"is reached through node", predecessor[i])






python






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 16 '18 at 14:49







Daugaard

















asked Nov 16 '18 at 14:18









DaugaardDaugaard

32




32








  • 1





    There is no if capacity[neighbour] < demand: in full code

    – Corentin Limier
    Nov 16 '18 at 14:25








  • 1





    + it may be if capacity[node][neighbour] < demand

    – Corentin Limier
    Nov 16 '18 at 14:25











  • Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

    – Daugaard
    Nov 16 '18 at 14:48











  • You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

    – Corentin Limier
    Nov 16 '18 at 14:55











  • It still gives me the dict vs. int error

    – Daugaard
    Nov 16 '18 at 15:05














  • 1





    There is no if capacity[neighbour] < demand: in full code

    – Corentin Limier
    Nov 16 '18 at 14:25








  • 1





    + it may be if capacity[node][neighbour] < demand

    – Corentin Limier
    Nov 16 '18 at 14:25











  • Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

    – Daugaard
    Nov 16 '18 at 14:48











  • You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

    – Corentin Limier
    Nov 16 '18 at 14:55











  • It still gives me the dict vs. int error

    – Daugaard
    Nov 16 '18 at 15:05








1




1





There is no if capacity[neighbour] < demand: in full code

– Corentin Limier
Nov 16 '18 at 14:25







There is no if capacity[neighbour] < demand: in full code

– Corentin Limier
Nov 16 '18 at 14:25






1




1





+ it may be if capacity[node][neighbour] < demand

– Corentin Limier
Nov 16 '18 at 14:25





+ it may be if capacity[node][neighbour] < demand

– Corentin Limier
Nov 16 '18 at 14:25













Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

– Daugaard
Nov 16 '18 at 14:48





Ill update the original question with the non-functioning part of the code I get the same error with [node][neighbour]

– Daugaard
Nov 16 '18 at 14:48













You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

– Corentin Limier
Nov 16 '18 at 14:55





You cannot have the same error with capacity[node][neighbour], but you may have a KeyError

– Corentin Limier
Nov 16 '18 at 14:55













It still gives me the dict vs. int error

– Daugaard
Nov 16 '18 at 15:05





It still gives me the dict vs. int error

– Daugaard
Nov 16 '18 at 15:05












0






active

oldest

votes












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53339621%2fbellman-ford-algorithm-with-capacity-constraint-python%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53339621%2fbellman-ford-algorithm-with-capacity-constraint-python%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Florida Star v. B. J. F.

Danny Elfman

Lugert, Oklahoma