Feel free to try keying in your stop points in latitude and longtitude into my awesome application on the internet! Rather than talking about it. Let me show it! :)
http://nearmyroute.appspot.com/
This blog covers new pull supply chain responsiveness and logistics concepts for hubs with good air and sea-freight connectivity like Singapore. Big data and web analytics are creating new demand opportunities, and help operations meet growing global regulatory standards. Very often, my work also involves helping online retailers improve operations. Discussions spans from raw materials serialization, to manufacturing, marketing and sales. Visualization and analysis techniques are also shared.
Friday, October 14, 2011
Monday, October 10, 2011
Google Maps API for Small Businesses
The ability to search for nearby businesses using Google Maps APIs are very interesting. Using Google Places webservices API (one of Google Maps API), you can:
1. search for additional delivery and backhaul opportunities along your delivery routes
2. explore partnership opportunities in delivery and backhaul to share resources and reduce carbon footprint
3. Know who your competitors or complementary businesses are in a particular location
4. Location new store near a certain profile of stores
Explore Google Maps API more at http://code.google.com/apis/maps/documentation/webservices/
Below are the codes I use. What do you think? elegance in simplicity? :)
import socket # for connecting to googlemaps api
import urllib #retrieve web pages
# initialize namelist as adict()
nameslist=dict()
#for each line in the file, pick put the latitudes and longtitudes, print it
fhandopenstorefile=open('storelocationslatlongall.csv')
for line in fhandopenstorefile:
line=line.rstrip()
print line
#put latitudes and longtitudes in the http
http='https://maps.googleapis.com/maps/api/place/search/xml?location='+line+'&radius=805&sensor=false&key=AIzaSyAJzHX3bW7PiB8T5xRlmp1LpBvFtXgChkc'
print http
#sent it to google and get the xml file
fhandopenhttp=urllib.urlopen(http)
for line in fhandopenhttp:
print line.strip()
fout=open('output.txt','w')
fout.write(str(nameslist))
fout.close()
1. search for additional delivery and backhaul opportunities along your delivery routes
2. explore partnership opportunities in delivery and backhaul to share resources and reduce carbon footprint
3. Know who your competitors or complementary businesses are in a particular location
4. Location new store near a certain profile of stores
Explore Google Maps API more at http://code.google.com/apis/maps/documentation/webservices/
Below are the codes I use. What do you think? elegance in simplicity? :)
import socket # for connecting to googlemaps api
import urllib #retrieve web pages
# initialize namelist as adict()
nameslist=dict()
#for each line in the file, pick put the latitudes and longtitudes, print it
fhandopenstorefile=open('storelocationslatlongall.csv')
for line in fhandopenstorefile:
line=line.rstrip()
print line
#put latitudes and longtitudes in the http
http='https://maps.googleapis.com/maps/api/place/search/xml?location='+line+'&radius=805&sensor=false&key=AIzaSyAJzHX3bW7PiB8T5xRlmp1LpBvFtXgChkc'
print http
#sent it to google and get the xml file
fhandopenhttp=urllib.urlopen(http)
for line in fhandopenhttp:
print line.strip()
fout=open('output.txt','w')
fout.write(str(nameslist))
fout.close()
Tuesday, October 4, 2011
Supply Chain Analytics For Small Businesses
When we have information on the probablity over several factors that may affect a decision, we can use simulation, or probability (decision) trees to find the option with the highest expected profit.
Probability can be used together with variability in information obtained (e.g. forecasts, demand, etc...) to build analytical models? like how many bus seats or hotel rooms can be overbooked to maximize my profit?
In fact, with so much data over the internet, we can now build our own analytical model right? one easy way to start is with google analytics for small businesses
http://www.google.com/analytics/product.html
Read also interesting article at WSJ on the dearth of expertise in analytics, and its opportunities:
http://online.wsj.com/article/SB10001424052970203405504576602853746798820.html
Probability can be used together with variability in information obtained (e.g. forecasts, demand, etc...) to build analytical models? like how many bus seats or hotel rooms can be overbooked to maximize my profit?
http://www.google.com/analytics/product.html
Read also interesting article at WSJ on the dearth of expertise in analytics, and its opportunities:
http://online.wsj.com/article/SB10001424052970203405504576602853746798820.html
Be Careful Of Implementing An ERP System
There are many companies who are persuaded by glittering SAP or Oracle advertisements championing their Enterprise Resource Planning (ERP) software. Let me share what I know and some links before our small businesses jumps onto the ERP bandwagon. Even when a company had implemented ERP, can they make better use of the data they have?
Advantages of ERP:
1. Integration of information (Finance, Manufacturing, Inventory, Sales)
2. Visibility of information
3. New functionalities
4. Standardization of data and processes
Disadvantages of ERP:
1. Loss of flexibility and creativity on the ground due to standardized processes
2. Decreases flexibility to react to market
3. Customization is expensive in subsequent upgrades
Success Factors of ERP implementation if:
1. Customer demand is stable
2. Product is standardized
3. Product is of a modular design
4. There are Frequent shipments to customers
Poor Chance of Success with ERP implementation when:
1. Aggregate demand is unstable (>10% pulses in demand)
2. You have long unavoidable leadtimes from suppliers
Further reading:
1. http://www.tech-faq.com/erp.html
2. http://www.cio.com/article/40323/ERP_Definition_and_Solutions
Advantages of ERP:
1. Integration of information (Finance, Manufacturing, Inventory, Sales)
2. Visibility of information
3. New functionalities
4. Standardization of data and processes
Disadvantages of ERP:
1. Loss of flexibility and creativity on the ground due to standardized processes
2. Decreases flexibility to react to market
3. Customization is expensive in subsequent upgrades
Success Factors of ERP implementation if:
1. Customer demand is stable
2. Product is standardized
3. Product is of a modular design
4. There are Frequent shipments to customers
Poor Chance of Success with ERP implementation when:
1. Aggregate demand is unstable (>10% pulses in demand)
2. You have long unavoidable leadtimes from suppliers
Further reading:
1. http://www.tech-faq.com/erp.html
2. http://www.cio.com/article/40323/ERP_Definition_and_Solutions
Principles of Responsive Supply Chains for Small Businesses
We have heard of small business are fast and agile. Nowadays, it is not big companies squashing small ones, but the fast leaving the big and slow companies behind.
So what makes a fast, responsive small business. The answer is to have a responsive supply chain. Principles of responsive supply chains are:
1. Lower production lead times (through pre-positioning raw material, or have some one create it in subassemblies, or reserving capacity)
2. Lower transportation lead times (air rather than sea/land/rail)
3. Parallel manufacturing
4. Small lot production
5. Frequent deliveries
6. Close coordination (design, manufacturing, commercial team sitting together)
7. Good Forecasting (http://fastsupplychain.blogspot.com/2011/09/method-to-quantify-higher-profits-from.html)
So what makes a fast, responsive small business. The answer is to have a responsive supply chain. Principles of responsive supply chains are:
1. Lower production lead times (through pre-positioning raw material, or have some one create it in subassemblies, or reserving capacity)
2. Lower transportation lead times (air rather than sea/land/rail)
3. Parallel manufacturing
4. Small lot production
5. Frequent deliveries
6. Close coordination (design, manufacturing, commercial team sitting together)
7. Good Forecasting (http://fastsupplychain.blogspot.com/2011/09/method-to-quantify-higher-profits-from.html)
Monday, October 3, 2011
Google App Engine For Small Business Supply Chains
We all know technology is terrific enabler for small business supply chains. We can now use google maps to track and trace your salesperson and transportation fleet; share transaction information through googledocs, talk for free on GoogleTalk. Receive related advertisement when you use Gmail, etc...
How about creating your own transportation routing system, customized to your operational needs using Google App Engine?
graph = []
while(True):
x = raw_input("name of node : ")
if x=='ok':
break
x=node(x)
graph.append(x)
edges=[]
##edges.append((prelimedges[0],prelimedges[1]))
##
##print edges
##print len(prelimedges)
# create bidirectional edges of the graph
##edges = []
##edges.append((a, b, 14))
##edges.append((a, c, 9))
###edges.append((a, d, 7))
##edges.append((b, c, 2))
#edges.append((b, f, 9))
#edges.append((c, d, 10))
#edges.append((c, e, 11))
#edges.append((d, e, 15))
#edges.append((f, e, 6))
#edges.append((e,g,10))
When you run the code, it will prompt you to enter the name of nodes, press enter and keep on entering name of nodes. When done, you type in “ok”, then the nodes will pair up, you need to key in the distances here. once the distances are keyed, it will dine the shortest distance.
Isn't it an elegan solution? :)
import sys
print 'Content-Type: text/html'
print ''
print 'Content-Type: text/html'
print ''
print '<pre>'
class node:
label = ''
# adjacency list of the node
neighbors = [] # list of nodes
distances = [] # distances to neighbors
# for Dijkstra
prevNode = None
totalDistance = 0
# constructor
def __init__(self, label):
self.label = label
self.neighbors = []
self.distances = []
self.prevNode = None
self.totalDistance = 0
label = ''
# adjacency list of the node
neighbors = [] # list of nodes
distances = [] # distances to neighbors
# for Dijkstra
prevNode = None
totalDistance = 0
# constructor
def __init__(self, label):
self.label = label
self.neighbors = []
self.distances = []
self.prevNode = None
self.totalDistance = 0
# find the shortest paths to all nodes recursively
def dijkstra(node):
# visit all neighbors and update them if necessary
while len(node.neighbors) > 0:
n = node.neighbors.pop(0)
d = node.distances.pop(0)
if n.prevNode == None or n.totalDistance > d + node.totalDistance:
n.prevNode = node
n.totalDistance = d + node.totalDistance
dijkstra(n)
def dijkstra(node):
# visit all neighbors and update them if necessary
while len(node.neighbors) > 0:
n = node.neighbors.pop(0)
d = node.distances.pop(0)
if n.prevNode == None or n.totalDistance > d + node.totalDistance:
n.prevNode = node
n.totalDistance = d + node.totalDistance
dijkstra(n)
# get the shortest path to the given node
def route(endNode):
node = endNode
labels = [endNode.label]
# distances = []
while node.label != node.prevNode.label:
# distances.append(node.totalDistance - node.prevNode.totalDistance)
node = node.prevNode
labels.append(node.label)
labels.reverse()
return labels
# distances.reverse()
# return (labels, distances)
# create a graph - need user input on places it needs to go to
#1st step to add in node name and coordinates first, then display node name and coordinates when i type ok. then calculate the distances relative to each other, then pair and add in distances.
##a = node('a')
##b = node('b')
##c = node('c')
##d = node('d')
##e = node('e')
##f = node('f')
def route(endNode):
node = endNode
labels = [endNode.label]
# distances = []
while node.label != node.prevNode.label:
# distances.append(node.totalDistance - node.prevNode.totalDistance)
node = node.prevNode
labels.append(node.label)
labels.reverse()
return labels
# distances.reverse()
# return (labels, distances)
# create a graph - need user input on places it needs to go to
#1st step to add in node name and coordinates first, then display node name and coordinates when i type ok. then calculate the distances relative to each other, then pair and add in distances.
##a = node('a')
##b = node('b')
##c = node('c')
##d = node('d')
##e = node('e')
##f = node('f')
graph = []
while(True):
x = raw_input("name of node : ")
if x=='ok':
break
x=node(x)
graph.append(x)
print "graphs are", graph
prelimedges=[]
for n in graph:
print n.label
prelimedges.append((n))
for n in graph:
print n.label
prelimedges.append((n))
print "prelimedges are ", prelimedges
print "first node is ",prelimedges[len(prelimedges)-1]
print "last node is ",prelimedges[0]
print "last node is ",prelimedges[0]
edges=[]
##edges.append((prelimedges[0],prelimedges[1]))
##
##print edges
##print len(prelimedges)
start=0
while start<len(prelimedges):
print start
count=0
while count< len(prelimedges):
print "count is",count
print "start is",start
while start<len(prelimedges):
print start
count=0
while count< len(prelimedges):
print "count is",count
print "start is",start
if start==count:
count=count+1
print "count now becomes", count
if count==len(prelimedges):
break
distance=raw_input("distance between them: ")
intdistance=int(distance)
edges.append(((prelimedges[start]),(prelimedges[count]),intdistance))
count=count+1
print "after appending to edges, count is", count
print edges
start=start+1
print "at the end, the edges are", edges
count=count+1
print "count now becomes", count
if count==len(prelimedges):
break
distance=raw_input("distance between them: ")
intdistance=int(distance)
edges.append(((prelimedges[start]),(prelimedges[count]),intdistance))
count=count+1
print "after appending to edges, count is", count
print edges
start=start+1
print "at the end, the edges are", edges
# create bidirectional edges of the graph
##edges = []
##edges.append((a, b, 14))
##edges.append((a, c, 9))
###edges.append((a, d, 7))
##edges.append((b, c, 2))
#edges.append((b, f, 9))
#edges.append((c, d, 10))
#edges.append((c, e, 11))
#edges.append((d, e, 15))
#edges.append((f, e, 6))
#edges.append((e,g,10))
#print edges
# create adjaceny list of neighbors for each node
for edge in edges:
edge[0].neighbors.append(edge[1])
edge[0].distances.append(edge[2])
edge[1].neighbors.append(edge[0])
edge[1].distances.append(edge[2])
for edge in edges:
edge[0].neighbors.append(edge[1])
edge[0].distances.append(edge[2])
edge[1].neighbors.append(edge[0])
edge[1].distances.append(edge[2])
# print the graph
print 'The graph:'
print
for n in graph:
print 'Node: ', n.label
print 'Neighbors:'
for i in range(len(n.neighbors)):
print n.neighbors[i].label, n.distances[i]
print
print 'The graph:'
for n in graph:
print 'Node: ', n.label
print 'Neighbors:'
for i in range(len(n.neighbors)):
print n.neighbors[i].label, n.distances[i]
# find the shortest paths to all neighbors starting w/ the given node
#startNode = a
startNode = graph[0]
#startNode = a
startNode = graph[0]
print 'Route start node:', startNode.label
startNode.prevNode = startNode
dijkstra(startNode)
startNode.prevNode = startNode
dijkstra(startNode)
##print
##print 'The graph after Dijkstra:'
##print
##for n in graph:
## print 'Node:', n.label
## print 'totalDistance:', n.totalDistance
## print 'prevNode:', n.prevNode.label
## print
##print 'The graph after Dijkstra:'
##for n in graph:
## print 'Node:', n.label
## print 'totalDistance:', n.totalDistance
## print 'prevNode:', n.prevNode.label
# print the shortest path to the given node
#endNode = c
endNode = graph[len(graph)-1]
#endNode = c
endNode = graph[len(graph)-1]
print 'Route end node:', endNode.label
print 'Route:', route(endNode)
print 'Total distance:', endNode.totalDistance
print 'Route:', route(endNode)
print 'Total distance:', endNode.totalDistance
Sunday, October 2, 2011
Leveraging Global Resources for Personalization
Push-pull boundary in supply chains is very interesting, especially for small logistics companies further in the supply chain. customization and personalization nearer to the customer requirement reduces overall inventory costs. Professor MS Krishnan at Ross School of Business calls it the personalization from leveraging global resources. Our ubiquitious IPhone allows us to personalize use from apps,and almost everyone to develop their own apps. Build-a-Bear, Google Apps, Facebook, etc.. all allow people all over the world to contribute and users to customize.
So our down-stream logistics companies are doing more value added services like kitting, labeling, testing, quality control, repairs, they are essentially run manufacturing operations right? Can they value add in the increasing world of track and trace requirements, or even create new businesses from it?
So our down-stream logistics companies are doing more value added services like kitting, labeling, testing, quality control, repairs, they are essentially run manufacturing operations right? Can they value add in the increasing world of track and trace requirements, or even create new businesses from it?
Economic Order Quantity and Minimum Order Quantity
We all know about economic order quantity (EOQ), which is a balance of fixed order cost and the cost of holding inventory.One however, may not be able to order exactly the economic order quantity all the time. We know that small changes to EOQ does not affect fixed and holding cost significantly, but holding cost depends on cost of product. Changing the minimum order quantity, or sometimes called order multiples (or other names) can reduce supply chain costs. My team came in 3rd! hurray! :)
http://www.themsj.com/around-ross/spotlight-on-the-tauber-institute-1.2596618
What is even more interesting it, should EOQ be calculated along the supply chain? Can we relate costs, lead time and the push-pull boundary for companies to differentiate themselves?
What is even more interesting it, should EOQ be calculated along the supply chain? Can we relate costs, lead time and the push-pull boundary for companies to differentiate themselves?
Subscribe to:
Comments (Atom)







