Sum of JuMP.value

Hello,

I would like to display in an excel document the sum of students assigned for each course:

if JuMP.value.(x[i,j])==1

for each j, display the sum of x[i,j]

Could someone help me?

1 Like
students_in_each_course = zeros(J)
for j in 1:J
    for i in 1:I
        if value(x[i,j]) == 1
            students_in_each_course[j] += 1
        end
    end
end

println(students_in_each_course)

Thank you very much!

Do you have any idea how I could display my solution in the following form:
from Julia in excel?

Capture d’écran 2022-10-13 à 19.21.25

for the moment I have this:

XLSX.openxlsx("choix élèves julia.xlsx", mode="rw") do xf
    !XLSX.hassheet(xf, "ATTRIBUTION") && XLSX.addsheet!(xf, "ATTRIBUTION")
    sheet = xf["ATTRIBUTION"]
    sheet["A1", dim=2] = collect(1:3)
1 Like

if value(x[i,j]) == 1

Never do this. Even if x is integer or binary, the result is not guaranteed to be exactly one. Do instead

if isapprox(value(x[i, j]), 1; atol = 1e-6)  # <-- or some other tolerance

See this part of the docs: Getting started with Julia · JuMP

However, since it seems you probably are using binary variables, you can also do:

students_in_each_course = [sum(value.(x[:, j])) for j in 1:J]

Do you have any idea how I could display my solution in the following form

What, exactly, do you want to represent? The A column is the name of the course, the B column is the name of the students assigned to each course, and the last row of each course is the number of students?

I’d do something like this:

using HiGHS
using JuMP
using XLSX

function main(students, courses)
    model = Model(HiGHS.Optimizer)
    @variable(model, x[students, courses], Bin)
    @constraint(model, [i in students], sum(x[i, :]) == 1)
    @constraint(model, [j in courses], sum(x[:, j]) >= 1)
    optimize!(model)
    XLSX.openxlsx("output.xlsx", mode = "w") do io
        if !XLSX.hassheet(io, "ATTRIBUTION")
            XLSX.addsheet!(io, "ATTRIBUTION")
        end
        sheet = io["ATTRIBUTION"]
        row = 1
        for course in courses
            sheet["A$row"] = "Course $course"
            count = 0
            for student in students
                if isapprox(value(x[student, course]), 1; atol = 1e-6)
                    sheet["B$row"] = "Student $student"
                    row += 1
                    count += 1
                end
                sheet["B$row"] = "Row count = $count"
            end
            row += 2
        end
    end
    return
end

students, courses = 1:3, 1:2
main(students, courses)

which yields

image

It might not be exactly what you want, but hopefully it points you in the right direction.

1 Like