Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

The year is 1 4 2 3 and the storm is gathering around Lombaria! The ambitious Filippo Maria Visconti, Duke of Milan, have attacked you

The year is 1423 and the storm is gathering around Lombaria! The ambitious Filippo Maria Visconti, Duke of Milan, have attacked you the fellow Venetians! You and your mercenary friends Tuna, Kaan, Ali, Kutup, O zgu n and Muhittin are stuck in Lombardy, Italy. You need to somehow save the people of Lombardy from the cruel Duke. You are currently located in Pavia, and you can rescue people to come with you along your journey in Lombardy. Due to the logistic reasons, each of you have the a capacity to rescue 82 people during your route. Since the Duke is fast and furious, you only have time to visit 7 cities in total.
But you are lucky, all of you are Medieval IE/OR specialists! So, your job is to gather as many people as possible in order to collaborate and survive against the Milanese. In other words, you need to come up with a route that maximizes the number of people rescued along your route.
Rules
From a city, you can only go to a neighboring city. You need to start from Pavia.
The route is finished once you visit the 7th city.
The region of Lombardy has 12 cities in total that can be seen in Figure 1.
We also have some additional conditions. Ali knows someone named Sena in Milan, who must be rescued since she is the only medical scientist left in Lombardy. Moreover, Kutup knows a new companion of his, Bora, with a capacity to rescue 78 more people, who is living right next to the Lake Como. O zgu n knows a person in Bergamo, Yi git, who is among the population of Bergamo. O zgu n informs you that if Yi git is to come across with his 36 friends in Cremona, Yi git is going to persuade them to leave your party and they will rush to the aid of the Venetians in the battlefield against the Milanese, so they will NOT be rescued in the end.
Solve this problem using Mixed Integer Linear Programming and report your solution The region of Lombardy has 12 cities in total that can be seen in Figure 1.
Figure 1: Map of the region of Lombardy, Italy
Each city has a number of people residing in it as follows:after implementing it in gurobipy. Clearly indicate the visited cities in your reports.
For this question, I have the following code:
import gurobipy as gp
from gurobipy import GRB
# Cities and their populations
cities =["Pavia", "Milan", "Varese", "Como", "Monza", "Lodi", "Cremona",
"Bergamo", "Lecco", "Sondrio", "Brescia", "Mantua"]
p =[86,326,89,60,86,23,36,111,34,18,127,41]
K =[
[0,1,0,0,0,1,0,0,0,0,0,0],
[1,0,1,0,1,0,0,0,0,0,0,0],
[0,1,0,1,1,0,0,0,0,0,0,0],
[0,0,1,0,1,0,0,0,0,1,0,0],
[0,1,1,1,0,0,0,1,1,1,0,0],
[1,0,0,0,0,0,1,0,0,1,0,0],
[0,0,0,0,1,1,0,0,0,0,1,1],
[0,0,0,0,1,0,1,0,1,0,1,0],
[0,0,0,1,1,0,0,1,0,1,0,0],
[0,0,0,1,0,0,0,0,1,0,1,0],
[0,0,0,0,0,0,1,1,0,1,0,1],
[0,0,0,0,0,0,1,0,0,0,1,0]
]
# Initialize model
m = gp.Model("Q3")
# Decision variables
x = m.addVars(len(cities), len(cities), vtype=GRB.BINARY, name="x_ij")
y = m.addVars(len(cities), vtype=GRB.BINARY, name="y_i")
c = m.addVars(range(1,8), vtype=GRB.INTEGER, name="c_i")
z = m.addVar(vtype=GRB.BINARY, name="z")
m.update()
#print("before objectve x:",x)
# Objective: maximize total rescued people
m.setObjective(gp.quicksum(c[i] for i in range(1,8))+78*z , GRB.MAXIMIZE)
#print("model before constraint: ", m)
# Adjust the constraint loop to ensure that each city is visited at most once
for j in range(len(cities)):
m.addConstr(gp.quicksum(K[i][j]* x[i, j] for i in range(len(cities)))=1)
# # # Constraints
m.addConstr(gp.quicksum(x[i, j] for i in range(len(cities)) for j in range(len(cities)))=6)
for i in range (len(cities)):
for j in range (len(cities)):
m.addConstr(K[i][j]>= x[i,j])
for i in range (len(cities)):
for j in range (len(cities)):
m.addConstr(x[i,j]+x[j,i]=1)
for j in range(1,8):
m.addConstr(c[j]=82)
m.addConstr(y[0]>=1)
m.addConstr(y[1]>=1)
m.addConstr(y[7]+y[6]=1)
m.addConstr(y[3]==z)
m.addConstr(gp.quicksum(y[i] for i in range(len(cities)))=7)
for i in range (len(cities)):
for j in range (len(cities)):
if i!=j:
m.addConstr(y[j]+y[i]>=2* x[i,j])
# print("model before binary: ", m)
m.addConstr(gp.quicksum(y[i]* p[i] for i in range(len(cities)))>= gp.quicksum(c[k] for k in range(1,8)))
#print("model: ", m)
m.optimize()
m.printAttr('x')
# print(x)
# print(y)
if m.status == GRB.OPTIMAL:
print("Visited cities:")
for i in range(len(cities)):
if y[i].x >0.5:
print("-", cities[i])
print("Total rescued people:", int(m.objVal))
else:
print("No feasible solution found.")
However, it does not understand the "neighbourhood" policy. Help me enhance this code with counting neighbourhood policy, which means we can only go to neighbourhood countries.
image text in transcribed

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

More Books

Students also viewed these Databases questions

Question

Why would forecasting in this case be such a challenge?

Answered: 1 week ago

Question

Know how procedures protect an organization

Answered: 1 week ago