2017-07-28 3 views
0

私はRを使ってLPSolveで作業しています。私の入力データは複数のCSVファイルの形式です。各ファイルにはテーブルがあります。テーブルの2は下に記載されている:制約についてLPSolve with R - 複数のデータセットを入力として

Production Data

Route Data

説明 -

  • 生産から各生産家から
  • 総流出量を元のルートがあります。 house =そのルートからのルートの合計(ルートボリューム)
  • プロダクションハウス総流出< =生産能力
  • ルートボリュームは、この記事に記載されていない他の変数

に依存して決定変数自体では以下のような制約の数学的表現は次のとおりです。

`Production Total Outflow = ∑(Route Volume) where (Production House ID from table_1)==(Originating from Prod House ID from table_2)` 

Production Total Outflow <= Production Capacity

実際には、何千もの行があります。私は上記の2つの制約のために次のコードを書こうとしました。 2つの制約があります:

#Reading Data from files 
routeData = read.csv("Route.csv", header = TRUE) 
ProductionData = read.csv("Production.csv", header = TRUE) 

#Fetching variable columns 
routeID = routeData$RouteID 
productionID = ProductionData$ProductionID 
productionCapacity = ProductionData$Supply.Capacity 

numberOfColumns = length(routeID) + length(productionID) #4+2 decision variables 
model <- make.lp(nrow=0, ncol=numberOfColumns, verbose="important") 

for(i in 1:length(productionID)){ 
    add.constraint(model, 1, "<=", productionCapacity[i]) #Something wrong here 
} 
#I haven't attempted to write the other constraint 

さらに制約を書き込むことができません。みんな助けてください。他の多くの制約もあるので、私はその目的を共有していません。ここで

+0

多くの場合、最初に数学モデルを書き留めるのが役立ちます。その後、これをコードに変換することができます。 –

+0

私は投稿を編集し、数学的表現を追加しました。また、私はGurobiでコードをうまく書いていましたが、LPSolveでは値を直接行列に入れるコードを書く必要があるので、混乱しています。 Plsヘルプ。 –

答えて

0

は均等制作会社経由のルートボリュームあなたがルート/制作会社の数千人を持っている場合、それは事前に割り当てる制約内に、より効率的であるかもしれないことを

library(lpSolveAPI) 

prodcap <- setNames(c(50,100), c(1,2)) 
route <- data.frame(rid=1:4, pid_from=rep(1:2, each=2)) 
route_volume <- 125 # example 

nvars <- nrow(route)+1 # example: evenly distribute production house output relative to capacity 
lprec <- make.lp(0, nvars) 

set.objfn(lprec, obj=1, indices=nvars) 

# capacity constraints 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    add.constraint(lprec, xt=rep(1, length(route_ids)), type="<=", rhs=prodcap[i], indices=route_ids) 
} 

# total outflow constraint 
add.constraint(lprec, xt=rep(1, nrow(route)), type="=", rhs=route_volume, indices=seq(1, nvars-1)) 

# example: define the last decision variable as maximum flow over each production house 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    add.constraint(lprec, xt=c(rep(1/prodcap[i], length(route_ids)), -1), type="<=", rhs=0, indices=c(route_ids, nvars)) 
} 

# solve 
status <- solve(lprec) 
if(status!=0) stop("no solution found, error code=", status) 
get.variables(lprec)[seq(1, nrow(route))] 
#[1] 41.66667 0.00000 83.33333 0.00000 

ノートを配布しようとする一例であり、 make.lpを使用し、add.constraintの代わりにset.rowを使用してください。これには例として、コメントで要求される追加の決定変数としてroute_volumeを使用します。

library(lpSolveAPI) 

prodcap <- setNames(c(50,100), c(1,2)) 
route <- data.frame(rid=1:4, pid_from=rep(1:2, each=2)) 
route_volume <- 125 # example 

# the first nrow(route) vars are the outflows, 
# then 1 variable for maximum flow (relative to capacity) over all production house 
# then 1 last variable for the route volume 
nvars <- nrow(route)+2 
ncons <- 2*length(prodcap)+3 

# pre-allocate the constraints 
lprec <- make.lp(ncons, nvars) 

# set objective: minimize maximum flow relative to capacity (example) 
set.objfn(lprec, obj=1, indices=nvars-1) 

# capacity constraints 
rownum <- 1 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    set.row(lprec, row=rownum, xt=rep(1, length(route_ids)), indices=route_ids) 
    set.rhs(lprec, prodcap[i], constraints=rownum) 
    rownum <- rownum + 1 
} 

# total outflow constraint ("=" resolves to two constraints) 
set.row(lprec, row=rownum, xt=c(rep(1, nrow(route)), -1), indices=c(seq(1, nvars-2), nvars)) 
set.rhs(lprec, 0, constraints=rownum) 
rownum <- rownum + 1 
set.row(lprec, row=rownum, xt=c(rep(-1, nrow(route)), 1), indices=c(seq(1, nvars-2), nvars)) 
set.rhs(lprec, 0, constraints=rownum) 
rownum <- rownum + 1 

# additional constraint for route volume 
set.row(lprec, row=rownum, xt=-1, indices=nvars) 
set.rhs(lprec, -125, constraints=rownum) #example: route_volume >= 125 
rownum <- rownum + 1 

# example: define the second last decision variable as maximum flow (relative to capacity) over all production houses 
# rhs is 0, which is preset 
for (i in seq(1, length(prodcap))) { 
    route_ids <- which(route[,"pid_from"]==i) 
    set.row(lprec, row=rownum, xt=c(rep(1/prodcap[i], length(route_ids)), -1), indices=c(route_ids, nvars-1)) 
    set.rhs(lprec, 0, constraints=rownum) 
    rownum <- rownum + 1 
} 

# solve 
status <- solve(lprec) 
if(status!=0) stop("no solution found, error code=", status) 
get.variables(lprec)[seq(1, nrow(route))] 
+0

ありがとうございます。出来た。しかし、route_volume < - 125の仮定の代わりに、route_volumeを決定変数にすると、コード内で何を変更する必要がありますか? –

+0

あなたはroute_volumeにどのような制約を課しているので、ソルバーはゼロを提案しませんroute_volume? –

+0

コード例を追加しました.hth –