gikoha’s blog

個人的メモがわり

Optaplannerでシフト作成 - 3

GitHub - vascarpenter/ShiftSolver

GUIを拡張し、テーブルにして、拘束日と休日を","で区切って入力できるようにした

そのリストはCSVでの読み込みと保存できる

出力もテーブルにした

出力はCSVで結果を保存できるようにした

Optaplanner 7.0に対応し、deprecatedなものは削除

こんなふうになった

 

f:id:gikoha:20180914230416j:plain

まだ拘束日と休日の検索に対応していないけれどな!

 

jarで書き出した場合、DRLはリソースにしないと読めず、リソースにするとJARファイル内にDRLが入ってしまってこれはgetResourceで読めないから解析がなされなくなってしまう

DRLをlistにしてbuilderに読ませる方法がわからん。

Optaplannerでシフト作成 - 1

www.ogis-ri.co.jp

を参考に、以前に作ったシフト割り振りをoptaplannerを使ってヒューリスティック法で探索するプログラムを作る。

GitHub - vascarpenter/ShiftSolver: shift solver sample application using optaplanner

とりあえず doctorA,B,Cの3人を Employeeに

日付を Dayに

拘束割り付けモデルを WorkDayAssignmentにする

solutionParameterを使ったあまり美しくないやりかたも継承

とりあえずdrlは

rule "countLeveling"
  when
    $solutionParameter : SolutionParameter()
    $employee : Employee()
    $workCountPerPeople : Number() from accumulate( $workDayAssignment : WorkDayAssignment( employee == $employee ), count( $workDayAssignment ) )
  then
    scoreHolder.addSoftConstraintMatch(kcontext, new BigDecimal((int)(-10000D * Math.pow($solutionParameter.getCountAverage() - $workCountPerPeople.doubleValue(), 2) )));
end

のみとした (均等割り付けモデルのみ)

実際走らせてみると

    Day	People
1	Doctor A
2	Doctor C
3	Doctor B
4	Doctor A
5	Doctor C
...
<secondsSpentLimit>10</secondsSpentLimit>

で10秒間だけ探索するよう指定したけれど上記のようにうまくいってそうな感じ 

あとは休み希望や専門の縛り、土日拘束回数の均一化、

非同期探索、swingやkotlin/TornadeFXのガワもかぶせないとな..

cmd.exe

Windowsは cmd.exe上で

pushd "¥¥ServerIP¥hoge¥oge"      (cdだとUNCが使えないため)

java -jar hogehoge.jar

popd

とバッチファイルでいままでやっていたが jarならstartまんまでいけるとのことであり

start "¥¥Server¥hoge¥oge¥hogehoge.jar"

だけでよかったらしい

 

eclipse to IntelliJ IDEA (Java 1.3-6 Project)

ターゲットのJVMバージョン1.5-1.6で動作するプログラムを作るとき、これまでは eclipse+ WindowBuilderが定番だったが、 IntelliJ IDEAでは formを読ませることで WindowBuilderの代わりをするらしい(IDEが$$$setup$$$とかをソースで埋め込むかバイナリで埋め込むかをPreferences>Editor>GUI Designerから選んでおくこと)

まず New Projectから Javaを選択しProjectを作る

Project structure画面からsrcを右クリックし packageを作る

f:id:gikoha:20180910214355j:plain

main view classは extends JFrameとする

main view classから右クリックし、同じ名前のGUI Formを作る

bind classを新規に作らない場合には必ずbindしておくこと

まっさらなJPanelができる

f:id:gikoha:20180910214417j:plain

コンポーネントをつめこむ  GridLayoutManager (IntelliJ)はコンポーネントを長くしたい場合横方向や縦方向にRow/Columnをつなげることで長くできる

f:id:gikoha:20180910214531j:plain

ロジックを書き込んで pack()等を忘れずにコンストラクタに記述する

f:id:gikoha:20180910214612j:plain

そんでもってうまくいきました

f:id:gikoha:20180910214702j:plain

apache poi使った。

こりゃ本格的にeclipse不要になってきたな..

 

経過表

大学病院勤務時代は、経過表を教授回診前にボードに色鉛筆で記入し血圧・薬剤について一目でわかるようにグラフにしていたものだった。

同様にプレゼン等でも特に薬剤などは一目でわかるようにしたい

例:

http://idsc.nih.go.jp/iasr/rapid/graph/pf33241.gif

薬剤が単剤であればそれほど問題ないが、漸増や漸減したときにうまく量を表現したい

 

kotlin+TornadeFX(JavaFX)

val bc = barchart("Patient",CategoryAxis(), NumberAxis())
bc.isLegendVisible=false
bc.barGap=0.0
bc.categoryGap=0.0
bc.isHorizontalGridLinesVisible=false
bc.isVerticalZeroLineVisible=false
bc.isHorizontalZeroLineVisible=false


val ser = XYChart.Series<String,Number>()

ser.name = drugHdr[i]
for(j in 1..maxColumn)
{
ser.data.add(XYChart.Data(columnName[j], numdata[i][j]))
}
bc.data.add(ser)


vbox += bc

結果

f:id:gikoha:20180906120202j:plain

グラフがいまいちカスタマイズしづらい

 

R

 

# quartz(type="pdf",width=7,height=5,file="hoge.pdf")
y  = c(1.25, 2.5, 3.75, 5.0, 5.0)
x <- seq_along(y)
y2 <- rep(y, each=2)
y2 <- y2[-length(y2)]
x2 <- rep(x, each=2)[-1]
x3 <- c(min(x2), x2, max(x2))
y3 <- c(0, y2, 0)
plot(x, y, ylim=c(0, max(y)), type="n", bty="n", xlab="",ylab="",axes=F)
polygon(x3, y3, border=1, col="grey")
# dev.off()

 結果

f:id:gikoha:20180906120828j:plain

こっちのほうが編集に使いやすいのでこっちにした

手書きのほうが速いってのはお約束