0

For CPLEX in python, we have decision variables X. If I would like to sort the decision variable x into S, is it correct we I write this way? Thank you.

x = np.empty((Total_T,1), dtype= object)
for i in range(Total_T):
      x[i] = mdl.continuous_var(lb= 0, ub= inf, name='x' + str(i+1))

S = sorted(x)

Screeshot from PyCharm

1 Answers1

1

in python docplex in order to sort decision variables

from random import *
from docplex.cp.model import CpoModel

n=10

v=[randint(0,20) for i in range(0,n)]


mdl = CpoModel(name='buses')

#decision variables

x = mdl.integer_var_list(n,0,1000,name="x")
y = mdl.integer_var_list(n,0,1000,name="y")
perm = mdl.integer_var_list(n,0,n-1,name="perm")

for i in range(0,n):
    mdl.add(x[i]==v[i])

#order
for i in range(0,n-1):
    mdl.add(y[i]<=y[i+1])

for i in range(0,n):
    mdl.add(y[i]==mdl.element(x,perm[i]))

#allDiff
mdl.add(mdl.all_diff(perm))   

msol=mdl.solve()

# Dislay solution
print("input= ",end=" ")
for i  in range(0,n):
    print(msol[x[i]],end=" ")
print()    

print("perm= ",end=" ")
for i  in range(0,n):
    print(msol[perm[i]],end=" ")
print()    

print("output= ",end=" ")
for i  in range(0,n):
    print(msol[y[i]],end=" ")
print()

and you can do the same with MP but may not be as efficient

from random import *
from docplex.mp.model import Model

n=10

r=range(0,n)

v=[randint(0,20) for i in r]


mdl = Model(name='sortvariables')

#decision variables

x = mdl.integer_var_list(n,0,1000,name="x")
y = mdl.integer_var_list(n,0,1000,name="y")
perm = mdl.binary_var_matrix(r,r,name="perm")
permx = mdl.integer_var_matrix(r,r,name="xperm")

for i in r:
    mdl.add(x[i]==v[i])

#order
for i in range(0,n-1):
    mdl.add(y[i]<=y[i+1])

#allDiff

for i in r:
    mdl.add(mdl.sum(perm[i,j] for j in r)==1)
    mdl.add(mdl.sum(perm[j,i] for j in r)==1)

for i in r:
    for j in r:
        mdl.add(mdl.if_then(perm[i,j]==0,permx[i,j]==0))
        mdl.add(mdl.if_then(perm[i,j]==1,permx[i,j]==x[j]))

#apply perm
for i in r:
    mdl.add(y[i]==mdl.sum(permx[i,j] for j in r))
        
mdl.solve()

# Dislay solution
print("input= ",end=" ")
for i  in r:
    print(int(x[i].solution_value),end=" ")
print()     

print("output= ",end=" ")
for i  in r:
    print(int(y[i].solution_value),end=" ")
print()
Alex Fleischer
  • 9,276
  • 2
  • 12
  • 15
  • Hello @Alex Fleischer, thank you for the answer. (1) Since I run my MILP case by using docplex.mp.model, is there any same feature of CpoModel in the mp.model? (2) If no, is it possible if I combine docplex.mp.model and docplex.cp.model and run within the same coding process in order to solve the MILP case? Thank you. – Nicholas Nicholas Jul 20 '22 at 22:19
  • Then you may use https://github.com/AlexFleischerParis/howtowithdocplex/blob/main/sortdecisionvariablesMP.py – Alex Fleischer Jul 21 '22 at 10:54