Files
AFRYCA/plugins/afryca.rcp/preloaded/module/Minimum cost metric/linear_MCC.jl
T
2026-05-22 11:14:29 +02:00

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)