I am doing a project that I have to use Julia code to solve a student's final project allocation problem. I am kind of new to this kind of coding and new for Julia. I need some help with this.
Start with the problem, I have data for students and projects.
For students, I have 137 students who come from 4 different majors(such as, EE, ME, BIOM and EMGT). For every student, they have chosen 10 projects that they want to work on in Rank. (For example, student 1 want to do project 10, 1, 5....)
On the project side, I have 3 pieces of information.
1, all project has their request for the student(For example, project A need EE student but other major does not require).
2, All project has a priority rank from 1 to 4. 1 is the most important and 4 is the less.
3, the Most project has funding. But Funding does not relate to the priority. For example, project A has $20,000 as funding, but the priority level is 2. Project B may not have any funding, but it is priority 1. In this case, I have to make sure the project B has the right student, but project A is less important.
For all students, they can only get into one project.
In this project, I have to make sure that all priority 1 projects get the right student and try to make sure most students get into their first rank of project.
For now, I have loaded the student and project information in Julia as :
[load student and project inform][1]
The workspace looks like this.
[Data is the student inform, I only pice the top 4 of student rank of project][2]
I am looking for to get the solution of this project. Like array for all studnet allocation. And plot the data like how many studnet's project is their first pick.
If possible, please give me some idea about how to work on the next. If there is a close example of Julia code will be great.
Thank you for your time and help.
[1]: https://i.stack.imgur.com/NMeEb.png
[2]: https://i.stack.imgur.com/k9YJ5.png
Related
I'm going to use OptaPlanner to lay out time tables for a school.
We're laying out the time tables for a full semester and every week could, if necessary, be slightly different.
There are some tricky constraints to take into account:
1. Weekly schedules
The lectures in one subject should be spread out somewhat evenly over the semester.
We can't for example put 20 math lectures the first week and "be done" with math for this semester.
In fact, it's nice to have some weekly predictibility
"Science year 2 have biology on Tuesday mornings"
This constraint must not be carved in stone however. Some weeks have to include work experience sessions, PE excursions, etc, in which case they must deviate from other weeks.
Problem
If I create a constraint that say, gives -1soft for not scheduling a subject the same time as the previous week, then OptaPlanner will waste a lot of time before it "accidentally" finds a good placement for a lecture, and even if it manages to converge so that each subject is scheduled the same time every week, it will never ever manage to move the entire series of lectures by moving them one by one. (That local optimum will never be escaped.)
2. Cross student group subjects
There's a large correlation between student groups and courses; For example, all students in Science year 2 mostly reads the same courses: Chemistry for Science year 2, Biology for Sience year 2, ...
The exception being language courses.
Each student can choose to study French, German or Spanish. So Spanish for year 2 is studied by a cross section of Science year 2 students, and Social Studies year 2 students, etc.
From the experience of previous (manual) scheduling, the optimal solution it's almost guaranteed to schedule all language classes in the same time slots. (If French is scheduled at 9 on Thursdays, then German and Spanish can be scheduled "for free" at 9 on Thursdays.)
Problem
There are many time slots in one semester, and the chances that OptaPlanner will discover a solution where all language lectures are scheduled at the same time by randomly moving individual lectures is small.
Also, similarly to problem 1: If OptaPlanner does manage to schedule French, German and Spanish at the same time, these "blocks" will never be moved elsewhere, since they are individual lectures, and the chances that all lectures will "randomly" move to the same new slot is tiny. Even with a large Tabu history length and so on.
My thoughts so far
As for problem 1 ("Weekly predictability") I'm thinking of doing the following:
In the construction phase for the full-semester-schedule I create a reduced version of the problem, that schedules (a reduced set of lectures) into a single "template week". Let's call it a "single-week-pre-scheduling". This template week is then repeated in the construction of the initial solution of the full semester which is the "real" planning entity.
The local search steps will then only focus on inserting PE excursions etc, and adjusting the schedule for the affected weeks.
As for problem 2 I'm thinking that the solution to problem 1 might solve this. In a 1 week schedule, it seems reasonable to assume that OptaPlaner will realize that language classes should be scheduled at the same time.
Regarding the local optimum settled by the single-week-pre-scheduling ("Biology is scheduled on Tuesday mornings"), I imagine that I could create a custom move operation that "bundles" these lectures into a single move. I have no idea how simple this is. I would really like to keep the code as simple as possible.
Questions
Are my thoughts reasonable? Is there a more clever way to approach these problems? If I have to create custom moves anyways, perhaps I don't need to construct a template-week?
Is there a way to assign hints or weights to moves? If so, I could perhaps generate moves with slightly larger weight that adjusts scheduling to adhere to predictable weeks and language scheduled in the same time slots.
A question well asked!
With regards to your first problem, I suggest you take a look at OptaWeb Employee Rostering and the concept of rotations. A rotation is "how things generally are" and then Planner has the freedom to diverge from the rotation at a penalty. Once you understand the concept of the rotation from the UI, take a look at the planning entity Shift and how the rotation is implemented with the use of employee and rotationEmployee variables. Note that only the employee is an actual #PlanningVariable, with the rotationEmployee being fixed.
That means that you have to define your rotations manually, therefore doing the work of the solver yourself. However, since this operation is only done once a semester I assume, maybe the solution could be to have a simpler solver generate a reasonable general rotation first, and then a second solver would take it and figure out the specific necessary adjustments?
With regards to your second problem, rotations could help there too. But I'm thinking maybe some move filtering and custom moves to help OptaPlanner to either move all language classes, or none? Writing efficient custom moves is not easy, and filtering stock moves is cumbersome. So I would only do it when the potential of other options is exhausted. If you end up doing this, look for MoveIteratorFactory.
My answer is a little vague, as we do not get into the specifics of the domain model, but for the purposes of designing the overall solution, it hopefully gives enough clues.
Let's say you have a small project. The team has estimated all the tasks as 300 days of effort.
I have 5 developers in the team, and I want MS Project to tell me when the project will complete considering vacations and working schedule of my team member.
In order to do that:
I'm creating a Task "Development" with fixed work "300d", and task type "Fixed Work".
Then I create 5 resources, and specify a 2 week vacation for one of the developers somewhere in the middle of the schedule.
Then I assign my 5 development resources to this task.
The problem is, the 300d distributed evenly to all 5 development resources. And If one of them have a two weeks vacation in between, due to that particular resource the work will be finished 2 weeks later, where other 4 resources are sitting and doing nothing for 2 weeks. Total duration is 70 days.
what I get
What I want to get is: work is distributed accordingly through all 5 resources unevenly in a way that the whole task finishes as earlier as possible taking most of the usable time from all developers.
That's how I would expect it to work. In that particular case I was distributing hours manually.
what i would expect
Is there a possibility in MS Project to do something like this? Or am I doing something wrong?
There are a couple issues with how you are approaching the problem.
1. Rather than just planning out the manpower hours estimated to be needed for the entire project on a single line item, You should plan out the tasks that will need to be done to accomplish "Small Project"
If you discretely plan out the tasks that need to be accomplished to satisfy the scope of "Small project", you can establish dependency (predecessor/successor) relationships between your tasks and figure out what tasks need to be done before you can move on to others. When you do this it will give you a good idea of how long the total duration of the project will take and likely be more accurate than just relying on an estimate based on the manpower hours estimate your developers give you. Find out what tasks they actually need to do, not just how many hours they think the whole project will take them. This will also allow you to plan out the utilization of your resources better because you'll be able to assign specific resources to specific tasks, and not all of your resources need to be on every task.
2. In general I would avoid using the Task Usage form.
I noticed you are altering resources in the task usage form, but unless you are really experienced with Microsoft Project I would avoid ever touching that, as it's really easy to set the period of performance of resources assigned to a task to be different than the actual period of performance of the task itself. This will cause MS Project to behave unusually, and it can be hard for an unexperienced user to understand why. This usually leads to pain and frustration. This leads me to my next bit of advice:
3. If you really want to specify a resource's vacation time, it's better to adjust the calendar associated the resource to exclude those dates as working dates.
In your situation with only 5 resources on your project, this can be fairly easy to do. You can accomplish this 2 different ways (I'll start with the easiest option):
1. You can add resource specific exclusion dates to the default calendar in your project
You can accomplish this by opening the Resource Sheet table and then clicking the Project tab then Change Working Times. If you have the Resource Sheet open instead of the Gantt chart, you can specify the resource that is going to be effected by the exceptions:
In this example you can see that I would be excluding (removing) 8/23/21 thru 9/3/21 as working days for the SW Engineer resource, without needing to change the calendar used by the resource completely.
2. You can completely change the calendar used by particular resources to be different than the default calendar set for the project.
You can accomplish this by going into the Resource Sheet and opening the Base Calendar column:
From here you can assign any calendar that exists in the project to the resource. Of course this means you would need to create the calendars and assign exclusion dates to them.
To create a calendar, click the Project tab then click Change Working Times. Click Create New Calendar on the form that opens up and give it a name:
From there you can add exclusion dates and all that.
Note: In a larger project with many resources, I would recommend not messing with the calendar for the resources at all. It just gets hard to deal with when there are a lot of resources.
I have been tasked with improving my company's rudimentary scheduling process and making it more data driven, efficient, and streamlined. As it stands, we currently simply sum per month, total hours needed for projects & compare this value to possible work hours * number of employees. We compare these results and determine if we need to bring on more help or not.
I would like to be a lot more precise in this process and so I began looking into optimization with resources such as the Stable Marriage Problem. Eventually, I stumbled onto Genetic Algorithms and Simulated Annealing from the Job-Shop Problem, because I believe my problem ends up being a little more complex than a multi-match marriage problem, but I could be wrong.
My basic problem is set up as an optimization task with many limiting criteria.
Workers: John, Jane, Dale, etc.
They all can have multiple roles too (John can be a Manager or a Laborer)
Projects: Project A, Project B, Project C, etc.
Projects have start and end dates.
Ideally, I have sub-start and end dates for different phases of the projects that I would like to limit with, but overall start/end date will do. These sub-dates include hours required for each role type (Manager 8 hours, Laborer 20 hours, etc.)
Hours: No more than 45 hours per employee.
My question is do I actually need to utilize GA or Simulated Annealing or is there a simpler process. Also, I haven't been able to find any pseudocode for either of these processes in R.
Thanks for any and all help and I'm happy to clarify for anyone if more details are necessary!
You can try to model it as a Mixed Integer Program, using for example the lpSolve package. You'd have variables like john_manager_project_A_week_1 (number of hours John works on project A as a manager in week 1), which the solver is to determine, and linear constraints like
john_manager_project_A_week_1 + john_manager_project_B_week_1 + ... <= 45
john_manager_project_A_week_1 + jane_manager_project_A_week_1 + ... >= 8
This framework seems somewhat limited, but with some modeling tricks you can also express conditions like "John cannot work both as a manager and as a worker on project A in week 1".
Solving these problems is NP-hard, but solvers tend to be pretty good, and if you have only a few tens of people, projects and time slots it should be solvable. You can even have a linear goal function that is to be optimized (for example, replace "45" above by max_work_hours, and minimize that).
Here’s what I’ve done in a spreadsheet:
I’ve assigned people to one or more categories (ie. male, female, tall, short)
I’ve assigned weights to these people (ie. 200 lbs, 120 lbs, 300 lbs)
I’ve assigned names to these people (ie. John, Jane, Bill)
Here’s what I need to do in a plugin:
Find some way to get my data into it (maybe through an admin interface, or via my spreadsheet)
Filter results by one or more categories (ie. only male; only tall + female, etc)
From those filtered results, pull 2 or 3 people (as many as I can fit) whose combined weights equal X or less
Display the names of those 2 or 3 people as a list to front-end users
At the press of a button, randomly generate another 2 or 3 person team
I don’t mind getting my hands dirty, but I don't know where to begin. If you guys could give me any advice, best practices, code to get me started, or names of plugins that already do this, etc, I’d really appreciate it.
Also, if I’m biting off too much for a complete noob, feel free to let me know. Because if it comes down to it, I’ll just create the teams manually and throw them into a random text plugin, or something.
This depends heavily on what format it's in presently. If it's in a spreadsheet, you can import it pretty easily by saving as a CSV and processing it with fgetscsv
Assuming this is going into MySQL (as most WP plugins do), this is just a SQL query (ie WHERE wp_custom_person_record_weight > 100 AND wp_custom_person_record_name != 'Bill'
Same as #2 but with a JOIN and a SUM and a WHERE query against that sum.
This is the same SQL query, if you call it through mysqli_query you'll get an array back that you can output on the page
Random records can be gleaned a number of ways, either by going through a limit of X,2 where X is a randomly generated number between 0 and the # of records or through MySQL itself (although that is not recommended for performance reasons).
I have a scenario as given in the below workflow diagram using core service.
First step is manual step author will create/edit content and finish the activity and it is assigned to everyone.
In the second step, I want to do filter the users based on their groups.
In the third step, couple of scenario
a. If the user belongs to group "A" I want to list out all the next 3 available activities, User A can choose any one of these 3 activities.
b. If the user belongs to group "B", I want to list out "Reviewer" and "Approver" activity as next activity, user b can select any one of these 2.
Can any one give some idea to achieve this?
You should turn your problem around. Yes, it is possible, but the amount of knowledge required will be a huge barrier for you to implement.
So, instead think about it differently.
Change your "Filter Next activity" automated activity to an automatic decision, and have your code that determines the group membership also determine which activity should be next
have 2 forward paths from there - 1 for the users of Group A, other for the users of group B
on each forward path, have different selection options. You may try having links to the same activity from 2 different manual decisions, I don't know if that works though.
Worst case scenario you'll have repeated activities (not in name, but in function), and you saved yourself about 2 months of headaches trying to cope with the learning curve of doing CME extensions.
The simple answer to your initial question is: "no, this functionality is not out of the box".
But of course many things are possible by implementing critical parts yourself.
You'd probably need a GUI extension of some sorts to allow the user to pick from a list.
You'd need to store the information between phases of your custom solution.
And you'd then need some code in an automated workflow activity to implement the picking of the next activity.
Most of these steps have been covered in other questions already. Did you have a look for each of these? If so, you might want to share how far you already got and where you are stuck.