Mae yna argyfwng ailgynhyrchadwyedd mewn gwyddoniaeth.

Mae hwn yn gwbl osgoadwy mewn gwyddoniaeth gyfrifiadurol. Os allwn ni dweud wrth gyfrifiadur beth i’w wneud, fe allwn ddweud wrtho beth i’w wneud unwaith eto. Felly, fe allwn ddweud wrth bobl eraill sut i ddweud wrth eu cyfrifiadur i’w wneud unwaith eto.

Yn faes efelychiadau digwyddiadau arwahanol (efelychiadau ciwio), mae’r meddalwedd a’r methodolegau a ddefnyddir yn draddodiadol yn gwneud hwn yn anodd. Mewn rhagargraffiad a chyflwynais yn ddiweddar gyda Dr. Vincent Knight, Prof. Paul Harper, ac Asyl Hawa, cymharwn ni dulliau efelychu yn nhermau ailgynhyrchadwyedd ac ymarferion gorau, a chyflwynwn lyfrgell Python ar gyfer efelychiadau digwyddiadau arwahanol o rwydweithiau ciwio, Ciw, sydd wedi’i dylunio yn bwrpasol ar gyfer rhain.

Mewn papur gynhadledd gan Richard A. Kilgore, fe restrir tair nodwedd fel gofyniad lleiaf ar gyfer ailgynhyrchadwyedd mewn efelychiadau:

  • Darllenadwyedd
  • Modwlaredd
  • Estynadwyedd

Ychwanegwn i rain ymarferion meddalwedd gorau.

Y Broblem

Mae tirwedd bresennol ymarferion efelychiadau ciwio yn ddibynnol iawn ar feddalwedd arunigol masnachol, sydd fel arfer yn gwneud defnydd trwm o GUIau (rhyngwynebau defnyddiwr graffigol). Mae yna hefyd canran bach o ymarferwyr efelychiad sy’n gweithio yn Excel (bach, ond yn ddigon arwyddocaol i’w cael eu cynnwys mewn rhan fwyaf o werslyfrau efelychiad).

Gadewch i mi ymhelaethu:

  • Mae gan feddalwedd masnachol costau uchel. Mae hwn yn cyfyngu rhannu modelau i rheina sydd yn gallu talu.
  • Mae meddalwedd cod caeedig yn atal mynediad i’r cod ffynhonnell, sy’n rhwystro dealltwriaeth o’r model a hyblygrwydd.

Mae’r nodweddion yma yn mynd yn erbyn cysyniad gwyddoniaeth agored yn gyfan gwbl.

  • Fel arfer nid yw pecynnau arunigol yn fodwlar neu’n estynadwy, yn rhwystro ail-defnyddioldeb y model.
  • Mae profi’r model yn anodd, ac mae defnydd GUIau yn gallu hybu dilysiad a gwiriad (validation and verification) gwael.
  • Mae ffeiliau deuaidd y model yn gwneud rheoli fersiynau yn drafferthus.
  • Nid yw modelau sydd wedi’i chuddio tu ôl i GUIau yn ddarllenadwy, gan fod paramedrau ac ymddygiadau hanfodol wedi cuddio tu ôl i hierarchaeth o ddewislenni.

Ateb?

Un ateb i’r broblem yma rydym ni’n cynnig yw’r llyfrgell Ciw, wedi’i ddefnyddio mewn ecosystem Python.

Fe ellir cymhwyso pob un o’r tair nodwedd o fodelu efelychiad ailgynhyrchadwy (Darllenadwyedd, Modwlaredd, ac Estynadwyedd), yn ogystal ag ymarferion gorau, i Python sydd wedi’i ysgrifennu’n dda, a defnydd Ciw:

  • Cod agored felly’n rhydd ac am ddim i lawrlwytho, defnyddio, newid, ac i gyfrannu.
  • Mae holl god ffynhonnell Ciw ar gael, yn addasadwy, ac yn estynadwy. Mae’r cod hefyd wedi’i phrofi’n llawn.
  • Mae model efelychiad yn sgript, ac felly gall cael ei brofi, ei rhannu, a defnyddio rheolaeth fersiwn.
  • Rydym ni’n credu bod gan Ciw cystrawen glir a ddarllenadwy.*
  • Gosodir hadau llifoedd haprifau yn glir, ac mae casglu data yn dryloyw, sy’n golygu fe all popeth cael eu harbed.
  • Mae Python yn adnabyddus yn y gymuned wyddonol, gan fod ganddo gystrawen darllenadwy a chasgliad helaeth o lyfrgelloedd gwyddonol arall.
  • Fe fydd cynnal efelychiadau yn yr ecosystem yma yn caniatáu cyfuniad di-dor gyda methodolegau eraill, megis dadansoddiad data, “machine learning”, ac algorithmau arall.
  • Mae Python yn adnabyddus am raglennu gwrthrych-gyfeiriadol, ac mae Ciw wedi’i adeiladu yn y modd yma, ac mae rhaglennu gwrthrych-gyfeiriadol yn ddull addas a priodol ar gyfer efelychiad digwyddiad arwahanol. Mae hwn hefyd yn gorfodi modwlaredd, ac yn hybu estynadwyedd.

*Dyma sampl o gystrawen Ciw, ar gyfer canfod amser aros cymedrig system M/M/1, gyda cyfradd dyfodi \(\lambda = 4\), cyfradd gwasanaeth \(\mu = 5\), ar ôl efelychu am 20 uned amser, gydag amser-cynhesu 2 uned amser, dros 5 arbrawf:

>>> import ciw

>>> N = ciw.create_network(
...     Arrival_distributions=[['Exponential', 4.0]],
...     Service_distributions=[['Exponential', 5.0]],
...     Number_of_servers=[1]
... )

>>> average_waits = []
>>> for trial in range(5):
...     ciw.seed(trial)
...     Q = ciw.Simulation(N)
...     Q.simulate_until_max_time(20)
...     recs = Q.get_all_records()
...     waits = [r.waiting_time for r in recs if r.arrival_date >= 4]
...     average_waits.append(sum(waits) / len(waits))

>>> sum(average_waits) / len(average_waits)
0.379274988243813

Mae’r papur yn cymharu nifer o fframweithiau efelychu: Ciw, SimPy, SIMUL8, AnyLogic, sgriptiau pwrpasol wedi’i ysgrifennu yn Python a C++, a modelu taenlen yn Excel.

Yn ogystal â chymharu’r rhain yn nhermau arferion gorau ac ailgynhyrchadwyedd, cymharwyd yn nhermau perfformiad hefyd. Yn y modd yma siomwyd Ciw ychydig, trwy fod tua 320 gwaith mor araf â’r sgript C++ pan redir gyda CPython, a 50 gwaith mor araf â C++ pan redir gyda PyPy. Fodd bynnag, nid yw cyflymder yn flaenoriaeth wrth ddatblygu Ciw, a ni fydd y datblygwyr byth yn peryglu ei phrif bwrpasau (darllenadwyedd modelu a galluogi ymchwil ailgynhyrchadwy gwyddonol) o achos cyflymder.

I grynhoi: nid yw ymarferion presennol efelychu digwyddiadau arwahanol yn gwneud ailgynhyrchadwyedd yn hawdd. Rydym ni’n cyflwyno amgylchedd sy’n meithrin efelychiadau ailgynhyrchadwy, sef Python a’r llyfrgell Ciw.