MIP using PULP not approaching result












0















I am trying to solve a MIP problem. I am trying to find the number of exams to be done by each tech on a date for a week by minimizing the total number of techs used.
I have demand, time taken by each tech, list of techs etc. in separate dataframes.



Initially, I was using the cost function as minimizing the total time used to finish demand which @kabdulla helped me solve, linkhere!



Now, with the new cost function, the script gets stuck and doesn't seem to converge and I am not able to identify the reason.



Below is my code so far:



# Instantiate problem class
model = pulp.LpProblem("Time minimizing problem", pulp.LpMinimize)

capacity = pulp.LpVariable.dicts("capacity",
((examdate , techname, region) for examdate, techname, region in tech_data_new.index),
lowBound=0,
cat='Integer')

tech_used = pulp.LpVariable.dicts("techs",
((examdate,techname) for examdate,techname,region in tech_data_new.index.unique()),
cat='Binary')

model += pulp.lpSum(tech_used[examdate, techname] for examdate,techname in date_techname_index.index.unique())

for date in demand_data.index.get_level_values('Exam Date').unique():
for i in demand_data.loc[date].index.tolist():
model += pulp.lpSum([capacity[examdate,techname,region] for examdate, techname, region in tech_data_new.index if (date == examdate and i == region)]) == demand_data.loc[(demand_data.index.get_level_values('Exam Date') == date) & (demand_data.index.get_level_values('Body Region') == i), shiftname].item()

for examdate, techname,region in tech_data_new.index:
model += (capacity[examdate, techname, region]) <= tech_data_new.loc[(examdate,techname,region), 'Max Capacity']*tech_used[examdate, techname]

# Number of techs used in a day should be less than 8
for examdate in tech_data_new.index.get_level_values('Exam Date').unique():
model += pulp.lpSum(tech_used[examdate, techname] for techname in tech_data_new.index.get_level_values('Technologist Name').unique()) <=8


# Max time each tech should work in a day should be less than 8 hours(28800 secs)
for date in tech_data_new.index.get_level_values('Exam Date').unique():
for name in tech_data_new.loc[date].index.get_level_values('Technologist Name').unique():
#print(name)
model += pulp.lpSum(capacity[examdate,techname,region] * tech_data_new.loc[(examdate,techname,region), 'Time taken'] for examdate, techname, region in tech_data_new.index if (date == examdate and name == techname)) <= 28800


The last condition seems to be the problem, if I remove it, the problem converges. However, I am not able to understand the problem.



Please let me know, what I am missing in my understanding. Thanks.










share|improve this question























  • Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

    – kabdulla
    Jan 1 at 8:04













  • Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

    – user8996561
    Jan 3 at 4:25











  • My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

    – kabdulla
    Jan 3 at 19:28
















0















I am trying to solve a MIP problem. I am trying to find the number of exams to be done by each tech on a date for a week by minimizing the total number of techs used.
I have demand, time taken by each tech, list of techs etc. in separate dataframes.



Initially, I was using the cost function as minimizing the total time used to finish demand which @kabdulla helped me solve, linkhere!



Now, with the new cost function, the script gets stuck and doesn't seem to converge and I am not able to identify the reason.



Below is my code so far:



# Instantiate problem class
model = pulp.LpProblem("Time minimizing problem", pulp.LpMinimize)

capacity = pulp.LpVariable.dicts("capacity",
((examdate , techname, region) for examdate, techname, region in tech_data_new.index),
lowBound=0,
cat='Integer')

tech_used = pulp.LpVariable.dicts("techs",
((examdate,techname) for examdate,techname,region in tech_data_new.index.unique()),
cat='Binary')

model += pulp.lpSum(tech_used[examdate, techname] for examdate,techname in date_techname_index.index.unique())

for date in demand_data.index.get_level_values('Exam Date').unique():
for i in demand_data.loc[date].index.tolist():
model += pulp.lpSum([capacity[examdate,techname,region] for examdate, techname, region in tech_data_new.index if (date == examdate and i == region)]) == demand_data.loc[(demand_data.index.get_level_values('Exam Date') == date) & (demand_data.index.get_level_values('Body Region') == i), shiftname].item()

for examdate, techname,region in tech_data_new.index:
model += (capacity[examdate, techname, region]) <= tech_data_new.loc[(examdate,techname,region), 'Max Capacity']*tech_used[examdate, techname]

# Number of techs used in a day should be less than 8
for examdate in tech_data_new.index.get_level_values('Exam Date').unique():
model += pulp.lpSum(tech_used[examdate, techname] for techname in tech_data_new.index.get_level_values('Technologist Name').unique()) <=8


# Max time each tech should work in a day should be less than 8 hours(28800 secs)
for date in tech_data_new.index.get_level_values('Exam Date').unique():
for name in tech_data_new.loc[date].index.get_level_values('Technologist Name').unique():
#print(name)
model += pulp.lpSum(capacity[examdate,techname,region] * tech_data_new.loc[(examdate,techname,region), 'Time taken'] for examdate, techname, region in tech_data_new.index if (date == examdate and name == techname)) <= 28800


The last condition seems to be the problem, if I remove it, the problem converges. However, I am not able to understand the problem.



Please let me know, what I am missing in my understanding. Thanks.










share|improve this question























  • Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

    – kabdulla
    Jan 1 at 8:04













  • Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

    – user8996561
    Jan 3 at 4:25











  • My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

    – kabdulla
    Jan 3 at 19:28














0












0








0








I am trying to solve a MIP problem. I am trying to find the number of exams to be done by each tech on a date for a week by minimizing the total number of techs used.
I have demand, time taken by each tech, list of techs etc. in separate dataframes.



Initially, I was using the cost function as minimizing the total time used to finish demand which @kabdulla helped me solve, linkhere!



Now, with the new cost function, the script gets stuck and doesn't seem to converge and I am not able to identify the reason.



Below is my code so far:



# Instantiate problem class
model = pulp.LpProblem("Time minimizing problem", pulp.LpMinimize)

capacity = pulp.LpVariable.dicts("capacity",
((examdate , techname, region) for examdate, techname, region in tech_data_new.index),
lowBound=0,
cat='Integer')

tech_used = pulp.LpVariable.dicts("techs",
((examdate,techname) for examdate,techname,region in tech_data_new.index.unique()),
cat='Binary')

model += pulp.lpSum(tech_used[examdate, techname] for examdate,techname in date_techname_index.index.unique())

for date in demand_data.index.get_level_values('Exam Date').unique():
for i in demand_data.loc[date].index.tolist():
model += pulp.lpSum([capacity[examdate,techname,region] for examdate, techname, region in tech_data_new.index if (date == examdate and i == region)]) == demand_data.loc[(demand_data.index.get_level_values('Exam Date') == date) & (demand_data.index.get_level_values('Body Region') == i), shiftname].item()

for examdate, techname,region in tech_data_new.index:
model += (capacity[examdate, techname, region]) <= tech_data_new.loc[(examdate,techname,region), 'Max Capacity']*tech_used[examdate, techname]

# Number of techs used in a day should be less than 8
for examdate in tech_data_new.index.get_level_values('Exam Date').unique():
model += pulp.lpSum(tech_used[examdate, techname] for techname in tech_data_new.index.get_level_values('Technologist Name').unique()) <=8


# Max time each tech should work in a day should be less than 8 hours(28800 secs)
for date in tech_data_new.index.get_level_values('Exam Date').unique():
for name in tech_data_new.loc[date].index.get_level_values('Technologist Name').unique():
#print(name)
model += pulp.lpSum(capacity[examdate,techname,region] * tech_data_new.loc[(examdate,techname,region), 'Time taken'] for examdate, techname, region in tech_data_new.index if (date == examdate and name == techname)) <= 28800


The last condition seems to be the problem, if I remove it, the problem converges. However, I am not able to understand the problem.



Please let me know, what I am missing in my understanding. Thanks.










share|improve this question














I am trying to solve a MIP problem. I am trying to find the number of exams to be done by each tech on a date for a week by minimizing the total number of techs used.
I have demand, time taken by each tech, list of techs etc. in separate dataframes.



Initially, I was using the cost function as minimizing the total time used to finish demand which @kabdulla helped me solve, linkhere!



Now, with the new cost function, the script gets stuck and doesn't seem to converge and I am not able to identify the reason.



Below is my code so far:



# Instantiate problem class
model = pulp.LpProblem("Time minimizing problem", pulp.LpMinimize)

capacity = pulp.LpVariable.dicts("capacity",
((examdate , techname, region) for examdate, techname, region in tech_data_new.index),
lowBound=0,
cat='Integer')

tech_used = pulp.LpVariable.dicts("techs",
((examdate,techname) for examdate,techname,region in tech_data_new.index.unique()),
cat='Binary')

model += pulp.lpSum(tech_used[examdate, techname] for examdate,techname in date_techname_index.index.unique())

for date in demand_data.index.get_level_values('Exam Date').unique():
for i in demand_data.loc[date].index.tolist():
model += pulp.lpSum([capacity[examdate,techname,region] for examdate, techname, region in tech_data_new.index if (date == examdate and i == region)]) == demand_data.loc[(demand_data.index.get_level_values('Exam Date') == date) & (demand_data.index.get_level_values('Body Region') == i), shiftname].item()

for examdate, techname,region in tech_data_new.index:
model += (capacity[examdate, techname, region]) <= tech_data_new.loc[(examdate,techname,region), 'Max Capacity']*tech_used[examdate, techname]

# Number of techs used in a day should be less than 8
for examdate in tech_data_new.index.get_level_values('Exam Date').unique():
model += pulp.lpSum(tech_used[examdate, techname] for techname in tech_data_new.index.get_level_values('Technologist Name').unique()) <=8


# Max time each tech should work in a day should be less than 8 hours(28800 secs)
for date in tech_data_new.index.get_level_values('Exam Date').unique():
for name in tech_data_new.loc[date].index.get_level_values('Technologist Name').unique():
#print(name)
model += pulp.lpSum(capacity[examdate,techname,region] * tech_data_new.loc[(examdate,techname,region), 'Time taken'] for examdate, techname, region in tech_data_new.index if (date == examdate and name == techname)) <= 28800


The last condition seems to be the problem, if I remove it, the problem converges. However, I am not able to understand the problem.



Please let me know, what I am missing in my understanding. Thanks.







python pulp






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Dec 31 '18 at 12:53









user8996561user8996561

399




399













  • Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

    – kabdulla
    Jan 1 at 8:04













  • Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

    – user8996561
    Jan 3 at 4:25











  • My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

    – kabdulla
    Jan 3 at 19:28



















  • Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

    – kabdulla
    Jan 1 at 8:04













  • Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

    – user8996561
    Jan 3 at 4:25











  • My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

    – kabdulla
    Jan 3 at 19:28

















Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

– kabdulla
Jan 1 at 8:04







Are you sure that the problem is feasible with the last constraint included? What happens if you change the right-hand-side of the constraint to a very large number - does it solve then? Also I tend to use square brackets within the pulp.lpSum() as it makes it clear then your generating a list using list comprehension to be summed over.

– kabdulla
Jan 1 at 8:04















Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

– user8996561
Jan 3 at 4:25





Thanks for the suggestion. The problem is feasible. With a very large number on the right hand side, the solution becomes "Undefined".

– user8996561
Jan 3 at 4:25













My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

– kabdulla
Jan 3 at 19:28





My recommendation would be to clarify the formulation by pre-generating the sets and lists of interest. Your having to do lots of indexing into data-frames which makes the model harder to read, more error prone, and harder to keep up to date. Also I notice in the last term you are summing over terms you don't need to date and name each only take on a single value for each constraint you are adding so summing over them is confusion. Are you able to include a sample of data so I can actually run the code?

– kabdulla
Jan 3 at 19:28












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%2f53987761%2fmip-using-pulp-not-approaching-result%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%2f53987761%2fmip-using-pulp-not-approaching-result%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

Monofisismo

Angular Downloading a file using contenturl with Basic Authentication

Olmecas