There are plenty of statistics about population. If we concentrate on birth and death rates of 'cohorts' of males and females, ie those in certain age groups, we can model how the total population changes with time. Then throw in plagues, wars etc at random. Or immigrants arriving as economic migrants, or escaping from war-torn countries. Or introduce compulsory euthanasia at ag 70. Or tax children to limit birth rates. All goo clean fun..
'populater7 8 Feb 2006
'draws and updates population pyramids as cohorts ( 5 year groups)
' are born, die or have children.
'put in real data to watch, or implement your own eugenics
' eg kill everyone off when they reach 40
' or enforce 1 child per family...
'a work-in-progress
'let me know of any ideas to improve it.
nomainwin
dim men( 20), women( 20), drm( 20), drw( 20), brm( 20), brw( 20)
' population, death rates of men & women in each cohort,
' and birth rates of male & female babies (so I can include
' eugenics like choosing male babies as a preference!)
global future, currentpop, delay, deltap
for cohort =0 to 19 ' The start data can easily be changed . . . .
read a: men( cohort) =a 'number of males in cohort
read a: women( cohort) =a 'females
read a: drm( cohort) =a 'death rate for males in cohort
read a: drw( cohort) =a 'females
read a: brm( cohort) =a 'birth rate of male babies to girls in cohort
read a: brw( cohort) =a 'birth rate of female babies
next cohort
' pop pop drm drw brm brw
' num num % % % %
data 50, 50, 2, 2, 0, 0 ' cohort zero ages 0 to 4
data 0, 0, 1, 1, 0, 0 ' cohort one ages 5 to 9
data 0, 0, 1, 1, 2, 2 ' cohort 10 to 14 first fertile cohort
data 0, 0, 1, 1, 7, 7 ' cohort 15 to 19
data 0, 0, 2, 1, 21, 21 ' cohort 20 to 24 men are silly at this age...
data 0, 0, 1, 1, 30, 30 ' cohort 25 to 29 NB I assume equal m/f birth rate- with no selection they are within 3% of each other, females higher
data 0, 0, 1, 1, 33, 33 ' cohort 30 to 34
data 0, 0, 1, 1, 12, 12 ' cohort 35 to 39
data 0, 0, 1, 1, 6, 6 ' cohort 40 to 44
data 0, 0, 1, 1, 1, 1 ' cohort 45 to 49
data 0, 0, 5, 5, 0, 0 ' cohort 50 to 54
data 0, 0, 8, 7, 0, 0 ' cohort 55 to 59 About here death rates start to rise . . .
data 0, 0, 12, 9, 0, 0 ' cohort 60 to 64 but less for women than for men . . . .
data 0, 0, 18, 11, 0, 0 ' cohort 65 to 69
data 0, 0, 28, 15, 0, 0 ' cohort 70 to 74
data 0, 0, 40, 28, 0, 0 ' cohort 75 to 79
data 0, 0, 70, 50, 0, 0 ' cohort 80 to 84
data 0, 0, 80, 65, 0, 0 ' cohort 85 to 89
data 0, 0, 90, 70, 0, 0 ' cohort 90 to 94
data 0, 0, 98, 95, 0, 0 ' cohort 95+
WindowWidth =880
WindowHeight =620
UpperLeftX =INT( ( DisplayWidth -WindowWidth) /2)
UpperLeftY =INT( ( DisplayHeight -WindowHeight) /2)
menu #jf, "&File", "E&xit", [quit]
menu #jf, "&Help", "&About", [about]
graphicbox #jf.g5, 203, 82, 16, 200
graphicbox #jf.g, 10, 70, 400, 220
graphicbox #jf.g2, 10, 310, 400, 204
graphicbox #jf.g3, 520, 10, 50, 50
graphicbox #jf.g4, 10, 300, 400, 8
textbox #jf.t1, 10, 30, 400, 30
textbox #jf.t2, 10, 520, 400, 30
texteditor #jf.t3, 420, 70, 440, 460
button #jf.delayup, "Slower", slower, UR, 380, 34
button #jf.delaydn, "Faster", faster, UR, 380, 8
button #jf.war, "War!", war, UR, 260, 8
button #jf.famine, "Famine!", famine, UR, 180, 8
button #jf.boom, "Baby boom!", boom, UR, 80, 8
button #jf.over, "Boom over!", over, UR, 80, 34
button #jf.plague, "Plague!", plague, UR, 180, 34
open "Population Modeller- 'Populater' JohnF Feb 2006." for window_nf as #jf
print #jf, "trapclose [out]"
print #jf.g, "size 4"
print #jf.t1, "!font courier_new 16 bold"
print #jf.t2, "!font courier_new 8"
print #jf.t1, " Females ... Males"
print #jf.t3, "!font courier_new 8"
open "Malthus.txt" for input as #autoexec
print #jf.t3, "!contents #autoexec";
close #autoexec
delay =50000
deltap = 0
print #jf.g2, "down ; size 2 ; color black ; line 0 198 400 198 ; line 2 198 2 10"
print #jf.g3, "cls ; backcolor yellow ; fill green ; goto 25 25 ; down ; circlefilled "; str$( int( 2 +delay /4000))
cp = 0
for future =0 to 200
cp =currentpop
call update5years 'display current situation
for d =0 to delay 'increase to delay each update
scan
next d
if future =0 then
notice "Just a notice!" + chr$(13) + "Holding start display." +chr$(13) +"Click to proceed!"
end if
century =int( cp /100) ' horizontal every 100 pop'n
print #jf.g2, "down ; size 1 ; color darkgray"
print #jf.g2, "line 0 "; str$( 200- 10 *century); " 400 "; str$( 200 -10 *century); "up"
call generation
scan
deltap =int( currentpop -cp) ' rate of growth
next future
[quit]
print #jf.g, "flush"
print #jf.g, "getbmp pyramid 1 1 399 219"
filedialog "Save pyramid as", "pyramid*.bmp", p$
if p$ <> "" then bmpsave "pyramid", p$
print #jf.g2, "flush"
print #jf.g2, "getbmp graph 1 1 399 203"
filedialog "Save graph as", "graph*.bmp", g$
if g$ <>"" then bmpsave "graph", g$
[out]
confirm "Are you ready to QUIT?"; rv$
'and if No??
close #jf
end
sub update5years
#jf.g, "cls"
'Add a routine to put on cohort ages, so the scale/ ages are obvious.
#jf.g5, "down ; font Times_New_Roman 7"
for m =0 to 95 step 5
#jf.g5, "goto 4 "; str$( int( 2.0 *( 100 -m) -5))
#jf.g5, "\"; str$( m)
next m
type =0
if deltap >10 then type = 1
if deltap <-10 then type =-1
select case type
case 1
#jf.g4 "fill green"
case -1
#jf.g4 "fill red"
case 0
#jf.g4 "fill white"
end select
if abs( ( future *5 /100) -int( future *5 /100)) <0.01 then ' vertical grid every 100 years
print #jf.g2, "down ; size 1 ; color darkgray ; line "; str$( future *2); " 10 "; str$( future *2); " 198"
end if
for cohort =0 to 19
print #jf.g, " down ; color "; str$( cohort/20 *255); " "; str$( cohort/20 *255); " 255"
print #jf.g, "line 210 "; str$( 210 -cohort *10); " "; str$( 210 +2* men( cohort)); " "; str$( 210 -cohort *10)
print #jf.g, "color 255 "; str$( cohort/20 *255); " "; str$( cohort/20 *255); " ; down"
print #jf.g, "line 190 "; str$( 210 -cohort *10); " "; str$( 190 -2*women( cohort)); " "; str$( 210 -cohort *10)
next cohort
end sub
sub generation
currentpop =0
for cohort =19 to 1 step -1 'each cohort moves up and some die
men( cohort) = men( cohort -1) *(100 -drm( cohort -1))/ 100
women( cohort) = women( cohort -1) *(100 -drw( cohort -1))/ 100
next cohort
men( 0) =0
women( 0) =0
for cohort =0 to 19 'and others are born
men( 0) = men( 0) +brm( cohort)/ 100 *women( cohort)
women( 0) =women( 0) +brw( cohort)/ 100 *women( cohort)
currentpop= currentpop +men( cohort) + women( cohort)
next cohort
print #jf.g2, "down ; size 2 ; color blue ; set "; str$( 4 +2 *future); " "; str$( 200 -int( currentpop /10))
print #jf.t2, 5 *( future +1); " years ahead. The population now is "; int( currentpop); " & change "; deltap
end sub
sub faster buttonhandle$
if delay >100 then delay =delay *0.8
print #jf.g3, "cls ; fill green ; goto 25 25 ; down ; circlefilled "; str$( 2 +int( delay /4000))
end sub
sub slower buttonhandle$
if delay <100000 then delay =delay *1.2
print #jf.g3, "cls ; fill red ; goto 25 25 ; down ; circlefilled "; str$( 2 +int( delay /4000))
end sub
sub war buttonhandle$ ' Modern war kills all ages, but especially men 15 to 30
for cohort =0 to 19
men( cohort) = men( cohort) *0.8
women( cohort) =women( cohort) *0.8
next cohort
for cohort =3 to 6
men( cohort) = men( cohort) *0.7
women( cohort) =women( cohort) *0.7
next cohort
end sub
sub famine buttonhandle$
men( 0) = men( 0) *0.1
men( 1) = men( 1) *0.2
women( 0) =women( 0) *0.05 ' girl babies are seen as less important!
women( 1) =women( 0) *0.1
for cohort =2 to 10 ' Parents try to feed children and starve themselves & the old
men( cohort) = men( cohort) *0.6
women( cohort) =women( cohort) *0.6
next cohort
for cohort =11 to 19
men( cohort) = men( cohort) *0.3
women( cohort) =women( cohort) *0.3
next cohort
end sub
sub boom buttonhandle$ ' all birth rates up 50%
for cohort =2 to 10
brm( cohort) =brm( cohort) *1.5
brw( cohort) =brw( cohort) *1.5
next cohort
end sub
sub over buttonhandle$ ' all birth rates down 50%
for cohort =2 to 10
brm( cohort) =brm( cohort) *0.67
brw( cohort) =brw( cohort) *0.67
next cohort
end sub
sub plague buttonhandle$ ' Hits old and young disproportionately
for cohort =0 to 4
men( cohort) = men( cohort) *0.5
women( cohort) =women( cohort) *0.5
next cohort
for cohort =5 to 12
men( cohort) = men( cohort) *0.8
women( cohort) =women( cohort) *0.8
next cohort
for cohort =13 to 19
men( cohort) = men( cohort) *0.5
women( cohort) =women( cohort) *0.5
next cohort