From 352dbeef060160553d317c202ed8ef5f0061e521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Thu, 19 Nov 2020 23:41:08 +0100 Subject: [PATCH] skeleton --- .gitignore | 2 +- Network Dimensioning Practice.pdf | Bin 0 -> 35379 bytes Strats/tut.py | 10 + Strats/tutgold.py | 17 + Strats/tutplus.py | 14 + Strats/tutpro.py | 17 + bw.json | 1 + event1.txt | 1618 +++++++++++++++++++++++++++++ event_gen.py | 20 + sim.py | 101 ++ sim_p3.py | 95 ++ 11 files changed, 1894 insertions(+), 1 deletion(-) create mode 100644 Network Dimensioning Practice.pdf create mode 100644 Strats/tut.py create mode 100644 Strats/tutgold.py create mode 100644 Strats/tutplus.py create mode 100644 Strats/tutpro.py create mode 100644 bw.json create mode 100644 event1.txt create mode 100644 event_gen.py create mode 100644 sim.py create mode 100644 sim_p3.py diff --git a/.gitignore b/.gitignore index 13d1490..927f0b2 100644 --- a/.gitignore +++ b/.gitignore @@ -128,4 +128,4 @@ dmypy.json # Pyre type checker .pyre/ - +.idea/ diff --git a/Network Dimensioning Practice.pdf b/Network Dimensioning Practice.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8954fd9dbb49a1e405cac87a876a8410fa0a83ba GIT binary patch literal 35379 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 S{hI$xN!2p-@b5}5StJiIT0F9JNs&^%|`k4 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 literal 0 HcmV?d00001 diff --git a/Strats/tut.py b/Strats/tut.py new file mode 100644 index 0000000..5084dcd --- /dev/null +++ b/Strats/tut.py @@ -0,0 +1,10 @@ +# neptun1 neptun2 + +def init_bw(): + return 200 + +def decision(new, list_entry): +# print '--', new, list_entry +# print [1,[1 for x in list_entry]] + return [1,[1 for x in list_entry]] + diff --git a/Strats/tutgold.py b/Strats/tutgold.py new file mode 100644 index 0000000..07239d5 --- /dev/null +++ b/Strats/tutgold.py @@ -0,0 +1,17 @@ +# neptun1 neptun2 + +def init_bw(): + return 150 + +def decision(new, list_entry): +# print '--', new, list_entry + bw={'bronze': 1, 'silver': 3, 'gold': 10} + if new != 'gold': + br=len([x for x in list_entry if x[0]=='bronze']) + go=len([x for x in list_entry if x[0]=='bronze']) + si=len([x for x in list_entry if x[0]=='silver']) + bwn=sum([bw[x[0]] for x in list_entry]) + if bwn > init_bw()-bw['gold']: + return [0,[1 for x in list_entry]] + return [1,[1 for x in list_entry]] + diff --git a/Strats/tutplus.py b/Strats/tutplus.py new file mode 100644 index 0000000..30059c4 --- /dev/null +++ b/Strats/tutplus.py @@ -0,0 +1,14 @@ +# neptun1 neptun2 + +def init_bw(): + return 80 + +def decision(new, list_entry): +# print '--', new, list_entry + if new == 'gold': +# print [1,[1 for x in list_entry]] + return [1,[1 for x in list_entry]] + else: +# print [0,[1 for x in list_entry]] + return [0,[1 for x in list_entry]] + diff --git a/Strats/tutpro.py b/Strats/tutpro.py new file mode 100644 index 0000000..8e66d8e --- /dev/null +++ b/Strats/tutpro.py @@ -0,0 +1,17 @@ +# neptun1 neptun2 + +def init_bw(): + return 100 + +def decision(new, list_entry): +# print '--', new, list_entry + bw={'bronze': 1, 'silver': 3, 'gold': 10} + if new == 'gold': + b=sum([bw[x[0]] for x in list_entry]) + if b+10>init_bw(): + br=len([x for x in list_entry if x[0]=='bronze']) + si=len([x for x in list_entry if x[0]=='silver']) + if b+10-br<=init_bw(): + return [1,[0 if x[0]=='bronze' else 0 for x in list_entry]] + return [1,[1 for x in list_entry]] + diff --git a/bw.json b/bw.json new file mode 100644 index 0000000..7f8b6e8 --- /dev/null +++ b/bw.json @@ -0,0 +1 @@ +{'bronze':{'bw': 1, 'value': 2, 'damage':4, 'duration': 100, 'pr': 0.4}, 'silver': {'bw': 3, 'value': 5, 'damage':6, 'duration': 50, 'pr': 0.3}, 'gold':{'bw': 10, 'value': 30, 'damage':80, 'duration': 70, 'pr': 0.1}} diff --git a/event1.txt b/event1.txt new file mode 100644 index 0000000..0dd0d78 --- /dev/null +++ b/event1.txt @@ -0,0 +1,1618 @@ +0 bronze +1 bronze +2 gold +3 silver +4 bronze +5 silver +6 silver +8 silver +9 silver +10 bronze +11 silver +13 bronze +14 silver +15 silver +16 bronze +18 silver +19 gold +20 bronze +22 bronze +23 gold +24 silver +25 bronze +26 bronze +27 bronze +28 silver +29 bronze +31 gold +32 bronze +33 bronze +35 bronze +36 bronze +37 bronze +38 bronze +39 bronze +40 silver +41 bronze +42 silver +43 silver +45 gold +46 bronze +47 gold +49 bronze +51 gold +52 bronze +53 bronze +55 bronze +56 silver +57 silver +59 gold +60 bronze +63 silver +64 bronze +65 silver +66 bronze +68 bronze +69 silver +71 gold +72 gold +73 gold +74 gold +75 silver +76 bronze +79 silver +80 bronze +81 bronze +82 bronze +84 silver +85 silver +86 bronze +87 bronze +88 bronze +89 bronze +90 gold +91 silver +92 bronze +93 gold +94 silver +97 silver +100 bronze +101 gold +102 silver +106 bronze +107 silver +108 bronze +109 gold +111 gold +112 bronze +113 bronze +114 gold +115 gold +116 bronze +117 silver +118 silver +119 bronze +120 bronze +121 bronze +123 bronze +124 silver +125 silver +127 bronze +128 bronze +130 bronze +131 silver +132 bronze +133 gold +134 bronze +135 silver +136 silver +138 silver +139 silver +141 bronze +143 bronze +145 bronze +146 bronze +147 bronze +148 bronze +149 bronze +151 bronze +152 bronze +153 bronze +156 silver +158 gold +160 bronze +161 bronze +163 silver +164 bronze +165 bronze +166 gold +167 gold +168 bronze +169 bronze +170 bronze +172 bronze +173 bronze +174 silver +175 gold +176 silver +177 gold +178 bronze +179 bronze +180 bronze +182 bronze +183 bronze +184 gold +186 bronze +187 bronze +188 silver +189 bronze +190 bronze +191 bronze +192 bronze +193 bronze +194 bronze +195 silver +196 silver +197 silver +200 gold +201 bronze +202 silver +203 bronze +205 silver +206 bronze +207 bronze +208 silver +209 bronze +211 silver +212 silver +213 silver +214 silver +216 bronze +217 bronze +218 silver +219 bronze +221 silver +222 silver +223 bronze +225 silver +226 silver +227 silver +228 silver +229 silver +230 silver +232 bronze +235 silver +236 silver +237 silver +238 bronze +239 silver +241 silver +242 bronze +243 bronze +244 silver +245 silver +247 bronze +248 gold +249 silver +250 bronze +251 bronze +252 bronze +254 bronze +255 silver +256 bronze +257 gold +258 silver +259 bronze +260 silver +261 bronze +262 bronze +264 gold +265 silver +266 bronze +267 silver +268 bronze +270 silver +273 silver +274 silver +275 bronze +277 bronze +278 bronze +280 bronze +281 bronze +282 bronze +283 bronze +284 silver +285 bronze +286 bronze +287 silver +288 bronze +289 bronze +291 silver +292 silver +293 gold +294 bronze +295 silver +296 silver +297 bronze +298 silver +299 bronze +300 bronze +301 gold +303 gold +304 silver +305 bronze +307 silver +309 bronze +312 silver +313 gold +314 silver +316 bronze +317 bronze +320 bronze +321 bronze +323 silver +324 bronze +326 gold +327 silver +328 silver +329 gold +330 bronze +331 bronze +332 silver +333 silver +334 bronze +335 bronze +336 gold +337 silver +338 bronze +339 bronze +341 bronze +342 gold +346 silver +347 bronze +348 bronze +349 bronze +350 silver +351 bronze +352 gold +353 silver +356 silver +357 bronze +358 silver +359 bronze +360 gold +361 silver +362 bronze +364 silver +365 silver +366 silver +367 bronze +368 bronze +369 silver +370 bronze +371 silver +372 bronze +373 silver +376 bronze +379 silver +380 silver +382 bronze +383 silver +384 bronze +385 silver +387 bronze +388 silver +389 silver +390 bronze +391 silver +392 silver +393 silver +394 bronze +395 bronze +396 bronze +397 gold +398 bronze +399 silver +400 silver +401 silver +402 bronze +403 silver +405 silver +407 gold +408 silver +409 bronze +411 bronze +412 silver +414 silver +416 bronze +419 silver +420 bronze +421 silver +422 gold +423 silver +424 bronze +425 bronze +426 silver +429 silver +430 gold +431 gold +432 bronze +433 silver +434 silver +435 silver +436 bronze +437 silver +438 bronze +439 gold +440 bronze +441 bronze +442 bronze +443 bronze +444 gold +446 bronze +447 gold +448 bronze +449 bronze +450 bronze +451 silver +452 bronze +453 bronze +454 bronze +455 bronze +457 silver +458 bronze +459 gold +460 silver +461 bronze +462 bronze +463 silver +464 bronze +465 bronze +467 silver +468 bronze +469 silver +470 bronze +471 bronze +475 bronze +476 bronze +477 bronze +478 silver +480 bronze +481 bronze +482 silver +484 gold +486 bronze +487 bronze +488 bronze +489 silver +490 silver +491 bronze +492 bronze +493 bronze +494 bronze +495 silver +496 bronze +497 silver +498 silver +499 bronze +501 silver +502 bronze +503 bronze +505 bronze +506 bronze +507 silver +509 bronze +510 silver +511 silver +513 silver +514 gold +515 bronze +516 silver +518 bronze +520 bronze +521 gold +522 silver +523 silver +524 bronze +525 bronze +526 gold +529 bronze +530 silver +531 silver +532 gold +533 gold +536 silver +537 gold +539 bronze +540 silver +541 bronze +543 gold +544 silver +545 bronze +546 silver +547 silver +548 bronze +550 gold +551 gold +552 silver +553 bronze +554 bronze +555 bronze +556 bronze +558 bronze +559 silver +560 gold +562 gold +563 silver +564 silver +565 silver +566 silver +567 bronze +568 bronze +569 silver +570 silver +572 bronze +573 bronze +574 bronze +575 silver +577 bronze +579 silver +580 bronze +582 bronze +583 silver +584 gold +585 bronze +586 bronze +587 bronze +588 bronze +590 bronze +591 bronze +592 gold +593 bronze +594 bronze +595 silver +596 bronze +598 gold +599 bronze +600 bronze +601 bronze +603 silver +604 bronze +605 bronze +606 bronze +607 bronze +608 silver +609 bronze +610 bronze +611 silver +612 bronze +613 silver +615 silver +616 gold +617 bronze +618 gold +619 gold +620 silver +623 gold +624 gold +626 silver +627 silver +628 bronze +629 bronze +630 silver +632 silver +633 bronze +634 bronze +636 silver +637 bronze +638 silver +639 bronze +641 silver +642 bronze +643 bronze +645 silver +646 silver +647 bronze +649 bronze +650 silver +651 bronze +652 bronze +653 silver +654 silver +655 gold +656 bronze +658 bronze +659 bronze +660 silver +661 bronze +662 gold +663 silver +664 silver +665 bronze +666 silver +668 gold +669 bronze +671 bronze +672 silver +673 bronze +674 bronze +675 gold +676 silver +677 silver +678 bronze +680 silver +682 bronze +683 bronze +684 silver +685 bronze +687 silver +688 gold +689 bronze +690 gold +692 silver +693 silver +694 silver +695 silver +696 silver +697 gold +698 bronze +699 gold +700 bronze +701 silver +702 silver +704 silver +706 gold +707 silver +709 bronze +711 bronze +712 bronze +713 gold +716 bronze +718 bronze +719 bronze +720 bronze +722 silver +723 bronze +724 gold +725 bronze +726 bronze +728 bronze +729 bronze +730 gold +731 silver +732 silver +734 bronze +735 bronze +736 bronze +737 bronze +738 bronze +739 bronze +740 silver +741 gold +742 silver +743 bronze +744 silver +745 silver +746 silver +747 silver +748 silver +750 silver +752 silver +753 bronze +755 silver +756 silver +757 bronze +758 bronze +759 bronze +760 bronze +761 bronze +762 bronze +763 bronze +764 silver +765 bronze +766 bronze +768 bronze +769 gold +770 gold +771 bronze +772 bronze +773 bronze +774 bronze +775 silver +777 silver +779 silver +780 bronze +783 bronze +784 silver +785 bronze +786 bronze +787 bronze +789 bronze +790 gold +791 silver +792 silver +793 silver +794 silver +795 gold +796 gold +797 bronze +798 gold +799 bronze +801 silver +802 silver +803 silver +804 bronze +805 silver +807 gold +808 bronze +809 bronze +812 gold +813 bronze +814 bronze +815 bronze +816 silver +817 silver +818 bronze +819 bronze +820 silver +821 bronze +822 bronze +823 silver +826 bronze +827 silver +828 silver +829 bronze +830 bronze +831 silver +834 gold +836 bronze +837 bronze +838 silver +839 bronze +840 bronze +841 silver +842 bronze +843 silver +844 bronze +845 bronze +847 gold +848 bronze +851 bronze +852 silver +853 bronze +854 bronze +855 silver +856 silver +857 bronze +858 bronze +859 silver +860 bronze +861 silver +862 silver +863 gold +867 bronze +869 bronze +870 silver +872 bronze +873 bronze +874 bronze +875 silver +876 bronze +878 silver +879 gold +883 silver +885 bronze +886 silver +888 bronze +890 silver +891 silver +892 bronze +893 silver +894 silver +898 silver +899 silver +900 bronze +901 bronze +902 silver +903 bronze +904 bronze +906 silver +907 silver +908 bronze +909 silver +910 silver +911 bronze +912 bronze +914 silver +915 silver +916 bronze +917 silver +918 silver +919 bronze +920 silver +921 bronze +924 silver +925 bronze +927 silver +928 silver +930 silver +931 bronze +932 bronze +933 bronze +934 silver +937 gold +938 silver +940 bronze +941 bronze +943 bronze +944 bronze +946 bronze +947 bronze +948 silver +949 silver +950 bronze +951 silver +952 bronze +953 silver +955 gold +956 gold +957 bronze +958 silver +959 bronze +960 bronze +961 gold +963 silver +964 silver +965 bronze +966 bronze +967 silver +968 bronze +969 silver +971 bronze +972 bronze +973 bronze +974 bronze +975 silver +976 bronze +977 bronze +979 bronze +980 silver +981 bronze +982 bronze +984 bronze +985 bronze +986 silver +987 silver +988 silver +990 bronze +991 bronze +992 silver +994 bronze +995 bronze +996 bronze +997 bronze +998 bronze +999 gold +1000 bronze +1001 bronze +1003 bronze +1004 silver +1006 silver +1007 bronze +1008 silver +1009 gold +1010 bronze +1011 bronze +1012 silver +1014 silver +1016 bronze +1018 silver +1019 bronze +1020 bronze +1021 bronze +1022 bronze +1024 gold +1025 bronze +1026 gold +1028 bronze +1029 bronze +1030 silver +1034 gold +1035 gold +1036 bronze +1037 bronze +1038 bronze +1039 gold +1040 bronze +1041 bronze +1042 silver +1043 bronze +1044 silver +1045 bronze +1046 silver +1047 bronze +1048 bronze +1049 bronze +1050 silver +1052 bronze +1053 bronze +1054 gold +1055 silver +1056 bronze +1057 silver +1058 bronze +1059 bronze +1060 gold +1061 bronze +1062 bronze +1064 silver +1065 silver +1066 silver +1067 silver +1069 bronze +1070 bronze +1071 silver +1072 bronze +1073 bronze +1074 silver +1075 bronze +1076 gold +1077 bronze +1078 bronze +1079 silver +1080 bronze +1081 bronze +1082 bronze +1083 silver +1084 bronze +1086 silver +1088 bronze +1089 bronze +1091 bronze +1092 silver +1093 gold +1094 bronze +1095 silver +1096 silver +1097 bronze +1098 bronze +1099 gold +1100 silver +1101 bronze +1102 silver +1103 bronze +1104 bronze +1105 bronze +1106 bronze +1108 silver +1109 bronze +1111 gold +1112 bronze +1113 silver +1114 silver +1116 silver +1117 bronze +1118 silver +1119 gold +1120 silver +1122 gold +1123 gold +1124 bronze +1125 bronze +1126 bronze +1127 silver +1128 bronze +1129 bronze +1130 bronze +1131 bronze +1132 bronze +1133 silver +1135 silver +1136 silver +1137 bronze +1138 gold +1139 gold +1140 silver +1141 silver +1142 gold +1143 bronze +1144 silver +1145 bronze +1146 silver +1147 silver +1148 silver +1149 silver +1150 silver +1151 silver +1152 bronze +1153 gold +1154 bronze +1155 bronze +1156 bronze +1157 gold +1158 bronze +1159 bronze +1160 bronze +1161 bronze +1162 bronze +1163 bronze +1164 bronze +1165 silver +1166 bronze +1167 gold +1168 bronze +1170 bronze +1171 silver +1172 gold +1173 bronze +1175 silver +1176 bronze +1177 gold +1178 silver +1179 silver +1180 silver +1181 bronze +1182 silver +1184 bronze +1185 silver +1187 bronze +1188 silver +1189 silver +1190 silver +1193 bronze +1195 silver +1196 bronze +1197 bronze +1199 gold +1200 silver +1201 gold +1202 gold +1203 silver +1204 bronze +1205 gold +1206 silver +1208 silver +1210 silver +1211 bronze +1212 bronze +1213 silver +1215 bronze +1217 bronze +1218 gold +1219 bronze +1220 gold +1224 bronze +1225 silver +1226 gold +1227 bronze +1228 bronze +1229 bronze +1230 bronze +1232 silver +1233 silver +1234 gold +1235 gold +1236 silver +1237 silver +1238 bronze +1240 bronze +1241 silver +1242 bronze +1243 silver +1244 silver +1245 bronze +1246 bronze +1247 bronze +1249 bronze +1252 bronze +1254 gold +1255 silver +1256 gold +1257 silver +1258 gold +1259 bronze +1260 bronze +1262 bronze +1263 silver +1264 bronze +1265 bronze +1266 gold +1267 bronze +1268 bronze +1269 bronze +1270 silver +1271 silver +1272 silver +1273 gold +1274 silver +1275 bronze +1276 bronze +1278 silver +1279 bronze +1280 bronze +1281 bronze +1282 silver +1283 bronze +1284 bronze +1285 silver +1286 bronze +1287 silver +1288 silver +1289 silver +1290 bronze +1291 bronze +1292 bronze +1293 bronze +1294 bronze +1295 silver +1296 bronze +1297 bronze +1298 bronze +1299 bronze +1300 bronze +1301 gold +1302 silver +1303 silver +1306 silver +1310 gold +1311 bronze +1312 bronze +1313 bronze +1314 silver +1315 gold +1316 bronze +1317 silver +1319 bronze +1320 bronze +1321 silver +1322 bronze +1323 bronze +1324 bronze +1325 bronze +1327 bronze +1328 silver +1330 silver +1331 gold +1332 silver +1333 bronze +1334 bronze +1335 silver +1337 bronze +1338 silver +1339 bronze +1342 bronze +1343 bronze +1345 silver +1347 silver +1348 bronze +1350 bronze +1351 silver +1352 silver +1353 gold +1356 bronze +1357 bronze +1358 bronze +1359 silver +1360 bronze +1361 silver +1362 bronze +1363 gold +1364 bronze +1365 silver +1366 bronze +1367 bronze +1369 gold +1370 bronze +1371 bronze +1373 bronze +1374 bronze +1375 silver +1376 bronze +1377 bronze +1379 silver +1380 bronze +1381 silver +1382 bronze +1383 bronze +1385 bronze +1386 silver +1387 bronze +1388 bronze +1389 bronze +1390 silver +1391 bronze +1392 gold +1397 silver +1398 bronze +1399 silver +1401 gold +1402 silver +1405 bronze +1406 bronze +1409 bronze +1410 bronze +1411 bronze +1413 gold +1414 silver +1415 bronze +1417 gold +1418 bronze +1419 gold +1420 bronze +1421 silver +1422 silver +1423 bronze +1424 silver +1425 silver +1426 silver +1427 bronze +1428 bronze +1429 bronze +1430 gold +1431 bronze +1432 silver +1433 bronze +1434 silver +1435 silver +1436 silver +1437 bronze +1438 bronze +1439 silver +1440 silver +1442 silver +1443 silver +1444 gold +1445 bronze +1447 gold +1448 gold +1449 bronze +1450 silver +1451 bronze +1452 silver +1453 bronze +1454 gold +1455 silver +1456 bronze +1457 bronze +1458 bronze +1459 silver +1460 bronze +1461 bronze +1462 bronze +1463 silver +1465 silver +1466 bronze +1468 bronze +1469 silver +1471 bronze +1472 bronze +1474 bronze +1475 bronze +1476 silver +1477 silver +1479 silver +1480 gold +1481 silver +1482 bronze +1483 gold +1488 silver +1491 silver +1492 bronze +1493 silver +1494 silver +1495 bronze +1497 silver +1498 bronze +1499 gold +1500 bronze +1501 bronze +1502 gold +1503 gold +1505 bronze +1508 bronze +1509 silver +1510 silver +1511 silver +1514 bronze +1515 bronze +1516 silver +1517 bronze +1518 silver +1520 silver +1521 silver +1522 bronze +1524 bronze +1525 bronze +1526 bronze +1527 bronze +1530 bronze +1531 bronze +1532 silver +1533 bronze +1534 bronze +1535 bronze +1536 gold +1537 bronze +1538 bronze +1539 bronze +1542 bronze +1543 silver +1544 silver +1545 bronze +1546 bronze +1547 silver +1548 gold +1550 silver +1551 bronze +1553 bronze +1554 gold +1555 bronze +1556 silver +1557 silver +1558 gold +1559 bronze +1560 bronze +1561 bronze +1562 bronze +1563 bronze +1565 bronze +1566 silver +1567 silver +1568 silver +1569 silver +1570 silver +1571 bronze +1572 gold +1573 bronze +1575 bronze +1576 gold +1577 silver +1578 silver +1579 bronze +1580 bronze +1582 bronze +1583 silver +1584 bronze +1585 bronze +1586 silver +1587 bronze +1588 bronze +1589 silver +1590 silver +1591 bronze +1592 silver +1593 bronze +1594 bronze +1597 bronze +1598 gold +1599 silver +1600 gold +1602 bronze +1603 bronze +1604 silver +1606 silver +1607 silver +1608 silver +1609 silver +1610 silver +1611 bronze +1612 silver +1613 silver +1614 bronze +1616 bronze +1617 silver +1618 bronze +1619 bronze +1621 bronze +1622 bronze +1623 bronze +1624 silver +1625 silver +1626 bronze +1627 gold +1628 bronze +1630 gold +1631 silver +1633 bronze +1634 silver +1635 bronze +1636 bronze +1637 silver +1638 bronze +1639 silver +1640 silver +1642 silver +1644 bronze +1645 gold +1646 bronze +1647 silver +1648 silver +1649 bronze +1650 bronze +1651 silver +1652 silver +1653 bronze +1654 bronze +1655 bronze +1656 bronze +1657 bronze +1658 silver +1659 bronze +1660 bronze +1661 bronze +1662 bronze +1663 silver +1664 bronze +1665 bronze +1666 bronze +1667 silver +1668 silver +1669 bronze +1670 bronze +1671 bronze +1673 gold +1674 silver +1675 silver +1677 bronze +1678 bronze +1679 bronze +1680 bronze +1681 silver +1683 bronze +1684 bronze +1686 bronze +1687 silver +1688 bronze +1690 bronze +1691 bronze +1693 silver +1694 silver +1695 bronze +1696 silver +1699 bronze +1702 bronze +1703 silver +1704 bronze +1705 bronze +1708 silver +1709 silver +1710 bronze +1711 silver +1713 bronze +1714 bronze +1715 silver +1716 silver +1717 bronze +1718 bronze +1720 bronze +1722 gold +1723 gold +1724 silver +1725 bronze +1726 gold +1727 bronze +1728 bronze +1731 silver +1732 bronze +1733 silver +1734 bronze +1737 silver +1739 bronze +1742 silver +1743 silver +1744 bronze +1745 bronze +1746 bronze +1747 bronze +1748 silver +1749 bronze +1750 gold +1751 bronze +1752 silver +1753 bronze +1755 silver +1757 bronze +1758 bronze +1759 gold +1760 bronze +1761 gold +1763 bronze +1764 silver +1765 bronze +1767 gold +1769 gold +1770 silver +1771 bronze +1772 bronze +1774 bronze +1776 silver +1777 bronze +1778 bronze +1780 bronze +1781 bronze +1782 silver +1783 silver +1784 silver +1785 bronze +1786 gold +1788 bronze +1789 bronze +1790 silver +1792 silver +1794 silver +1796 bronze +1797 bronze +1798 bronze +1799 bronze +1800 gold +1801 silver +1802 silver +1803 silver +1804 silver +1805 silver +1806 silver +1807 silver +1808 bronze +1811 bronze +1812 bronze +1814 silver +1815 silver +1816 silver +1817 bronze +1819 gold +1820 silver +1822 silver +1823 silver +1824 bronze +1825 bronze +1826 silver +1827 bronze +1830 silver +1831 silver +1832 bronze +1833 silver +1834 bronze +1836 gold +1837 silver +1838 silver +1839 silver +1840 bronze +1841 silver +1842 silver +1843 silver +1844 silver +1845 bronze +1846 silver +1848 silver +1849 gold +1850 silver +1852 bronze +1853 silver +1854 silver +1855 silver +1856 silver +1857 bronze +1858 silver +1859 silver +1860 bronze +1861 bronze +1862 silver +1863 bronze +1864 bronze +1866 bronze +1867 bronze +1868 bronze +1869 bronze +1870 bronze +1871 silver +1872 gold +1873 silver +1874 silver +1875 bronze +1876 bronze +1877 bronze +1878 silver +1879 bronze +1880 silver +1883 gold +1884 bronze +1885 bronze +1886 bronze +1888 silver +1889 bronze +1891 bronze +1892 bronze +1893 bronze +1894 bronze +1895 gold +1896 gold +1897 bronze +1898 silver +1901 silver +1902 bronze +1904 silver +1905 bronze +1907 bronze +1908 bronze +1909 bronze +1910 bronze +1911 bronze +1912 bronze +1913 bronze +1914 bronze +1916 silver +1917 bronze +1918 silver +1919 bronze +1920 silver +1921 bronze +1922 silver +1923 silver +1924 bronze +1925 gold +1926 bronze +1927 bronze +1928 bronze +1929 bronze +1930 bronze +1931 bronze +1932 bronze +1933 gold +1934 silver +1936 bronze +1937 bronze +1938 silver +1939 silver +1940 bronze +1942 bronze +1943 bronze +1945 gold +1946 bronze +1947 silver +1948 bronze +1949 silver +1950 bronze +1951 silver +1952 silver +1953 bronze +1954 bronze +1955 bronze +1956 bronze +1957 silver +1958 bronze +1959 silver +1960 silver +1961 bronze +1962 silver +1963 silver +1965 gold +1966 bronze +1967 silver +1970 bronze +1971 bronze +1972 silver +1973 bronze +1974 gold +1975 bronze +1977 silver +1979 bronze +1980 gold +1981 bronze +1982 silver +1984 bronze +1985 bronze +1986 bronze +1987 bronze +1988 silver +1989 gold +1990 bronze +1991 bronze +1992 bronze +1993 bronze +1994 silver +1996 gold +1997 bronze +1998 bronze +1999 silver + + diff --git a/event_gen.py b/event_gen.py new file mode 100644 index 0000000..7268909 --- /dev/null +++ b/event_gen.py @@ -0,0 +1,20 @@ +import numpy as np +import numpy.random as rnd + +def event_gen(n): + events=[] + for t in range(n): + r=rnd.choice(range(10)) + if r<4: + events.append([t,'bronze']) + elif r<7: + events.append([t,'silver']) + elif r<8: + events.append([t,'gold']) + return events + +if __name__ == "__main__": + events = event_gen(2000) + for event in events: + print (event[0], event[1]) + diff --git a/sim.py b/sim.py new file mode 100644 index 0000000..c1e156c --- /dev/null +++ b/sim.py @@ -0,0 +1,101 @@ +import os +import numpy as np +import numpy.random as rnd +import sys +import importlib +import imp +import ctypes +import ctypes.util +from numpy.ctypeslib import ndpointer +import event_gen as eg + +PPP=60 +claim_types={'bronze':{'bw': 1, 'value': 2, 'damage':4, 'duration': 100, 'pr': 0.4}, + 'silver': {'bw': 3, 'value': 5, 'damage':6, 'duration': 50, 'pr': 0.3}, + 'gold':{'bw': 10, 'value': 30, 'damage':80, 'duration': 70, 'pr': 0.1}} + + +class Claim: + def __init__(self,ty,time): + self.ty = ty + self.bw=claim_types[ty]['bw'] + self.val=claim_types[ty]['value'] + self.dam=claim_types[ty]['damage'] + self.dur=claim_types[ty]['duration'] + self.init_time=time + self.end_time=time+self.dur + +class Sim: + def __init__(self,bw): + self.queue=[] + self.bw=bw + self.free=bw + self.budget=(-1)*PPP*self.bw + + def step(self, lista): + self.budget-=sum([self.queue[i].dam for i in range(len(self.queue)) if lista[i]==0]) + self.queue = [self.queue[i] for i in range(len(self.queue)) if lista[i]==1] + + def new(self, item): + if item.bw<=self.free: + self.queue.append(item) + + def process(self,time): + for i in range(len(self.queue)-1,-1,-1): + if self.queue[i].end_time<=time: + self.budget+=self.queue[i].val + del self.queue[i] + self.free=self.bw + for item in self.queue: + self.free-=item.bw + + def get_queue_list(self,time): + lista=[] + for item in self.queue: + lista.append([item.ty,item.end_time-time]) + return lista + +results={} +folder='Strats' + +sys.path.append(folder) +strats=os.listdir(folder) +strats_py=[x.split('.')[0] for x in strats if x.split('.')[-1]=="py"] +#strats_py=['tut_mymy'] + +for _ in range(10): + events=eg.event_gen(2000) + """ + os.system('python event_gen.py >event1.txt') + with open('event1.txt') as inf: + for line in inf: + a=line.split() + # print a + if a: + events.append([int(a[0]),a[1]]) + + #print events + """ + for strat in strats_py: + mod=importlib.import_module(strat) + sim=Sim(max(0,mod.init_bw())) + for e in events: + [time,claim]=e + sim.process(time) + [new,lista]=mod.decision(claim, sim.get_queue_list(time)) + sim.step(lista) + if new==1: + sim.new(Claim(claim,time)) + sim.process(time+1000) + if not strat in results: + results[strat]=0 + results[strat]+=sim.budget +for key in results: + results[key]/=10.0 +print results +""" +strat=strats[0] +mod=importlib.import_module(strat) +for _ in range(10): + print mod.decision(1,[3,3]) +""" diff --git a/sim_p3.py b/sim_p3.py new file mode 100644 index 0000000..99dcb20 --- /dev/null +++ b/sim_p3.py @@ -0,0 +1,95 @@ +import os +import numpy as np +import numpy.random as rnd +import sys +import importlib +#import imp +import ctypes +import ctypes.util +from numpy.ctypeslib import ndpointer +import event_gen as eg + +PPP=60 +claim_types={'bronze':{'bw': 1, 'value': 2, 'damage':4, 'duration': 100, 'pr': 0.4}, + 'silver': {'bw': 3, 'value': 5, 'damage':6, 'duration': 50, 'pr': 0.3}, + 'gold':{'bw': 10, 'value': 30, 'damage':80, 'duration': 70, 'pr': 0.1}} + + +class Claim: + def __init__(self,ty,time): + self.ty = ty + self.bw=claim_types[ty]['bw'] + self.val=claim_types[ty]['value'] + self.dam=claim_types[ty]['damage'] + self.dur=claim_types[ty]['duration'] + self.init_time=time + self.end_time=time+self.dur + +class Sim: + def __init__(self,bw): + self.queue=[] + self.bw=bw + self.free=bw + self.budget=(-1)*PPP*self.bw + + def step(self, lista): + self.budget-=sum([self.queue[i].dam for i in range(len(self.queue)) if lista[i]==0]) + self.queue = [self.queue[i] for i in range(len(self.queue)) if lista[i]==1] + + def new(self, item): + if item.bw<=self.free: + self.queue.append(item) + + def process(self,time): + for i in range(len(self.queue)-1,-1,-1): + if self.queue[i].end_time<=time: + self.budget+=self.queue[i].val + del self.queue[i] + self.free=self.bw + for item in self.queue: + self.free-=item.bw + + def get_queue_list(self,time): + lista=[] + for item in self.queue: + lista.append([item.ty,item.end_time-time]) + return lista + +results={} +folder='Strats' + +sys.path.append(folder) +strats=os.listdir(folder) +strats_py=[x.split('.')[0] for x in strats if x.split('.')[-1]=="py"] +#strats_py=['tut_mymy'] + +for _ in range(10): + events=eg.event_gen(2000) + """ + os.system('python event_gen.py >event1.txt') + with open('event1.txt') as inf: + for line in inf: + a=line.split() + # print a + if a: + events.append([int(a[0]),a[1]]) + + #print events + """ + for strat in strats_py: + mod=importlib.import_module(strat) + sim=Sim(max(0,mod.init_bw())) + for e in events: + [time,claim]=e + sim.process(time) + [new,lista]=mod.decision(claim, sim.get_queue_list(time)) + sim.step(lista) + if new==1: + sim.new(Claim(claim,time)) + sim.process(time+1000) + if not strat in results: + results[strat]=0 + results[strat]+=sim.budget +for key in results: + results[key]/=10.0 +print(results)