#consensus model with group to individual distance as a consensus measure using JuMP using MathOptInterface using GLPK using DelimitedFiles function linear_MCC_distance_collective(opinion, n, p, l, epsilon, consensus, cost, weight) #solver declaration m = Model(GLPK.Optimizer) # decision variables # changed opinions @variable(m, o[1:n,1:p] >= 0) # variable for converting the modulus @variable(m, d[1:n,1:p] >= 0) @variable(m, x[1:n,1:p]) #variable for the group opinion @variable(m, g[1:p] >= 0) #variable for consensus constraint @variable(m, y[1:n,1:p]) @variable(m, z[1:n,1:p] >= 0) #add constraints for the model one by one # epsilon constraints for i = 1:n for j = 1:p @constraint(m, z[i,j] <= epsilon) end end #add equality constraint for j=1:p @constraint(m, g[j] - sum(o[i,j]*weight[i] for i = 1:n) == 0) end # equality constraints on the x for i = 1:n for j = 1:p @constraint(m, opinion[i,j] - o[i,j] == x[i,j]) @constraint(m, x[i,j] <= d[i,j]) @constraint(m,-x[i,j] <= d[i,j]) end end # consensus constraints for i = 1:n for j = 1:p @constraint(m, o[i,j] - g[j] == y[i,j]) @constraint(m, y[i,j] <= z[i,j]) @constraint(m,-y[i,j] <= z[i,j]) end end #consensus constraints @constraint(m, (2/(p*(p-1)))*sum(sum(weight[i]*(z[i,j]) for j = 1:p) for i = 1:n) <= consensus) #objective function @objective(m, Min, sum(sum(cost[i]*(d[i,j]) for j = 1:p) for i = 1:n)) #solve the model optimize!(m) end s = read("linear_MCC_data.txt", String) data = split(s, "&") opinion = readdlm(IOBuffer(data[1]),',',';') dimension = size(opinion) n = dimension[1] p = dimension[2] l = parse(Int64, ARGS[1]) epsilon = parse(Float64, ARGS[2]) consensus = parse(Float64, ARGS[3]) cost = readdlm(IOBuffer(data[2]),',') weight = readdlm(IOBuffer(data[3]),',') linear_MCC_distance_collective(opinion, n, p, l, epsilon, consensus, cost, weight)