85 lines
2.2 KiB
Julia
85 lines
2.2 KiB
Julia
#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) |