VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.036USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.629SP
└── Incoming DelegationsDeleg
+4.378SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.629SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.378SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "1023.435296 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7120.224510 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | n1try |
| id | 649050 |
| rank | 287,129 |
| reputation | 0 |
| created | 2018-01-23T20:55:54 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-01-23T21:05:54 |
| last_root_post | 2018-01-23T21:05:54 |
| last_vote_time | 1970-01-01T00:00:00 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1023.435296 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7120.224510 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 1970-01-01T00:00:00 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"id": 649050,
"name": "n1try",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8PSsVWNxLLziP82axDX2LMXiUYisirf6q4REMxhnVNAZ7YKGPS",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM5aFuPECHN9MChTgSjz4Z4UvKEEuDu8ZmkGTQLiMWmGkBkx3UDS",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6hZWaNxoYsqMrCrWDCk3123jvfb4L769Q7JNNaAuqtBBZkdEy6",
1
]
]
},
"memo_key": "STM7iap7HpfvtsWKEGQnDDpnwJPRQEwWxhEW3P5xVjQXUiz6eYVxL",
"json_metadata": "",
"posting_json_metadata": "",
"proxy": "",
"last_owner_update": "1970-01-01T00:00:00",
"last_account_update": "1970-01-01T00:00:00",
"created": "2018-01-23T20:55:54",
"mined": false,
"recovery_account": "steem",
"last_account_recovery": "1970-01-01T00:00:00",
"reset_account": "null",
"comment_count": 0,
"lifetime_vote_count": 0,
"post_count": 2,
"can_vote": true,
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779077682
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779077682
},
"voting_power": 0,
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"sbd_balance": "0.000 SBD",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"vesting_shares": "1023.435296 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7120.224510 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"withdrawn": 0,
"to_withdraw": 0,
"withdraw_routes": 0,
"curation_rewards": 0,
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"witnesses_voted_for": 0,
"last_post": "2018-01-23T21:05:54",
"last_root_post": "2018-01-23T21:05:54",
"last_vote_time": "1970-01-01T00:00:00",
"post_bandwidth": 0,
"pending_claimed_accounts": 0,
"vesting_balance": "0.000 STEEM",
"reputation": 0,
"transfer_history": [],
"market_history": [],
"post_history": [],
"vote_history": [],
"other_history": [],
"witness_votes": [],
"tags_usage": [],
"guest_bloggers": [],
"rank": 287129
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/18 04:14:42
2026/05/18 04:14:42
| delegator | steem |
| delegatee | n1try |
| vesting shares | 7120.224510 VESTS |
| Transaction Info | Block #106148215/Trx 5ca9ee49f10a6c9297b6a50890d1dbf3ed0ceb0c |
View Raw JSON Data
{
"trx_id": "5ca9ee49f10a6c9297b6a50890d1dbf3ed0ceb0c",
"block": 106148215,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2026-05-18T04:14:42",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "7120.224510 VESTS"
}
]
}2026/05/12 20:01:03
2026/05/12 20:01:03
| delegator | steem |
| delegatee | n1try |
| vesting shares | 4408.014105 VESTS |
| Transaction Info | Block #105995081/Trx 9d0e30c540697fc71fc7665ebd9e05d25010e1b7 |
View Raw JSON Data
{
"trx_id": "9d0e30c540697fc71fc7665ebd9e05d25010e1b7",
"block": 105995081,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2026-05-12T20:01:03",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "4408.014105 VESTS"
}
]
}2026/04/26 03:29:21
2026/04/26 03:29:21
| delegator | steem |
| delegatee | n1try |
| vesting shares | 7132.740266 VESTS |
| Transaction Info | Block #105515754/Trx 05598a83ec071fa7dbcd670d11fdc65ffd39f200 |
View Raw JSON Data
{
"trx_id": "05598a83ec071fa7dbcd670d11fdc65ffd39f200",
"block": 105515754,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2026-04-26T03:29:21",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "7132.740266 VESTS"
}
]
}2026/01/23 18:30:42
2026/01/23 18:30:42
| delegator | steem |
| delegatee | n1try |
| vesting shares | 4449.560924 VESTS |
| Transaction Info | Block #102864643/Trx 7bd03c2f8a176fa957ce3959b99d565b3b774d17 |
View Raw JSON Data
{
"trx_id": "7bd03c2f8a176fa957ce3959b99d565b3b774d17",
"block": 102864643,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2026-01-23T18:30:42",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "4449.560924 VESTS"
}
]
}2024/12/17 13:42:39
2024/12/17 13:42:39
| delegator | steem |
| delegatee | n1try |
| vesting shares | 4613.780121 VESTS |
| Transaction Info | Block #91310894/Trx 8280125be5a5f88696d0af62ef7df4404a95574d |
View Raw JSON Data
{
"trx_id": "8280125be5a5f88696d0af62ef7df4404a95574d",
"block": 91310894,
"trx_in_block": 4,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2024-12-17T13:42:39",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "4613.780121 VESTS"
}
]
}2023/11/14 05:24:24
2023/11/14 05:24:24
| delegator | steem |
| delegatee | n1try |
| vesting shares | 4782.913653 VESTS |
| Transaction Info | Block #79865066/Trx e585a296a683189b77e87a20b5a6be6c5614aa62 |
View Raw JSON Data
{
"trx_id": "e585a296a683189b77e87a20b5a6be6c5614aa62",
"block": 79865066,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2023-11-14T05:24:24",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "4782.913653 VESTS"
}
]
}2023/09/22 07:57:45
2023/09/22 07:57:45
| delegator | steem |
| delegatee | n1try |
| vesting shares | 7719.822439 VESTS |
| Transaction Info | Block #78359961/Trx 21db66036931d57b788a50a65dcaa40e1b683402 |
View Raw JSON Data
{
"trx_id": "21db66036931d57b788a50a65dcaa40e1b683402",
"block": 78359961,
"trx_in_block": 3,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2023-09-22T07:57:45",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "7719.822439 VESTS"
}
]
}2022/11/03 15:45:00
2022/11/03 15:45:00
| delegator | steem |
| delegatee | n1try |
| vesting shares | 7941.873877 VESTS |
| Transaction Info | Block #69118093/Trx a6fe854ec6696c18dac1af8cc99364d0fbe23e46 |
View Raw JSON Data
{
"trx_id": "a6fe854ec6696c18dac1af8cc99364d0fbe23e46",
"block": 69118093,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2022-11-03T15:45:00",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "7941.873877 VESTS"
}
]
}2022/01/17 21:08:48
2022/01/17 21:08:48
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8161.981478 VESTS |
| Transaction Info | Block #60821580/Trx 4ba8f1900c513eeb0d1dcea6d74feecd6fbbb021 |
View Raw JSON Data
{
"trx_id": "4ba8f1900c513eeb0d1dcea6d74feecd6fbbb021",
"block": 60821580,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2022-01-17T21:08:48",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8161.981478 VESTS"
}
]
}2021/06/14 04:25:00
2021/06/14 04:25:00
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8346.175766 VESTS |
| Transaction Info | Block #54612019/Trx 2495418433f32f7fb1e1d6bb75acc87d4e08693c |
View Raw JSON Data
{
"trx_id": "2495418433f32f7fb1e1d6bb75acc87d4e08693c",
"block": 54612019,
"trx_in_block": 10,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2021-06-14T04:25:00",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8346.175766 VESTS"
}
]
}2020/12/11 14:39:18
2020/12/11 14:39:18
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8533.597740 VESTS |
| Transaction Info | Block #49359339/Trx 9738d500131f9cbdac8a00897355513e8237ce1b |
View Raw JSON Data
{
"trx_id": "9738d500131f9cbdac8a00897355513e8237ce1b",
"block": 49359339,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-12-11T14:39:18",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8533.597740 VESTS"
}
]
}2020/12/06 08:15:36
2020/12/06 08:15:36
| delegator | steem |
| delegatee | n1try |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49210879/Trx d87be6d4373d012bc278d044ebdc1e3df470e575 |
View Raw JSON Data
{
"trx_id": "d87be6d4373d012bc278d044ebdc1e3df470e575",
"block": 49210879,
"trx_in_block": 1,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-12-06T08:15:36",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "1912.543513 VESTS"
}
]
}2020/12/05 18:16:54
2020/12/05 18:16:54
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8539.805594 VESTS |
| Transaction Info | Block #49194424/Trx 8bafeee2d41a60e9141b3feee1ed71dc8f0cf8cf |
View Raw JSON Data
{
"trx_id": "8bafeee2d41a60e9141b3feee1ed71dc8f0cf8cf",
"block": 49194424,
"trx_in_block": 6,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-12-05T18:16:54",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8539.805594 VESTS"
}
]
}2020/11/02 22:54:48
2020/11/02 22:54:48
| delegator | steem |
| delegatee | n1try |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48266370/Trx 71322e8162f534d6c977c51cd1ed3b7d86747571 |
View Raw JSON Data
{
"trx_id": "71322e8162f534d6c977c51cd1ed3b7d86747571",
"block": 48266370,
"trx_in_block": 2,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-11-02T22:54:48",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "1920.017158 VESTS"
}
]
}2020/05/09 09:16:33
2020/05/09 09:16:33
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8742.610953 VESTS |
| Transaction Info | Block #43221177/Trx 6b2cf32ea6eaeb148838f246070db09c84fe2c17 |
View Raw JSON Data
{
"trx_id": "6b2cf32ea6eaeb148838f246070db09c84fe2c17",
"block": 43221177,
"trx_in_block": 10,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-05-09T09:16:33",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8742.610953 VESTS"
}
]
}2020/05/08 13:24:36
2020/05/08 13:24:36
| delegator | steem |
| delegatee | n1try |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43197901/Trx ffe79ee69663f05d24dff51c270654028b44e437 |
View Raw JSON Data
{
"trx_id": "ffe79ee69663f05d24dff51c270654028b44e437",
"block": 43197901,
"trx_in_block": 10,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-05-08T13:24:36",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "1953.311140 VESTS"
}
]
}2020/04/16 02:08:39
2020/04/16 02:08:39
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8755.498401 VESTS |
| Transaction Info | Block #42567815/Trx 08a74d489a43ca6be61863ec253f4084f8539b42 |
View Raw JSON Data
{
"trx_id": "08a74d489a43ca6be61863ec253f4084f8539b42",
"block": 42567815,
"trx_in_block": 8,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-04-16T02:08:39",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8755.498401 VESTS"
}
]
}2020/01/24 00:22:51
2020/01/24 00:22:51
| parent author | n1try |
| parent permlink | halite-a-rule-based-ai-bot |
| author | steemitboard |
| permlink | steemitboard-notify-n1try-20200124t002250000z |
| title | |
| body | Congratulations @n1try! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@n1try/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@n1try) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=n1try)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| Transaction Info | Block #40193910/Trx 25f29acc57503e97d6c0eda7145e53dd9c97ed68 |
View Raw JSON Data
{
"trx_id": "25f29acc57503e97d6c0eda7145e53dd9c97ed68",
"block": 40193910,
"trx_in_block": 17,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2020-01-24T00:22:51",
"op": [
"comment",
{
"parent_author": "n1try",
"parent_permlink": "halite-a-rule-based-ai-bot",
"author": "steemitboard",
"permlink": "steemitboard-notify-n1try-20200124t002250000z",
"title": "",
"body": "Congratulations @n1try! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@n1try/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@n1try) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=n1try)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
}
]
}2019/05/12 19:15:06
2019/05/12 19:15:06
| delegator | steem |
| delegatee | n1try |
| vesting shares | 8951.115214 VESTS |
| Transaction Info | Block #32850703/Trx be2dd5ddd46bb0668369670b5330618507eb0f1e |
View Raw JSON Data
{
"trx_id": "be2dd5ddd46bb0668369670b5330618507eb0f1e",
"block": 32850703,
"trx_in_block": 53,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2019-05-12T19:15:06",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "8951.115214 VESTS"
}
]
}2019/01/24 00:07:54
2019/01/24 00:07:54
| parent author | n1try |
| parent permlink | halite-a-rule-based-ai-bot |
| author | steemitboard |
| permlink | steemitboard-notify-n1try-20190124t000753000z |
| title | |
| body | Congratulations @n1try! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@n1try/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@n1try)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| Transaction Info | Block #29721103/Trx 60d2a03625cbc92cbfc2fe970eb6f5e4dc0dd922 |
View Raw JSON Data
{
"trx_id": "60d2a03625cbc92cbfc2fe970eb6f5e4dc0dd922",
"block": 29721103,
"trx_in_block": 4,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2019-01-24T00:07:54",
"op": [
"comment",
{
"parent_author": "n1try",
"parent_permlink": "halite-a-rule-based-ai-bot",
"author": "steemitboard",
"permlink": "steemitboard-notify-n1try-20190124t000753000z",
"title": "",
"body": "Congratulations @n1try! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@n1try/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@n1try)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
}
]
}2018/05/16 23:14:09
2018/05/16 23:14:09
| delegator | steem |
| delegatee | n1try |
| vesting shares | 9150.726082 VESTS |
| Transaction Info | Block #22493384/Trx b8a2141699fd57ebe1c5caf39eee875a28252a93 |
View Raw JSON Data
{
"trx_id": "b8a2141699fd57ebe1c5caf39eee875a28252a93",
"block": 22493384,
"trx_in_block": 6,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-05-16T23:14:09",
"op": [
"delegate_vesting_shares",
{
"delegator": "steem",
"delegatee": "n1try",
"vesting_shares": "9150.726082 VESTS"
}
]
}kgwupvoted (100.00%) @n1try / halite-a-rule-based-ai-bot2018/05/08 22:19:42
kgwupvoted (100.00%) @n1try / halite-a-rule-based-ai-bot
2018/05/08 22:19:42
| voter | kgw |
| author | n1try |
| permlink | halite-a-rule-based-ai-bot |
| weight | 10000 (100.00%) |
| Transaction Info | Block #22261922/Trx 38bc4926bd2506fb7e5d03c0db5f4eeb40ba4617 |
View Raw JSON Data
{
"trx_id": "38bc4926bd2506fb7e5d03c0db5f4eeb40ba4617",
"block": 22261922,
"trx_in_block": 20,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-05-08T22:19:42",
"op": [
"vote",
{
"voter": "kgw",
"author": "n1try",
"permlink": "halite-a-rule-based-ai-bot",
"weight": 10000
}
]
}n1trypublished a new post: halite-a-rule-based-ai-bot2018/01/23 21:05:54
n1trypublished a new post: halite-a-rule-based-ai-bot
2018/01/23 21:05:54
| parent author | |
| parent permlink | technology |
| author | n1try |
| permlink | halite-a-rule-based-ai-bot |
| title | Halite - A rule-based AI bot |
| body | After having spent a considerable amount of time with it last weekend, I wanted to make a short comment on [Halite.io](https://halite.io). Halite is a programming- and AI competition where people can write programs or train algorithms to control a bot that plays in a virtual 2D game environment. There is a leaderboard to track how your bot competes with other players' bots and you can watch a replay of every game your bot has played, which helps _debugging_ your bot as well as figuring out other people's strategies. Originally, I got aware of this challenge through a video by [one of my favorite](https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ) YouTube channels and became slightly addicted from that moment on. ## The Game  While the complete rule set of Halite can be viewed in [their documentation](https://halite.io/learn-programming-challenge/), I only want to explain very basics here. In Halite you play in a space scenario comprising _ships_ and _planets_, while you (= your bot) controls your ships. A ship can do three actions: _move_, _dock_ to or _undock_ from a planet. The more ships you have docked at a planet, the faster you are _mining_ the planet, which means to produce new ships. When two ships get close enough, they can fight and only the winner's ship survives. The game is turn-based, so each of the up to four players' programs are queried (by the game environment) for a list of moves for each of their ships in every turn. Input is the current game state (player- & planet positions, ships' health, ships' current status, ...) and output is a move for each ship. The final goal is to either completely dominate (= destroy every other players' ships) or own the strongest ship fleet and the most planets after 300 turns. At the time of writing this article, the leaderboard comprises __~ 4700 players__ from __98 countries__. Most of them are either university students or professionals, who have, in total, played __10.9 million__ games. More interesting statistics can be found at the [stats](http://stats.halite.io:3000/public/dashboard/545ebc3c-4cdb-4940-acf1-e4d1332defac) page. ## My bot First of all, what I found especially cool is the fact that players are completely free in their choice of how to realize their bot (hard-coding, machine learning, ...) and what programming language to use. Halite offers community-created starter templates for C++, C#, Dart, Elixir, Go, Haskell, JavaScript, Julia, Kotlin, PHP, Ruby, Rust, Scala, Swift and more. You can choose whatever language you like - which was __Java__ for me - and eventually submit a ZIP file with your code or binary, as well as a script for executing it, to their website. The interface between your program and the game environment is _stdin_ / _stdout_.  I decided to build my bot based on rather simple rules first, which I figured out by watching some other players' replays. Probably applying machine learning to solve Halite would be even more challenging, but at the time I got aware of this competition, it was about to last only three more weeks (until January, 22nd), so I picked up on a rather simple approach. ## Strategies I developed three different strategies for playing Halite, while my bot could dynamically switch between them during the game. The first one is called the __BalancedStrategy__. It's a fair mixture of conquering new planets, raising ship production and destroying enemy ships. In this strategy, a ship's most preferable goal is to take empty planets. However, if the next empty planet is unavailable ot too far away, it may also dock at a planet my bot already owns in order to increase production. However, no more than three of my own ships will ever dock at the same planet. If both the next empty planet as well as the next own planet are unavailable or too far away, the ship starts chasing the nearest enemy ship. In addition to this compromise-like strategy, I found that more extreme ones can be successful, too. For instance, in a 1 vs. 1 match, my opponents usually won because they almost instantly destroyed all of my ships in the very beginning. So I decided to further introduce the __AggressiveStrategy__, which is only applied in matched of two players. Following this strategy, all of my three initial ships immediately start chasing the enemy's three ships. If they're successful, the game is usually over after only a few turns. Finally I built the __MiningStrategy__. Goal is to maxmimize mining rate right in the beginning. My three ships are immediately docking at the nearest and largest (in terms of how many ships can dock at it) free planet and dock at it. New ships will dock at the same planet until it's full. Doing so, I can quickly produce new ships which then, after the first planet is full, switch over to applying the __BalancedStrategy__. ## Results Using the bot described above, the best rank I achieved in the leaderboard was __250 of ~ 4500__ (top 6 %) and I'm still ambitious to get even better 😃. My bot is playing as [n1try](https://halite.io/user/?user_id=7481). \>> [Source code on GitHub](https://github.com/n1try/halite-bot-java). |
| json metadata | {"tags":["technology","ai","machine-learning"],"image":["https://ferdinand-muetsch.de/images/halite_game.png","https://ferdinand-muetsch.de/images/halite_langs.png"],"links":["https://halite.io","https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ","https://halite.io/learn-programming-challenge/","http://stats.halite.io:3000/public/dashboard/545ebc3c-4cdb-4940-acf1-e4d1332defac","https://halite.io/user/?user_id=7481","https://github.com/n1try/halite-bot-java"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #19239854/Trx ac17a143c7fec335fbb36d5c1566ec64be820fe9 |
View Raw JSON Data
{
"trx_id": "ac17a143c7fec335fbb36d5c1566ec64be820fe9",
"block": 19239854,
"trx_in_block": 36,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-01-23T21:05:54",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "technology",
"author": "n1try",
"permlink": "halite-a-rule-based-ai-bot",
"title": "Halite - A rule-based AI bot",
"body": "After having spent a considerable amount of time with it last weekend, I wanted to make a short comment on [Halite.io](https://halite.io). Halite is a programming- and AI competition where people can write programs or train algorithms to control a bot that plays in a virtual 2D game environment. There is a leaderboard to track how your bot competes with other players' bots and you can watch a replay of every game your bot has played, which helps _debugging_ your bot as well as figuring out other people's strategies. Originally, I got aware of this challenge through a video by [one of my favorite](https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ) YouTube channels and became slightly addicted from that moment on. \n\n## The Game\n\n\nWhile the complete rule set of Halite can be viewed in [their documentation](https://halite.io/learn-programming-challenge/), I only want to explain very basics here. In Halite you play in a space scenario comprising _ships_ and _planets_, while you (= your bot) controls your ships. A ship can do three actions: _move_, _dock_ to or _undock_ from a planet. The more ships you have docked at a planet, the faster you are _mining_ the planet, which means to produce new ships. When two ships get close enough, they can fight and only the winner's ship survives. The game is turn-based, so each of the up to four players' programs are queried (by the game environment) for a list of moves for each of their ships in every turn. Input is the current game state (player- & planet positions, ships' health, ships' current status, ...) and output is a move for each ship. The final goal is to either completely dominate (= destroy every other players' ships) or own the strongest ship fleet and the most planets after 300 turns. \n\nAt the time of writing this article, the leaderboard comprises __~ 4700 players__ from __98 countries__. Most of them are either university students or professionals, who have, in total, played __10.9 million__ games. More interesting statistics can be found at the [stats](http://stats.halite.io:3000/public/dashboard/545ebc3c-4cdb-4940-acf1-e4d1332defac) page. \n\n## My bot\nFirst of all, what I found especially cool is the fact that players are completely free in their choice of how to realize their bot (hard-coding, machine learning, ...) and what programming language to use. Halite offers community-created starter templates for C++, C#, Dart, Elixir, Go, Haskell, JavaScript, Julia, Kotlin, PHP, Ruby, Rust, Scala, Swift and more. You can choose whatever language you like - which was __Java__ for me - and eventually submit a ZIP file with your code or binary, as well as a script for executing it, to their website. The interface between your program and the game environment is _stdin_ / _stdout_. \n\n\n\nI decided to build my bot based on rather simple rules first, which I figured out by watching some other players' replays. Probably applying machine learning to solve Halite would be even more challenging, but at the time I got aware of this competition, it was about to last only three more weeks (until January, 22nd), so I picked up on a rather simple approach.\n\n## Strategies\nI developed three different strategies for playing Halite, while my bot could dynamically switch between them during the game. The first one is called the __BalancedStrategy__. It's a fair mixture of conquering new planets, raising ship production and destroying enemy ships. In this strategy, a ship's most preferable goal is to take empty planets. However, if the next empty planet is unavailable ot too far away, it may also dock at a planet my bot already owns in order to increase production. However, no more than three of my own ships will ever dock at the same planet. If both the next empty planet as well as the next own planet are unavailable or too far away, the ship starts chasing the nearest enemy ship. \n\nIn addition to this compromise-like strategy, I found that more extreme ones can be successful, too. For instance, in a 1 vs. 1 match, my opponents usually won because they almost instantly destroyed all of my ships in the very beginning. So I decided to further introduce the __AggressiveStrategy__, which is only applied in matched of two players. Following this strategy, all of my three initial ships immediately start chasing the enemy's three ships. If they're successful, the game is usually over after only a few turns. \n\nFinally I built the __MiningStrategy__. Goal is to maxmimize mining rate right in the beginning. My three ships are immediately docking at the nearest and largest (in terms of how many ships can dock at it) free planet and dock at it. New ships will dock at the same planet until it's full. Doing so, I can quickly produce new ships which then, after the first planet is full, switch over to applying the __BalancedStrategy__. \n\n## Results\nUsing the bot described above, the best rank I achieved in the leaderboard was __250 of ~ 4500__ (top 6 %) and I'm still ambitious to get even better 😃. My bot is playing as [n1try](https://halite.io/user/?user_id=7481).\n\n\\>> [Source code on GitHub](https://github.com/n1try/halite-bot-java).",
"json_metadata": "{\"tags\":[\"technology\",\"ai\",\"machine-learning\"],\"image\":[\"https://ferdinand-muetsch.de/images/halite_game.png\",\"https://ferdinand-muetsch.de/images/halite_langs.png\"],\"links\":[\"https://halite.io\",\"https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ\",\"https://halite.io/learn-programming-challenge/\",\"http://stats.halite.io:3000/public/dashboard/545ebc3c-4cdb-4940-acf1-e4d1332defac\",\"https://halite.io/user/?user_id=7481\",\"https://github.com/n1try/halite-bot-java\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}n1trypublished a new post: cartpole-with-q-learning-first-experiences-with-openai-gym2018/01/23 21:00:06
n1trypublished a new post: cartpole-with-q-learning-first-experiences-with-openai-gym
2018/01/23 21:00:06
| parent author | |
| parent permlink | machine-learning |
| author | n1try |
| permlink | cartpole-with-q-learning-first-experiences-with-openai-gym |
| title | CartPole with Q-Learning — First experiences with OpenAI Gym |
| body | ## OpenAI Gym Today I made my first experiences with the [OpenAI gym](https://gym.openai.com), more specifically with the [CartPole](https://gym.openai.com/envs/CartPole-v0) environment. Gym is basically a Python library that includes several machine learning challenges, in which an autonomous agent should be learned to fulfill different tasks, e.g. to master a simple game itself. One of the simplest and most popular challenges is CartPole. It's basically a 2D game in which the agent has to control, i.e. move left or right, a cart to balance a pole standing perpendicularly on the cart. This is a classical reinforcement learning problem, e.g. a scenario, in which the agents starts by trying random actions as a consequence to which it gets rewarded (or not). Based on the rewards, it continuously "learns", which action is good in which specific situation. Doing so, it learns how to master the game without ever being told how the game even works. The main advantage of this type of learning is, that it's completely generic and not bound to a specific problem. E.g. to learn a chess agent, you don't need to "tell" it the rules of chess, but just let it do trial & error, whereas "error" means giving it a negative (or small positive) reward. ## CartPole-v0 In machine learning terms, CartPole is basically a binary classification problem. There are four features as inputs, which include the cart position, its velocity, the pole's angle to the cart and its derivative (i.e. how fast the pole is "falling"). The output is binary, i.e. either 0 or 1, corresponding to "left" or "right". One challenge is the fact that all four features are continuous values (floating point numbers), which, naively, implies an infinitely large feature space.  ## Approach: Basic Q-Learning In the [Machine Learning 1](https://his.anthropomatik.kit.edu/english/28_315.php) course at my university, I got to know one of the most basic, yet widely-used reinforcement learning approaches, which is [Q-Learning](http://mnemstudio.org/path-finding-q-learning-tutorial.htm). The core of Q-Learning is to estimate a value for every possible pare of a state (s) and an action (a) by getting rewarded. Imagine the following graph, which consists of three states, while your agent is currently in _s0_. It can choose between two actions, one of which results in a good state _s1_ (e.g. having won the game), the other one results in a bad state _s2_ (e.g. having lost the game). Accordingly, the transition leading to the good (bad) state gives a reward of 100 (-100). If the agent performs action _a0_, the q-value of _s0_ will probably become negative (Q(s0, a0) < 0)), while Q(s0, a1) > 0.  The update of the q-value is done according to the following equation.  Basically, a (S, A)-tuple's new q-value depends on its old q-value, the immediate reward received for the action and the maximum q-value achievable in the following state. So a (S, A)-pair's q-value indirectly depends on all its successors' q-values, which is expressed in the recursive function definition. By repeatedly walking through all nodes and transistions, the agent can update any (S, A)-pairs q-value, while the results of good and bad actions are slowly "backpropagated" from terminal nodes to early nodes. The agent ends up with a (usually multidimensional) table mapping states and actions to q-values, so that given any state, the best action can be picked by choosing the highest respective q-value. ## My implementation Since Q-Learning is pretty straightforward to understand and implement, I decided on picking that algorithm as a starting point for my CartPole challenge. I looked for other solutions, that also use CartPole and found [this blog post](https://medium.com/@tuzzer/cart-pole-balancing-with-q-learning-b54c6068d947) by [@tuzzer](https://medium.com/@tuzzer), which had partially inspired me during my implementation. [>> Code on GitHub (qcartpole.py)](https://gist.github.com/n1try/af0b8476ae4106ec098fea1dfe57f578) ### Transforming the feature space Actually the main challenge was to convert the continuous, 4-dimensional input space to a discrete space with a finite and preferably small, yet expressive, number of discrete states. The less states we have, the smaller the Q-table will be, the less steps the agent will need to properly learn its values. However, too few states might not hold enough information to properly represent the environment. The original domains of the input features are these. * __x__ (cart position) ∈ [-4.8, 4.8] * __x'__ (cart velocity) ∈ [-3.4 * 10^38, 3.4 * 10^38] * __theta__ (angle) ∈ [-0.42, 0.42] * __theta'__ (angle velocity) ∈ [-3.4 * 10^38, 3.4 * 10^38] ### Finding the parameters As can be seen, especially the velocities' domains are extermely large. However, from [@tuzzer](https://medium.com/@tuzzer)'s post I found that astonishingly small target intervals are sufficient. Therefore, I initially started by scaling __theta__ down to a discrete interval `theta ∈ [0, 6] ⊂ ℕ ` (which is, to be precise, just a set of integers {0..6}) and __theta'__ to `theta' ∈ [0, 12] ⊂ ℕ `. Inspired by [@tuzzer](https://medium.com/@tuzzer/)'s post, I dropped the __x__ and __x'__ features completely, which corresponds to mapping any of their values to a single scalar. The motivation behind this is that the probability of the cart leaving the environment at the left or right border in only 200 time steps (after 200 steps, the environment automatically resets itself) is pretty slow and the resulting reduction in dimensionality more worthy. The implementation of the actual Q-Learning algorithm is straightfoward and consits of a function to fetch the best action for a state from the q-table and another function to update the q-table based on the last action. Nothing special here. More interesing are the algorithm's hyperparameters, which include __alpha (= learning rate)__, __epsilon (= exploration rate)__ and __gamma (= discount factor)__. Alpha is used to "smooth" the updates and make them less radical, which, in the first place, prevents from errors caused by noise. Epsilon regulates between __exploitation and exploration__. Accordingly, instead of picking the _best_ action in a state, with a chance of ε a _random_ action is picked. This should prevent the algorithm from getting stuck in local minima. E.g. if a bad choice was made in the beginning, without ε the agent would continue on evaluating that suboptimal path and would never discover any other, potentially better, path. Gamma is used to penalize the agent if it takes long to reach its goal. However, in this case, gamma is set to constant 1 (no discount), since it's even our goal to "survive" as long as possible. First I tried to choose the epsilon and alpha parameters as constants and experimented with various combinations. However, I always achieved only a very poor score (~ between 20 and 50 ticks). Then, again inspired by [@tuzzer](https://medium.com/@tuzzer/) I decided to introduce an adaptive learning- and exploration rate, which starts with a high value and decreases by time (with each training episode). Astonishingly, this made a huge difference. Suddenly, my algorithm converged in about ~ 200 steps. Since I never thought that these hyperparameters made such an extreme difference (from not solving the challenge at all to doing pretty well), this was probably the most interesting finding from my CartPole project. I simply adpoted [@tuzzer](https://medium.com/@tuzzer/)'s adaptive function, which is visualized in the figure below (the minimum of _0.1_ is a hyperparameter to be optimized).  ### Grid search As my Q-Learning implementation with adaptive learning- and exploration rates was finished, I implemented an additional grid search to do some hyperparameter tuning. Goal was to find the optimal combination of feature interval lengths and lower bounds for alpha and epsilon. The following parameters turned out to perform best: `'buckets': (1, 1, 6, 12), 'min_alpha': 0.1, 'min_epsilon': 0.1`. Additionally, I also could have evaluated different functions for calculating the adaptive rate, but I haven't, yet. [>> Code on GitHub (qcartpole_gridsearch.py)](https://gist.github.com/n1try/87b442fce7f7d58606f462191c6d6033) ## Result & Future Work My final score was __188__, [as can be seen in the leaderboard](https://gym.openai.com/evaluations/eval_emRbuGdHRnWoJuMUnPwd1Q). As I progress with my knowledge on machine learning, while practicing for the upcoming [Machine Learning 2](http://www.aifb.kit.edu/web/Lehre/Vorlesung_Maschinelles_Lernen_2_%E2%80%93_Fortgeschrittene_Verfahren/en) exam, I want to continue improving my CartPole algorithm. Probably the next step will be to incorporate deep Q-Learning, which basically is Q-Learning with the only difference that the q-values are estimated by a deep neural net. The main (and probably only) advantage is the ability to handle way larger feature spaces. I'll keep you guys up-to-date. I hope that I could encourage you to get started with Gym, or machine learning in general, too! |
| json metadata | {"tags":["machine-learning","ai","technology"],"image":["https://ferdinand-muetsch.de/images/cartpole1.jpg","https://ferdinand-muetsch.de/images/cartpole2.png","https://ferdinand-muetsch.de/images/cartpole3.png","https://ferdinand-muetsch.de/images/cartpole4.png"],"links":["https://gym.openai.com","https://gym.openai.com/envs/CartPole-v0","https://his.anthropomatik.kit.edu/english/28_315.php","http://mnemstudio.org/path-finding-q-learning-tutorial.htm","https://medium.com/@tuzzer/cart-pole-balancing-with-q-learning-b54c6068d947","https://medium.com/@tuzzer","https://gist.github.com/n1try/af0b8476ae4106ec098fea1dfe57f578","https://medium.com/@tuzzer/","https://gist.github.com/n1try/87b442fce7f7d58606f462191c6d6033","https://gym.openai.com/evaluations/eval_emRbuGdHRnWoJuMUnPwd1Q","http://www.aifb.kit.edu/web/Lehre/Vorlesung_Maschinelles_Lernen_2_%E2%80%93_Fortgeschrittene_Verfahren/en"],"app":"steemit/0.1","format":"markdown"} |
| Transaction Info | Block #19239738/Trx 4b334d8b9b9b716bb10083922910511e774282db |
View Raw JSON Data
{
"trx_id": "4b334d8b9b9b716bb10083922910511e774282db",
"block": 19239738,
"trx_in_block": 35,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-01-23T21:00:06",
"op": [
"comment",
{
"parent_author": "",
"parent_permlink": "machine-learning",
"author": "n1try",
"permlink": "cartpole-with-q-learning-first-experiences-with-openai-gym",
"title": "CartPole with Q-Learning — First experiences with OpenAI Gym",
"body": "## OpenAI Gym\nToday I made my first experiences with the [OpenAI gym](https://gym.openai.com), more specifically with the [CartPole](https://gym.openai.com/envs/CartPole-v0) environment. Gym is basically a Python library that includes several machine learning challenges, in which an autonomous agent should be learned to fulfill different tasks, e.g. to master a simple game itself. One of the simplest and most popular challenges is CartPole. It's basically a 2D game in which the agent has to control, i.e. move left or right, a cart to balance a pole standing perpendicularly on the cart. This is a classical reinforcement learning problem, e.g. a scenario, in which the agents starts by trying random actions as a consequence to which it gets rewarded (or not). Based on the rewards, it continuously \"learns\", which action is good in which specific situation. Doing so, it learns how to master the game without ever being told how the game even works. The main advantage of this type of learning is, that it's completely generic and not bound to a specific problem. E.g. to learn a chess agent, you don't need to \"tell\" it the rules of chess, but just let it do trial & error, whereas \"error\" means giving it a negative (or small positive) reward.\n\n## CartPole-v0\nIn machine learning terms, CartPole is basically a binary classification problem. There are four features as inputs, which include the cart position, its velocity, the pole's angle to the cart and its derivative (i.e. how fast the pole is \"falling\"). The output is binary, i.e. either 0 or 1, corresponding to \"left\" or \"right\". One challenge is the fact that all four features are continuous values (floating point numbers), which, naively, implies an infinitely large feature space.\n\n\n\n## Approach: Basic Q-Learning\nIn the [Machine Learning 1](https://his.anthropomatik.kit.edu/english/28_315.php) course at my university, I got to know one of the most basic, yet widely-used reinforcement learning approaches, which is [Q-Learning](http://mnemstudio.org/path-finding-q-learning-tutorial.htm). The core of Q-Learning is to estimate a value for every possible pare of a state (s) and an action (a) by getting rewarded. Imagine the following graph, which consists of three states, while your agent is currently in _s0_. It can choose between two actions, one of which results in a good state _s1_ (e.g. having won the game), the other one results in a bad state _s2_ (e.g. having lost the game). Accordingly, the transition leading to the good (bad) state gives a reward of 100 (-100). If the agent performs action _a0_, the q-value of _s0_ will probably become negative (Q(s0, a0) < 0)), while Q(s0, a1) > 0.\n\n\n\nThe update of the q-value is done according to the following equation.\n\n\n\nBasically, a (S, A)-tuple's new q-value depends on its old q-value, the immediate reward received for the action and the maximum q-value achievable in the following state. So a (S, A)-pair's q-value indirectly depends on all its successors' q-values, which is expressed in the recursive function definition. By repeatedly walking through all nodes and transistions, the agent can update any (S, A)-pairs q-value, while the results of good and bad actions are slowly \"backpropagated\" from terminal nodes to early nodes. The agent ends up with a (usually multidimensional) table mapping states and actions to q-values, so that given any state, the best action can be picked by choosing the highest respective q-value.\n\n## My implementation\nSince Q-Learning is pretty straightforward to understand and implement, I decided on picking that algorithm as a starting point for my CartPole challenge. I looked for other solutions, that also use CartPole and found [this blog post](https://medium.com/@tuzzer/cart-pole-balancing-with-q-learning-b54c6068d947) by [@tuzzer](https://medium.com/@tuzzer), which had partially inspired me during my implementation. \n\n[>> Code on GitHub (qcartpole.py)](https://gist.github.com/n1try/af0b8476ae4106ec098fea1dfe57f578)\n\n### Transforming the feature space\nActually the main challenge was to convert the continuous, 4-dimensional input space to a discrete space with a finite and preferably small, yet expressive, number of discrete states. The less states we have, the smaller the Q-table will be, the less steps the agent will need to properly learn its values. However, too few states might not hold enough information to properly represent the environment. The original domains of the input features are these.\n\n* __x__ (cart position) ∈ [-4.8, 4.8]\n* __x'__ (cart velocity) ∈ [-3.4 * 10^38, 3.4 * 10^38]\n* __theta__ (angle) ∈ [-0.42, 0.42]\n* __theta'__ (angle velocity) ∈ [-3.4 * 10^38, 3.4 * 10^38]\n\n### Finding the parameters\nAs can be seen, especially the velocities' domains are extermely large. However, from [@tuzzer](https://medium.com/@tuzzer)'s post I found that astonishingly small target intervals are sufficient. Therefore, I initially started by scaling __theta__ down to a discrete interval `theta ∈ [0, 6] ⊂ ℕ ` (which is, to be precise, just a set of integers {0..6}) and __theta'__ to `theta' ∈ [0, 12] ⊂ ℕ `. Inspired by [@tuzzer](https://medium.com/@tuzzer/)'s post, I dropped the __x__ and __x'__ features completely, which corresponds to mapping any of their values to a single scalar. The motivation behind this is that the probability of the cart leaving the environment at the left or right border in only 200 time steps (after 200 steps, the environment automatically resets itself) is pretty slow and the resulting reduction in dimensionality more worthy. \n\nThe implementation of the actual Q-Learning algorithm is straightfoward and consits of a function to fetch the best action for a state from the q-table and another function to update the q-table based on the last action. Nothing special here.\n\nMore interesing are the algorithm's hyperparameters, which include __alpha (= learning rate)__, __epsilon (= exploration rate)__ and __gamma (= discount factor)__.\n\nAlpha is used to \"smooth\" the updates and make them less radical, which, in the first place, prevents from errors caused by noise. Epsilon regulates between __exploitation and exploration__. Accordingly, instead of picking the _best_ action in a state, with a chance of ε a _random_ action is picked. This should prevent the algorithm from getting stuck in local minima. E.g. if a bad choice was made in the beginning, without ε the agent would continue on evaluating that suboptimal path and would never discover any other, potentially better, path. Gamma is used to penalize the agent if it takes long to reach its goal. However, in this case, gamma is set to constant 1 (no discount), since it's even our goal to \"survive\" as long as possible. \n\nFirst I tried to choose the epsilon and alpha parameters as constants and experimented with various combinations. However, I always achieved only a very poor score (~ between 20 and 50 ticks). Then, again inspired by [@tuzzer](https://medium.com/@tuzzer/) I decided to introduce an adaptive learning- and exploration rate, which starts with a high value and decreases by time (with each training episode). Astonishingly, this made a huge difference. Suddenly, my algorithm converged in about ~ 200 steps. Since I never thought that these hyperparameters made such an extreme difference (from not solving the challenge at all to doing pretty well), this was probably the most interesting finding from my CartPole project. I simply adpoted [@tuzzer](https://medium.com/@tuzzer/)'s adaptive function, which is visualized in the figure below (the minimum of _0.1_ is a hyperparameter to be optimized).\n\n\n\n### Grid search\nAs my Q-Learning implementation with adaptive learning- and exploration rates was finished, I implemented an additional grid search to do some hyperparameter tuning. Goal was to find the optimal combination of feature interval lengths and lower bounds for alpha and epsilon. The following parameters turned out to perform best: `'buckets': (1, 1, 6, 12), 'min_alpha': 0.1, 'min_epsilon': 0.1`. Additionally, I also could have evaluated different functions for calculating the adaptive rate, but I haven't, yet. \n\n[>> Code on GitHub (qcartpole_gridsearch.py)](https://gist.github.com/n1try/87b442fce7f7d58606f462191c6d6033)\n\n## Result & Future Work\nMy final score was __188__, [as can be seen in the leaderboard](https://gym.openai.com/evaluations/eval_emRbuGdHRnWoJuMUnPwd1Q). As I progress with my knowledge on machine learning, while practicing for the upcoming [Machine Learning 2](http://www.aifb.kit.edu/web/Lehre/Vorlesung_Maschinelles_Lernen_2_%E2%80%93_Fortgeschrittene_Verfahren/en) exam, I want to continue improving my CartPole algorithm. Probably the next step will be to incorporate deep Q-Learning, which basically is Q-Learning with the only difference that the q-values are estimated by a deep neural net. The main (and probably only) advantage is the ability to handle way larger feature spaces. I'll keep you guys up-to-date. I hope that I could encourage you to get started with Gym, or machine learning in general, too!",
"json_metadata": "{\"tags\":[\"machine-learning\",\"ai\",\"technology\"],\"image\":[\"https://ferdinand-muetsch.de/images/cartpole1.jpg\",\"https://ferdinand-muetsch.de/images/cartpole2.png\",\"https://ferdinand-muetsch.de/images/cartpole3.png\",\"https://ferdinand-muetsch.de/images/cartpole4.png\"],\"links\":[\"https://gym.openai.com\",\"https://gym.openai.com/envs/CartPole-v0\",\"https://his.anthropomatik.kit.edu/english/28_315.php\",\"http://mnemstudio.org/path-finding-q-learning-tutorial.htm\",\"https://medium.com/@tuzzer/cart-pole-balancing-with-q-learning-b54c6068d947\",\"https://medium.com/@tuzzer\",\"https://gist.github.com/n1try/af0b8476ae4106ec098fea1dfe57f578\",\"https://medium.com/@tuzzer/\",\"https://gist.github.com/n1try/87b442fce7f7d58606f462191c6d6033\",\"https://gym.openai.com/evaluations/eval_emRbuGdHRnWoJuMUnPwd1Q\",\"http://www.aifb.kit.edu/web/Lehre/Vorlesung_Maschinelles_Lernen_2_%E2%80%93_Fortgeschrittene_Verfahren/en\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
}
]
}2018/01/23 20:55:54
2018/01/23 20:55:54
| fee | 0.500 STEEM |
| delegation | 29700.000000 VESTS |
| creator | steem |
| new account name | n1try |
| owner | {"weight_threshold":1,"account_auths":[],"key_auths":[["STM8PSsVWNxLLziP82axDX2LMXiUYisirf6q4REMxhnVNAZ7YKGPS",1]]} |
| active | {"weight_threshold":1,"account_auths":[],"key_auths":[["STM5aFuPECHN9MChTgSjz4Z4UvKEEuDu8ZmkGTQLiMWmGkBkx3UDS",1]]} |
| posting | {"weight_threshold":1,"account_auths":[],"key_auths":[["STM6hZWaNxoYsqMrCrWDCk3123jvfb4L769Q7JNNaAuqtBBZkdEy6",1]]} |
| memo key | STM7iap7HpfvtsWKEGQnDDpnwJPRQEwWxhEW3P5xVjQXUiz6eYVxL |
| json metadata | |
| extensions | [] |
| Transaction Info | Block #19239654/Trx e6a323b109d59e3048d1b29b17e768ea67ebf304 |
View Raw JSON Data
{
"trx_id": "e6a323b109d59e3048d1b29b17e768ea67ebf304",
"block": 19239654,
"trx_in_block": 47,
"op_in_trx": 0,
"virtual_op": 0,
"timestamp": "2018-01-23T20:55:54",
"op": [
"account_create_with_delegation",
{
"fee": "0.500 STEEM",
"delegation": "29700.000000 VESTS",
"creator": "steem",
"new_account_name": "n1try",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8PSsVWNxLLziP82axDX2LMXiUYisirf6q4REMxhnVNAZ7YKGPS",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM5aFuPECHN9MChTgSjz4Z4UvKEEuDu8ZmkGTQLiMWmGkBkx3UDS",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6hZWaNxoYsqMrCrWDCk3123jvfb4L769Q7JNNaAuqtBBZkdEy6",
1
]
]
},
"memo_key": "STM7iap7HpfvtsWKEGQnDDpnwJPRQEwWxhEW3P5xVjQXUiz6eYVxL",
"json_metadata": "",
"extensions": []
}
]
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779077682
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779077682
},
"rc_account": {
"account": "n1try",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779077682
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}Account Metadata
| POSTING JSON METADATA | |
| None | |
| JSON METADATA | |
| None |
{
"posting_json_metadata": {},
"json_metadata": {}
}Auth Keys
Owner
Single Signature
Public Keys
STM8PSsVWNxLLziP82axDX2LMXiUYisirf6q4REMxhnVNAZ7YKGPS1/1
Active
Single Signature
Public Keys
STM5aFuPECHN9MChTgSjz4Z4UvKEEuDu8ZmkGTQLiMWmGkBkx3UDS1/1
Posting
Single Signature
Public Keys
STM6hZWaNxoYsqMrCrWDCk3123jvfb4L769Q7JNNaAuqtBBZkdEy61/1
Memo
STM7iap7HpfvtsWKEGQnDDpnwJPRQEwWxhEW3P5xVjQXUiz6eYVxL
{
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8PSsVWNxLLziP82axDX2LMXiUYisirf6q4REMxhnVNAZ7YKGPS",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM5aFuPECHN9MChTgSjz4Z4UvKEEuDu8ZmkGTQLiMWmGkBkx3UDS",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6hZWaNxoYsqMrCrWDCk3123jvfb4L769Q7JNNaAuqtBBZkdEy6",
1
]
]
},
"memo": "STM7iap7HpfvtsWKEGQnDDpnwJPRQEwWxhEW3P5xVjQXUiz6eYVxL"
}Witness Votes
0 / 30
No active witness votes.
[]