GUIを作成しました
GUIの問題点は「ボタンを押して計算を始めるとGUIに処理がいかずに計算中はハングしてしまう」こと
SwingWorkerを使うとよさそうで、実際optaplannerのサンプルもSwingWorkerを使っているので、とりあえず入れてみた
GitHub - vascarpenter/ShiftSolver
GUIを作成しました
GUIの問題点は「ボタンを押して計算を始めるとGUIに処理がいかずに計算中はハングしてしまう」こと
SwingWorkerを使うとよさそうで、実際optaplannerのサンプルもSwingWorkerを使っているので、とりあえず入れてみた
GitHub - vascarpenter/ShiftSolver
を参考に、以前に作ったシフト割り振りを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のガワもかぶせないとな..
ターゲットの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を作る
main view classは extends JFrameとする
main view classから右クリックし、同じ名前のGUI Formを作る
bind classを新規に作らない場合には必ずbindしておくこと
まっさらなJPanelができる
コンポーネントをつめこむ GridLayoutManager (IntelliJ)はコンポーネントを長くしたい場合横方向や縦方向にRow/Columnをつなげることで長くできる
ロジックを書き込んで pack()等を忘れずにコンストラクタに記述する
そんでもってうまくいきました
apache poi使った。
こりゃ本格的にeclipse不要になってきたな..
昨日は呼符で水着マリー 今日は10連(ためたやつ)で驚異の引きが!
大学病院勤務時代は、経過表を教授回診前にボードに色鉛筆で記入し血圧・薬剤について一目でわかるようにグラフにしていたものだった。
同様にプレゼン等でも特に薬剤などは一目でわかるようにしたい
例:
薬剤が単剤であればそれほど問題ないが、漸増や漸減したときにうまく量を表現したい
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
結果
グラフがいまいちカスタマイズしづらい
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()
結果
こっちのほうが編集に使いやすいのでこっちにした
手書きのほうが速いってのはお約束
子供の自由研究結果をグラフにするソフトを書いた
はじめの美しくないやりかた
vbox += barchart("氷の溶ける早さ",CategoryAxis(), NumberAxis())
{
series(header[1]) {
data(serHdr[1],numdata[1][1])
data(serHdr[2],numdata[2][1])
data(serHdr[3],numdata[3][1])
data(serHdr[4],numdata[4][1])
}
series(header[2]) {
data(serHdr[1],numdata[1][2])
data(serHdr[2],numdata[2][2])
data(serHdr[3],numdata[3][2])
data(serHdr[4],numdata[4][2])
}
series(header[3]) {
data(serHdr[1],numdata[1][3])
data(serHdr[2],numdata[2][3])
data(serHdr[3],numdata[3][3])
data(serHdr[4],numdata[4][3])
}
series(header[4]) {
data(serHdr[1],numdata[1][4])
data(serHdr[2],numdata[2][4])
data(serHdr[3],numdata[3][4])
data(serHdr[4],numdata[4][4])
}
}
こうかけばよかった
val bc = barchart("氷の溶ける早さ",CategoryAxis(), NumberAxis())
for(i in 1..4)
{
val ser = XYChart.Series<String,Number>()
ser.name = header[i]
for(j in 1..4)
{
ser.data.add(XYChart.Data(serHdr[j], numdata[j][i]))
}
bc.data.add(ser)
}
vbox += bc