Requirement already satisfied: scop in /Users/mikiokubo/Library/Caches/pypoetry/virtualenvs/scmopt-HY5JLThu-py3.8/lib/python3.8/site-packages (0.0.1)
WARNING: You are using pip version 20.2.2; however, version 24.3.1 is available.
You should consider upgrading via the '/Users/mikiokubo/Library/Caches/pypoetry/virtualenvs/scmopt-HY5JLThu-py3.8/bin/python -m pip install --upgrade pip' command.
linear = Linear(name="Objective Function",weight=1,rhs=0,direction="<=")linear.addTerms([15,20,30],[A,A,A],[0,1,2])linear.addTerms([7,15,12],[B,B,B],[0,1,2])linear.addTerms([25,10,13],[C,C,C],[0,1,2]) model.addConstraint(linear)
Model:
number of variables = 3
number of constraints= 2
variable A:['0', '1', '2'] = None
variable B:['0', '1', '2'] = None
variable C:['0', '1', '2'] = None
All_Diff: weight= inf type=alldiff A B C ; :LHS =0
Objective_Function: weight= 1 type=linear 15(A,0) 20(A,1) 30(A,2) 7(B,0) 15(B,1) 12(B,2) 25(C,0) 10(C,1) 13(C,2) <=0 :LHS =0
================ Now solving the problem ================
solution= {'A': '0', 'B': '2', 'C': '1'}
violated constraint= {'Objective_Function': 37}
'''Example 1 (Assignment Problem):Three jobs (0,1,2) must be assigned to three workers (A,B,C)so that each job is assigned to exactly one worker.The cost matrix is represented by the list of listsCost=[[15, 20, 30], [7, 15, 12], [25,10,13]],where rows of the matrix are workers, and columns are jobs.Find the minimum cost assignment of workers to jobs.'''#リストと辞書を用いたプログラムworkers=['A','B','C']Jobs =[0,1,2]Cost={ ('A',0):15, ('A',1):20, ('A',2):30, ('B',0): 7, ('B',1):15, ('B',2):12, ('C',0):25, ('C',1):10, ('C',2):13 }model=Model()x={}for i in workers: x[i]=model.addVariable(name=i,domain=Jobs)xlist=[]for i in x: xlist.append(x[i])con1=Alldiff('AD',xlist,weight='inf')con2=Linear('linear_constraint',weight=1,rhs=0,direction='<=')for i in workers:for j in Jobs: con2.addTerms(Cost[i,j],x[i],j)model.addConstraint(con1)model.addConstraint(con2)print(model)model.Params.TimeLimit=1sol,violated=model.optimize()if model.Status==0:print('solution')for x in sol:print (x,sol[x])print ('violated constraint(s)')for v in violated:print (v,violated[v])
Model:
number of variables = 3
number of constraints= 2
variable A:['0', '1', '2'] = None
variable B:['0', '1', '2'] = None
variable C:['0', '1', '2'] = None
AD: weight= inf type=alldiff A C B ; :LHS =0
linear_constraint: weight= 1 type=linear 15(A,0) 20(A,1) 30(A,2) 7(B,0) 15(B,1) 12(B,2) 25(C,0) 10(C,1) 13(C,2) <=0 :LHS =0
================ Now solving the problem ================
solution
A 0
B 2
C 1
violated constraint(s)
linear_constraint 37
LBC={} for j in Jobs: LBC[j]=Linear(f"LB{j}","inf",LB[j],">=")for i in workers: LBC[j].addTerms(1,x[i],j) model.addConstraint(LBC[j])obj=Linear("obj")for i in workers:for j in [0,1,2]: obj.addTerms(Cost[i,j],x[i],j)model.addConstraint(obj)
modelのパラメータParamsで制限時間TimeLimitを1(秒)に設定して最適化する.
プログラム全体を以下に示す.
"""Example 2 (Generalized Assignment Problem):Three jobs (0,1,2) must be assigned to five workers (A,B,C,D,E).The numbers of workers that must be assigned to jobs 0,1 and 2 are 1,1 and 2, respectively. The cost matrix is represented by the list of lists Cost=[[15, 20, 30],[7, 15, 12],[25,10,13],[15,18,3],[5,12,17]]where rows are workers, and columns are jobs.Find the minimum cost assignment of workers to jobs."""model=Model()workers=['A','B','C','D','E']Jobs =[0,1,2]Cost={ ('A',0):15, ('A',1):20, ('A',2):30, ('B',0): 7, ('B',1):15, ('B',2):12, ('C',0):25, ('C',1):10, ('C',2):13, ('D',0):15, ('D',1):18, ('D',2): 3, ('E',0): 5, ('E',1):12, ('E',2):17 }LB={0: 1,1: 2,2: 2 }x={}for i in workers: x[i]=model.addVariable(name=i,domain=Jobs)LBC={} for j in Jobs: LBC[j]=Linear(f"LB{j}","inf",LB[j],">=")for i in workers: LBC[j].addTerms(1,x[i],j) model.addConstraint(LBC[j])obj=Linear("obj")for i in workers:for j in [0,1,2]: obj.addTerms(Cost[i,j],x[i],j)model.addConstraint(obj)model.Params.TimeLimit=1sol,violated=model.optimize()print('solution')for x in sol:print (x,sol[x])print ('violated constraint(s)')for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
A 1
B 2
C 1
D 2
E 0
violated constraint(s)
obj 50
例題 仕事の割当3
上の例題と同じ状況で,仕事を割り振ろうとしたところ,作業員 A と C は仲が悪く, 一緒に仕事をさせると喧嘩を始めることが判明した. 作業員 A と C を同じ仕事に割り振らないようにするには,どうしたら良いだろうか?
この問題は,追加された作業員 A と C を同じ仕事に割り当てることを禁止する制約を記述するだけで解決できる. ここでは,2次制約(重みは \(100\))として記述する.
"""Example 3 (Variation of Generalized Assignment Problem):Three jobs (0,1,2) must be assigned to five workers (A,B,C,D,E).The minimum numbers of workers that must be assigned to jobs 0,1 and 2 are 1,2 and 2, respectively.This lower bound is represented by a dictionary:LB={0: 1, 1: 2, 2: 2 }where keys are jobs and values are lower bounds.The cost matrix is represented by a dictionary:Cost={ ("A",0):15, ("A",1):20, ("A",2):30, ("B",0): 7, ("B",1):15, ("B",2):12, ("C",0):25, ("C",1):10, ("C",2):13, ("D",0):15, ("D",1):18, ("D",2): 3, ("E",0): 5, ("E",1):12, ("E",2):17 }where keys are tuples of workers and jobs, and values are costs.We add an additional condition: worker A cannot do the job with worker C.Find the minimum cost assignment of workers to jobs."""model=Model()workers=["A","B","C","D","E"]Jobs =[0,1,2]Cost={ ("A",0):15, ("A",1):20, ("A",2):30, ("B",0): 7, ("B",1):15, ("B",2):12, ("C",0):25, ("C",1):10, ("C",2):13, ("D",0):15, ("D",1):18, ("D",2): 3, ("E",0): 5, ("E",1):12, ("E",2):17 }LB={0: 1,1: 2,2: 2 }x={}for i in workers: x[i]= model.addVariable(i,Jobs)LBC={}for j in Jobs: LBC[j]=Linear(f"LB{j}","inf",LB[j],">=")for i in workers: LBC[j].addTerms(1,x[i],j) model.addConstraint(LBC[j])obj=Linear("obj",1,0,"<=")for i in workers:for j in Jobs: obj.addTerms(Cost[i,j],x[i],j)model.addConstraint(obj)conf=Quadratic("conflict",100,0,"=")for j in Jobs: conf.addTerms(1,x["A"],j,x["C"],j)model.addConstraint(conf)model.Params.TimeLimit=1sol,violated= model.optimize()print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
A 0
B 2
C 1
D 2
E 1
violated constraint(s)
obj 52
#model=Model()v=[16,19,23,28]a=[[2,3,4,5],[3000,3500,5100,7200]]b=[7,10000]n=len(v)m=len(b)items=["item{0}".format(j) for j inrange(n)]varlist=model.addVariables(items,[0,1])for i inrange(m): con1=Linear("mkp_{0}".format(i),"inf",b[i])for j inrange(n): con1.addTerms(a[i][j],varlist[j],1) model.addConstraint(con1)con2=Linear("obj",1,sum(v),">=")for j inrange(n): con2.addTerms(v[j],varlist[j],1)model.addConstraint(con2)model.Params.TimeLimit=1sol,violated=model.optimize()print (model)if model.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
#m=Model()nodes=["n{0}".format(i) for i inrange(6)]adj=[[2],[3],[0,3,4,5],[1,2,5],[2],[2,3]]n=len(nodes)varlist=m.addVariables(nodes,[0,1])for i inrange(n):for j in adj[i]:if i<j: con1=Linear("constraint{0}_{1}".format(i,j),"inf",1) con1.addTerms(1,varlist[i],1) con1.addTerms(1,varlist[j],1) m.addConstraint(con1)obj=Linear("obj",1,n,">=")for i inrange(n): obj.addTerms(1,varlist[i],1)m.addConstraint(obj)m.Params.TimeLimit=1sol,violated=m.optimize()print (m)if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
#m=Model()K=3nodes=["n{0}".format(i) for i inrange(6)]adj=[[2],[3],[0,3,4,5],[1,2,5],[2],[2,3]]n=len(nodes)varlist=m.addVariables(nodes,range(K))for i inrange(n):for j in adj[i]:if i<j: con1=Alldiff("alldiff_{0}_{1}".format(i,j),[varlist[i],varlist[j]],"inf") m.addConstraint(con1)m.Params.TimeLimit=1sol,violated=m.optimize()print (m)if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
#nodes=[f"n{i}"for i inrange(6)]adj=[[1,4],[0,2,4],[1],[4,5],[0,1,3,5],[3,4]]n=len(nodes)m = Model()varlist=m.addVariables(nodes,[0,1])con1=Linear("constraint","inf",n//2,"=")for i inrange(len(nodes)): con1.addTerms(1,varlist[i],1)m.addConstraint(con1)##con2={}##for i in range(n):## for j in adj[i]:## con2[i,j]= Quadratic( "obj_%s_%s"%(i,j) )## con2[i,j].addTerms(1,varlist[i],1,varlist[j],0)## con2[i,j].addTerms(1,varlist[i],0,varlist[j],1)## m.addConstraint(con2[i,j])con2=Quadratic( "obj")for i inrange(n):for j in adj[i]: con2.addTerms(1,varlist[i],1,varlist[j],0) con2.addTerms(1,varlist[i],0,varlist[j],1)m.addConstraint(con2)print (m)m.Params.TimeLimit=1sol,violated=m.optimize()if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
#m=Model()cities=["T","L","M","R","B"]d=[[0,476,774,434,408],[476,0,784,894,569],[774,784,0,852,1154],[434,894,852,0,569],[408,569,1154,569,0]]n=len(cities)varlist=m.addVariables(cities,range(n))con1=Alldiff("AD",varlist,"inf")m.addConstraint(con1)obj=Quadratic("obj")for i inrange(n):for j inrange(n):if i!=j:for k inrange(n):if k ==n-1: ell=0else: ell=k+1 obj.addTerms(d[i][j],varlist[i],k,varlist[j],ell)m.addConstraint(obj)m.Params.TimeLimit=1sol,violated=m.optimize()print (m)if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
#m=Model()n=8varlist=[]for i inrange(n): varlist.append("x{0}".format(i))var=m.addVariables(varlist,range(n))con1=Alldiff("AD",var,"inf")m.addConstraint(con1)for k inrange(2,2*n-1): con2=Linear("rightdown_{0}".format(k),"inf",1,"<=")for i inrange(n): j=k-n+iif j>=0and j<=n-1: con2.addTerms(1,var[i],j) m.addConstraint(con2)for k inrange(2,2*n-1): con3=Linear("leftdown_{0}".format(k),"inf",1,"<=")for i inrange(n): j=k-i-1if j>=0and j<=n-1: con3.addTerms(1,var[i],j) m.addConstraint(con3)obj=Linear("obj",1,0,"<=")for i inrange(n):for j inrange(n): obj.addTerms((i+1)*(j+1),var[i],j)m.addConstraint(obj)m.Params.TimeLimit=1sol,violated=m.optimize()#print (m)if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
x0 6
x1 3
x2 1
x3 7
x4 5
x5 0
x6 2
x7 4
violated constraint(s)
obj 150
#m=Model()n=3d=[[0,2,3],[2,0,1],[3,1,0]]f=[[0,5,1],[5,0,2],[1,2,0]]nodes=["n{0}".format(i) for i inrange(n)]varlist=m.addVariables(nodes,range(n))con1=Alldiff("AD",varlist,"inf")m.addConstraint(con1)obj=Quadratic("obj")for i inrange(n-1):for j inrange(i+1,n):for k inrange(n):for ell inrange(n):if k !=ell: obj.addTerms(f[i][j]*d[k][ell],varlist[i],k,varlist[j],ell)m.addConstraint(obj)m.Params.TimeLimit=1sol,violated=m.optimize()if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
n0 2
n1 1
n2 0
violated constraint(s)
obj 12
#m=Model()Type=["A","B","C","D","E","F"] #car typesNumber={"A":1,"B":1,"C":2,"D":2,"E":2,"F":2} #number of cars needed n=sum(Number[i] for i in Number) #planning horizon#1st line produces car type B and C that has a workplace with length 5 and 3 workers#2nd line produces car type A anc C that has a workplace with length 3 and 2 workers Option=[["A","E","F"], ["C","D","F"], ["A","E"], ["A","B","D"], ["C"]] Length=[2,3,3,5,5] Capacity=[1,2,1,2,1]X={}for i inrange(n): X[i]=m.addVariable("seq[{0}]".format(i),Type)#production volume constraintsfor i in Type: L1=Linear("req[{0}]".format(i),direction="=",rhs=Number[i])for j inrange(n): L1.addTerms(1,X[j],i) m.addConstraint(L1)for i inrange(len(Length)):for k inrange(n-Length[i]+1): L2=Linear("ub[{0}_{1}]".format(i,k),direction="<=",rhs=Capacity[i])for t inrange(k,k+Length[i]):for j inrange(len(Option[i])): L2.addTerms(1,X[t],Option[i][j]) m.addConstraint(L2)m.Params.TimeLimit=1m.Params.OutputFlag=Falsesol,violated=m.optimize()if m.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
seq[0] A
seq[1] C
seq[2] F
seq[3] B
seq[4] F
seq[5] D
seq[6] E
seq[7] C
seq[8] D
seq[9] E
violated constraint(s)
#prod=["0","a","b"] #製品の種類T=5#計画期間は5期S={"0":0,"a":30,"b":50} #S[P,T]:単位生産量 UB={"0":0,"a":50,"b":50} #UB[p,t]:在庫量の上限 LB={"0":0,"a":10,"b":10} #LB[p]:在庫量の下限I0={"0":0,"a":10,"b":30} #I0[p]:初期在庫#D[p,t]:需要量D={('0',1):0,('0',2):0,('0',3):0,('0',4):0,('0',5):0, ('a',1):10,('a',2):10,('a',3):30,('a',4):10,('a',5):10, ('b',1):20,('b',2):10,('b',3):20,('b',4):10,('b',5):10}#F[p,q]: 製品p,q間の段取り費用F={('0',"a"):10,('0',"b"):10, ('a',"0"):10,('a',"b"):30, ('b',"0"):10,('b',"a"):10}model=Model()X={} #X[p,t]:製品pを期tに生産するかどうかの0-1変数 for t inrange(1,T+1): X[t]=model.addVariable("X{0}".format(t),prod)#constraint for p in prod:if p=="0":passelse:for t inrange(1,T+1): D_temp=0for i inrange(1,t+1): D_temp+=D[p,i] con1=Linear("LB{0}_{1}".format(p,t),"inf",LB[p]-I0[p]+D_temp,">=")for i inrange(1,t+1): con1.addTerms(S[p],X[i],p) model.addConstraint(con1)for p in prod:if p=="0":passelse:for t inrange(1,T+1): D_temp=0for i inrange(1,t+1): D_temp+=D[p,i] con2=Linear("UB{0}_{1}".format(p,t),"inf",UB[p]-I0[p]+D_temp,"<=")for i inrange(1,t+1): con2.addTerms(S[p],X[i],p) model.addConstraint(con2)for p in prod:if p=="0":passelse:for q in prod:if q=="0"or p==q:passelse:for t inrange(2,T+1): con3=Quadratic("obj{0}_{1}_{2}".format(p,q,t),1,0,"<=") con3.addTerms(F[p,q],X[t-1],p,X[t],q) model.addConstraint(con3)model.Params.TimeLimit=1sol,violated=model.optimize()if model.Status==0:print ("solution")for x in sol:print (x,sol[x])print ("violated constraint(s)")for v in violated:print (v,violated[v])
================ Now solving the problem ================
solution
X1 a
X2 b
X3 a
X4 a
X5 0
violated constraint(s)
obja_b_2 30
objb_a_3 10